Sichere und zufällige Kennwörter mit der Powershell

Die digitale Welt wird überzogen von Hacker Angriffen. Früher hatte man über die abstrake Gefahr eines Cyber Angriffs diskutiert - inzwischen trifft es leider immer häufiger deutsche Firmen. Egal, wieviele Sicherheitsvorkehrungen getroffen wurden - ein Rest-Risiko bleibt immer.

Bei der komplexen Wiederinbetriebnahme der IT Infrastruktur kommt auch immer das Thema Kennwörter hoch.
Jedes Passwort eines AD-Objekts (egal ob Benutzer oder Computer) muss als potentiell kompromittiert gelten und neu gesetzt werden.

Die Aufgabe lautet also: Wie kann ich automatisiert mit der PowerShell starke, sichere und zufällige Kennwörter erzeugen?

Starke und sichere Kennwörter

Eine starkes und sicheres Kennwort sollte alle Möglichkeiten der Zeichensätze nutzen

  • kleine Buchstaben
  • große Buchstaben
  • Zahlen
  • Sonderzeichen

Außerdem muss das Kennwort eine Mindestlänge haben, sodass eine Brut-Force Attacke erfolglos ist. Als hinreichend sicher gelten mindestens 13 Zeichen.

Beliebige Sonderzeichen quälen aber den Endanwender. Wer schon einmal den kleinen runden Kreis (das Symbol für Grad Celsius) in seinem Kennwort hatte, der weiß wovon ich spreche. Und die Kollegen neigen dann dazu, kleine Post-It Zettel an den Monitor zu kleben.

Deswegen kann es sinnvoll sein, nur eine kleinere Untermenge von Sonderzeichen zu nehmen - und dafür das Kennwort selber ein Zeichen länger zu wählen

Anzahl der Möglichkeiten

Das Ganze mathematisch ausgerechnet:

Wir nehmen
26 Großbuchstaben
26 Kleine Buchstaben
10 Zahlen
20 Sonderzeichen

Das sind sind in der Summe 82 mögliche Zeichen

Bei einem 13 Zeichen Kennwort wären das (82*82*82*82*82*82*82*82*82*82*82*82*82) = 8213 = ca. 7,6 * 1024 Möglichkeiten

Wir nehmen
26 Großbuchstabem
26 Kleine Buchstaben
10 Zahlen
und nur 6 leicht tippbare Sonderzeichen

Das sind sind in der Summe nur 68 mögliche Zeichen

Bei einem 14 Zeichen Kennwort wären das trotzdem (68*68*68*68*68*68*68*68*68*68*68*68*68*68) = 6814 = ca. 4,6 * 1025 Möglichkeiten

Ergo: trotz der reduzierten Anzahl von Sonderzeichen ist das Kennwort schwerer zu knacken

Die Funktion RandomPasswords

Nun zum Script: Aus einer ASCII-Tabelle (ist tausendfach im Netz auffindbar) holen wir uns die Dezimal-Werte zu den Zeichen
Große Buchstaben: 65 - 90
Kleine Buchstaben: 97 - 122
Zahlen: 48 - 57
einfache Sonderzeichen: 33,35,43,44,45,46 (! # + , - .)

Zeichen in der PowerShell sind vom Dateityp CHAR

So erzeuge ich ein einzelnes Zeichen, z.B. den Buchstaben A (=ASCII Wert 65)
[CHAR]65

So erzeuge ich eine Liste von Zeichen, z.B. alle großen Buchstaben (=ASCII Werte 65 bis 90)
[char[]](65..90)

So wähle ich zufällig ein Zeichen aus der Zeichenliste aus, z.B. ein Zeichen aus allen großen Buchstaben
Get-Random -inputObject ([char[]](65..90)) -count 1

Und jetzt zum Script bzw. zur Funktion.

Ohne extra Parameter wird ein 14 Zeichen Kennwort erzeugt

RandomPasswords

njnfSoU.j+,4pS

Mit dem Parameter -Characters können Kennwörter zwischen 5 und 64 Zeichen Länge erzeugt werden

RandomPasswords -Characters 20

y8XhqedYz8C.L9EcL+H4

Damit jede Zeichenart sicher mindestens einmal vorkommt, wird am Anfang ($pwstart) von jeder Art ein Zeichen zufällig ausgewählt.

Danach werden die restlichen Zeichen zufällig aus allen möglichen Zeichen erzeugt ($pwrest)

Und am Ende werden noch einmal alle bisher erzeugten Zeichen zufällig durchgemixt ($passwordmixed)

Der Code

Hier die fertige Funktion. Sie kann in beliebige Powershell Skripte eingefügt werden.

function RandomPasswords
{
# Zwischen 6 und 64 Zeichen, Standard sind 14 Zeichen
param (
[ValidateRange(5, 64)][int] [INT]$Characters = 14
)
# Mögliche Zeichen
$digitcapital = [char[]](65..90)
$digitsmall = [char[]](97..122)
$numbers = [char[]](48..57)
$special = [char[]](33,35,43,44,45,46)
$pwstart = (Get-Random -inputObject $digitcapital -count 1) + (Get-Random -inputObject $digitsmall -count 1) + (Get-Random -inputObject $numbers -count 1) + (Get-Random -inputObject $special -count 1)
$pwrest = Foreach ($i in (0..($characters-5))) {Get-Random -inputObject ($digitcapital + $digitsmall + $numbers + $special) -count 1}
$pwrest = $pwrest -join ""
$passwordmixed = Get-Random -inputobject ([char[]]($pwstart + $pwrest)) -count $characters
$password = $passwordmixed -join ""
Return $password
}

3 Kommentare

Was denken Sie?