Nachdem ich verschiedene Ressourcen zur Kennwortstärke gelesen habe, versuche ich, einen Algorithmus zu erstellen, der eine grobe Schätzung der Entropie eines Kennworts liefert.
Ich versuche, einen möglichst umfassenden Algorithmus zu entwickeln. Zu diesem Zeitpunkt habe ich nur Pseudocode, aber der Algorithmus deckt Folgendes ab:
- Passwortlänge
- wiederholte Zeichen
- Muster (logisch)
- verschiedene Zeichenräume (LC, UC, Numeric, Special, Extended)
- Wörterbuchangriffe
Es deckt NICHT das Folgende ab und SOLLTE es GUT abdecken (wenn auch nicht perfekt):
- Bestellung (Passwörter können durch Ausgabe dieses Algorithmus streng geordnet werden)
- Muster (räumlich)
Kann jemand einen Einblick geben, wozu dieser Algorithmus schwach sein könnte? Kann sich jemand Situationen vorstellen, in denen die Eingabe eines Kennworts in den Algorithmus dessen Stärke überschätzen würde ? Unterschätzungen sind weniger ein Thema.
Der Algorithmus:
// the password to test
password = ?
length = length(password)
// unique character counts from password (duplicates discarded)
uqlca = number of unique lowercase alphabetic characters in password
uquca = number of uppercase alphabetic characters
uqd = number of unique digits
uqsp = number of unique special characters (anything with a key on the keyboard)
uqxc = number of unique special special characters (alt codes, extended-ascii stuff)
// algorithm parameters, total sizes of alphabet spaces
Nlca = total possible number of lowercase letters (26)
Nuca = total uppercase letters (26)
Nd = total digits (10)
Nsp = total special characters (32 or something)
Nxc = total extended ascii characters that dont fit into other categorys (idk, 50?)
// algorithm parameters, pw strength growth rates as percentages (per character)
flca = entropy growth factor for lowercase letters (.25 is probably a good value)
fuca = EGF for uppercase letters (.4 is probably good)
fd = EGF for digits (.4 is probably good)
fsp = EGF for special chars (.5 is probably good)
fxc = EGF for extended ascii chars (.75 is probably good)
// repetition factors. few unique letters == low factor, many unique == high
rflca = (1 - (1 - flca) ^ uqlca)
rfuca = (1 - (1 - fuca) ^ uquca)
rfd = (1 - (1 - fd ) ^ uqd )
rfsp = (1 - (1 - fsp ) ^ uqsp )
rfxc = (1 - (1 - fxc ) ^ uqxc )
// digit strengths
strength =
( rflca * Nlca +
rfuca * Nuca +
rfd * Nd +
rfsp * Nsp +
rfxc * Nxc ) ^ length
entropybits = log_base_2(strength)
Einige Eingaben und ihre gewünschten und tatsächlichen entropy_bits-Ausgaben:
INPUT DESIRED ACTUAL
aaa very pathetic 8.1
aaaaaaaaa pathetic 24.7
abcdefghi weak 31.2
H0ley$Mol3y_ strong 72.2
s^fU¬5ü;y34G< wtf 88.9
[a^36]* pathetic 97.2
[a^20]A[a^15]* strong 146.8
xkcd1** medium 79.3
xkcd2** wtf 160.5
* these 2 passwords use shortened notation, where [a^N] expands to N a's.
** xkcd1 = "Tr0ub4dor&3", xkcd2 = "correct horse battery staple"
Der Algorithmus erkennt (korrekt), dass durch Erhöhen der Alphabetgröße (sogar um eine Ziffer) lange Passwörter erheblich gestärkt werden, wie der Unterschied in entropy_bits für das 6. und 7. Passwort zeigt, die beide aus 36 a bestehen, das 21. a jedoch aus dem zweiten aktiviert. Sie berücksichtigen jedoch nicht die Tatsache, dass es keine gute Idee ist, ein Passwort von 36 a zu haben. Es kann leicht mit einem schwachen Passwort-Cracker gebrochen werden (und jeder, der zuschaut, wie Sie es eingeben, wird es sehen), und der Algorithmus spiegelt dies nicht wider .
Es spiegelt jedoch die Tatsache wider, dass xkcd1 im Vergleich zu xkcd2 ein schwaches Passwort ist, obwohl es eine höhere Komplexitätsdichte aufweist (ist das überhaupt eine Sache?).
Wie kann ich diesen Algorithmus verbessern?
Anhang 1
Wörterbuchangriffe und musterbasierte Angriffe scheinen die große Sache zu sein, also werde ich mich mit diesen beschäftigen.
Ich könnte eine umfassende Suche im Passwort nach Wörtern aus einer Wortliste durchführen und Wörter durch Token ersetzen, die für die Wörter, die sie darstellen, eindeutig sind. Word-Token werden dann als Zeichen behandelt und haben ein eigenes Gewichtungssystem. Sie fügen dem Kennwort ihre eigenen Gewichte hinzu. Ich brauche ein paar neue Algorithmusparameter (ich nenne sie lw, Nw ~ = 2 ^ 11, fw ~ = .5 und rfw) und würde das Gewicht wie jedes andere im Passwort berücksichtigen Gewichte.
Diese Wortsuche könnte speziell modifiziert werden, um sowohl Klein- und Großbuchstaben als auch häufige Zeichenersetzungen wie die von E mit 3 zu berücksichtigen. Wenn ich solchen übereinstimmenden Wörtern kein zusätzliches Gewicht hinzufügen würde, würde der Algorithmus ihre Stärke ein wenig unterschätzen oder zwei pro Wort, was in Ordnung ist. Andernfalls wäre es eine allgemeine Regel, dem Wort für jede nicht perfekte Zeichenübereinstimmung ein Bonusbit zu geben.
Ich könnte dann einfache Musterprüfungen durchführen, beispielsweise die Suche nach Serien wiederholter Zeichen und abgeleitete Tests (die Differenz zwischen den einzelnen Zeichen ermitteln), um Muster wie "aaaaa" und "12345" zu identifizieren und jedes erkannte Muster durch ein Muster zu ersetzen Token, einzigartig für das Muster und die Länge. Die algorithmischen Parameter (insbesondere die Entropie pro Muster) könnten im laufenden Betrieb auf der Grundlage des Musters erzeugt werden.
An diesem Punkt würde ich die Länge des Passworts nehmen. Jedes Wort- und Mustertoken zählt als ein Zeichen. Jedes Token würde die symbolisch dargestellten Zeichen ersetzen.
Ich habe mir eine Art Musternotation ausgedacht, die aber die Musterlänge l, die Musterreihenfolge o und das Basiselement b enthält. Diese Information könnte verwendet werden, um ein beliebiges Gewicht für jedes Muster zu berechnen. Ich würde etwas besseres im eigentlichen Code machen.
Modifiziertes Beispiel:
Password: 1234kitty$$$$$herpderp
Tokenized: 1 2 3 4 k i t t y $ $ $ $ $ h e r p d e r p
Words Filtered: 1 2 3 4 @W5783 $ $ $ $ $ @W9001 @W9002
Patterns Filtered: @P[l=4,o=1,b='1'] @W5783 @P[l=5,o=0,b='$'] @W9001 @W9002
Breakdown: 3 small, unique words and 2 patterns
Entropy: about 45 bits, as per modified algorithm
Password: correcthorsebatterystaple
Tokenized: c o r r e c t h o r s e b a t t e r y s t a p l e
Words Filtered: @W6783 @W7923 @W1535 @W2285
Breakdown: 4 small, unique words and no patterns
Entropy: 43 bits, as per modified algorithm
Die genaue Semantik, wie Entropie aus Mustern berechnet wird, steht zur Diskussion. Ich dachte etwas wie:
entropy(b) * l * (o + 1) // o will be either zero or one
Der modifizierte Algorithmus würde Fehler in der ursprünglichen Tabelle finden und die Stärke jedes Kennworts verringern, mit Ausnahme von s^fU¬5ü;y34G<
, das keine Wörter oder Muster enthält.