Come posso stimare l'entropia di una password?


14

Dopo aver letto varie risorse sulla sicurezza delle password, sto cercando di creare un algoritmo che fornirà una stima approssimativa di quanta entropia ha una password.

Sto cercando di creare un algoritmo il più completo possibile. A questo punto ho solo pseudocodice, ma l'algoritmo copre quanto segue:

  • lunghezza della password
  • personaggi ripetuti
  • modelli (logici)
  • spazi caratteri diversi (LC, UC, Numerico, Speciale, Esteso)
  • attacchi al dizionario

NON copre quanto segue e DOVREBBE coprirlo BENE (anche se non perfettamente):

  • ordinamento (le password possono essere ordinate rigorosamente dall'output di questo algoritmo)
  • modelli (spaziali)

Qualcuno può fornire qualche idea su cosa potrebbe essere debole questo algoritmo? In particolare, qualcuno può pensare a situazioni in cui fornire una password all'algoritmo ne sopravvaluterebbe la forza? Le sottostime sono meno problematiche.

L'algoritmo:

// 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)

Alcuni input e output entropy_bits desiderati ed effettivi:

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"

L'algoritmo si rende conto (correttamente) che l'aumento della dimensione dell'alfabeto (anche di una cifra) rafforza notevolmente le password lunghe, come mostrato dalla differenza in entropy_bits per le password 6a e 7a, che sono entrambe costituite da 36 a, ma la 21a a seconda è capitalizzati. Tuttavia, non tengono conto del fatto che avere una password di 36 a non è una buona idea, si rompe facilmente con un cracker di password debole (e chiunque ti guardi mentre lo digita lo vedrà) e l'algoritmo non riflette che .

Tuttavia, riflette il fatto che xkcd1 è una password debole rispetto a xkcd2, nonostante abbia una maggiore densità di complessità (è anche una cosa?).

Come posso migliorare questo algoritmo?

Addendum 1

Gli attacchi a dizionario e gli attacchi basati su schemi sembrano essere la cosa più importante, quindi mi prenderò cura di affrontarli.

Potrei eseguire una ricerca completa attraverso la password per le parole da un elenco di parole e sostituire le parole con token unici per le parole che rappresentano. I token di parole verrebbero quindi trattati come caratteri e dotati di un proprio sistema di pesi e aggiungere i propri pesi alla password. Avrei bisogno di alcuni nuovi parametri dell'algoritmo (li chiamerò lw, Nw ~ = 2 ^ 11, fw ~ = .5 e rfw) e calcolerei il peso nella password come farei con qualsiasi altro pesi.

Questa ricerca di parole potrebbe essere appositamente modificata per abbinare sia lettere minuscole che maiuscole e sostituzioni di caratteri comuni, come quella di E con 3. Se non aggiungessi maggior peso a tali parole abbinate, l'algoritmo ne sottovaluterebbe un po 'la forza o due per parola, il che è OK. Altrimenti, una regola generale sarebbe, per ogni partita non perfetta del personaggio, dare alla parola un po 'di bonus.

Potrei quindi eseguire semplici controlli del modello, come ricerche di esecuzioni di caratteri ripetuti e test derivati ​​(prendere la differenza tra ciascun carattere), che identificherebbe modelli come "aaaaa" e "12345" e sostituire ogni modello rilevato con un modello token, unico per il modello e la lunghezza. I parametri algoritmici (in particolare, entropia per modello) potrebbero essere generati al volo in base al modello.

A questo punto, prenderei la lunghezza della password. Ogni token di parola e token modello conterebbe come un carattere; ogni token sostituirà i caratteri che rappresentano simbolicamente.

Ho creato una sorta di notazione del motivo, ma include la lunghezza del motivo l, l'ordine del motivo oe l'elemento base b. Queste informazioni potrebbero essere utilizzate per calcolare un peso arbitrario per ciascun modello. Farei qualcosa di meglio nel codice reale.

Esempio modificato:

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

La semantica esatta di come l'entropia viene calcolata da schemi è in discussione. Stavo pensando a qualcosa del tipo:

entropy(b) * l * (o + 1) // o will be either zero or one

L'algoritmo modificato troverebbe difetti con e ridurrebbe la forza di ogni password nella tabella originale, ad eccezione di s^fU¬5ü;y34G<, che non contiene parole o schemi.


2
Hai visto tech.dropbox.com/?p=165 ? Potrebbe darti alcune idee. C'è una demo su dl.dropbox.com/u/209/zxcvbn/test/index.html e il codice è su github.


un'opzione potrebbe essere quella di eseguirli attraverso un algoritmo di compressione e vedere come si comprimono, l'unica cosa qui è che la maggior parte degli algoritmi di compressione sono progettati per funzionare con grandi quantità di dati e ne hai bisogno per piccole quantità di dati
jk.

1
@mouviciel: ti ho battuto sul pugno. Leggi la prima riga: D
Wug,

@Wug - Fantastico! Non ho seguito il link: non potevo immaginare che varie risorse coprissero quel tipo di studi!
mouviciel,

Risposte:


9

L'Appendice A a pagina 46 di NIST SP 800-63 parla del lavoro di Claude Shannon , che stima l'entropia della password usando un numero di bit. In effetti, questo è il documento che il fumetto XKCD utilizza per calcolare i bit di entropia. In particolare:

  • l'entropia del primo carattere è considerata di 4 bit;
  • l'entropia dei successivi 7 caratteri sono 2 bit per carattere; ciò è approssimativamente coerente con la stima di Shannon secondo cui "quando si considerano effetti statistici che non superano più di 8 lettere, l'entropia è di circa 2,3 bit per carattere;"
  • per il 9 ° al 20 ° carattere si considera che l'entropia sia di 1,5 bit per carattere;
  • per i caratteri 21 e superiori, l'entropia è considerata pari a 1 bit per carattere;
  • Un "bonus" di 6 bit di entropia viene assegnato per una regola di composizione che richiede caratteri sia maiuscoli che non alfabetici. Ciò impone l'uso di questi caratteri, ma in molti casi questi caratteri si verificano solo all'inizio o alla fine della password e riduce in qualche modo lo spazio di ricerca totale, quindi il vantaggio è probabilmente modesto e quasi indipendente dalla lunghezza del parola d'ordine;
  • Un bonus fino a 6 bit di entropia viene aggiunto per un controllo approfondito del dizionario. Se l'aggressore conosce il dizionario, può evitare di testare quelle password e, in ogni caso, sarà in grado di indovinare gran parte del dizionario, che sarà, tuttavia, la password più probabile selezionata in assenza di una regola del dizionario. Il presupposto è che la maggior parte dei vantaggi dell'entropia di indovinare per un test di dizionario si accumulano in password relativamente brevi, poiché qualsiasi password lunga che può essere ricordata deve necessariamente essere una "passphrase" composta da parole del dizionario, quindi il bonus scende a zero a 20 personaggi.

L'idea è che un sistema di autenticazione selezionerebbe determinati livelli di entropia come soglie. Ad esempio, 10 bit possono essere deboli, 20 medi e 30 forti (numeri scelti arbitrariamente come esempio, non come raccomandazione). Sfortunatamente, il documento non raccomanda tali soglie, probabilmente perché la potenza computazionale disponibile per la forza bruta o per indovinare le password aumenta nel tempo:

In alternativa all'imposizione di un insieme arbitrario di regole specifiche, un sistema di autenticazione potrebbe classificare le password degli utenti, utilizzando le regole sopra indicate, e accettare quelle che soddisfano alcuni standard minimi di entropia. Ad esempio, supponiamo che fossero necessarie password con almeno 24 bit di entropia. Possiamo calcolare la stima entropica di "IamtheCapitanofthePina4" osservando che la stringa ha 23 caratteri e soddisferebbe una regola di composizione che richiede caratteri maiuscoli e non alfabetici.

Questo potrebbe essere o non essere quello che stai cercando, ma non è un cattivo punto di riferimento, se non altro.

[Modifica: aggiunto quanto segue.]

L'articolo Testing Metrics for Policy per la creazione di password attaccando grandi serie di password rivelate (di Matt Weir, Sudhir Aggarwal, Michael Collins ed Henry Stern) ha dimostrato che il modello Shannon, sopra descritto, non è un modello accurato di entropia per le password generate dall'uomo. Consiglio di consultare la "Sezione 5 Generazione di nuove politiche per la creazione di password" per proposte più precise.


3
l'articolo di Wikipedia sulla forza della password afferma che queste regole non sono state ritenute accurate per le password generate dall'uomo.
Ryathal,

1
True ( goo.gl/YxRk per una lettura interessante).
Akton,

C'è un avvertimento a questo ovviamente. Può essere abbastanza accurato per le password statisticamente tipiche, che tendono a seguire determinate regole perché le persone sono persone. Queste linee guida non terranno conto del fatto che le password generate casualmente supereranno di gran lunga quelle generate dall'uomo a lunghezze tipiche perché (probabilmente) non conterranno schemi o parole.
Wug

4

Controlla il codice sorgente per KeePass nella parte inferiore di questa pagina . La QualityEstimationclasse implementa un algoritmo piuttosto carino che sembra essere in linea con ciò che stai cercando di avere in atto. I miei risultati sembrano tali:

aaa                              8
aaaaaaaaa                        9
abcdefghi                       18
H0ley$Mol3y_                    73
s^fU¬5ü;y34G<                   99
[a^36]*                         10
[a^20]A[a^15]*                  18
Tr0ub4dor&3                     66
correct horse battery staple    98

Calcola l'entropia o qualche altra metrica, come forse il bogofitness? Inoltre ti sei ricordato di espandere [a ^ 36] in "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" giusto?
Wug

Ehm, no, ho copiato quelle stringhe alla lettera :( Ho pensato totalmente che fosse un ottimo uso di caratteri speciali, non una regex a prima vista. Ci proverò di nuovo e lo aggiornerò. In secondo luogo, calcola bit di entropia, sì .
Jesse C. affettatrice

1
Non era tanto un'espressione regolare quanto una strana notazione che usavo per evitare di rinforzare il mio tavolo di 25 caratteri
Wug,

2
Ho dovuto fare +1 su quel commento per "enfatten". Sembra una parola perfettamente cromulenta per questa situazione.
Jesse C. Slicer,

1
In realtà è scritto "KeePass", anziché "KeyPass". (Farei solo una modifica da solo, ma devono essere più di 6 caratteri ...)
Ian Dunn,

1

Tu chiedi

In particolare, qualcuno può pensare a situazioni in cui fornire una password all'algoritmo ne sopravvaluterebbe la forza?

Ma hai un esempio nella domanda. In base alla progettazione, xkcd2 ha ~ 44 bit di entropia, ma la tua stima è di 160,5 bit.


Quindi, generalizzando, l'algoritmo si interrompe quando si considerano le parole o le combinazioni di caratteri che sono considerevolmente più probabili da usare rispetto ad altri. Sottolineerò anche che l'esempio canonico xkcd non include spazi e il mio calcolo l'ha fatto.
Wug

@Wug, questa è una buona generalizzazione. È qualcosa che viene affrontato da zxcvbn, che è menzionato nel primo commento su questa domanda.
Peter Taylor,

1

Qualcuno può fornire qualche idea su cosa potrebbe essere debole questo algoritmo? In particolare, qualcuno può pensare a situazioni in cui fornire una password all'algoritmo ne sopravvaluterebbe la forza?

Ne hai accennato alcuni nel preambolo (attacchi del dizionario, ecc.). In sostanza, ci sono un certo numero di pratiche comuni che possono essere indovinate dall'attaccante che riducono notevolmente lo spazio di ricerca. Sono abbastanza sicuro che il tuo algoritmo "sopravvaluterà" quanto segue:

  • ovunque
  • Ovunque
  • Everywhere1

La password è piuttosto lunga, ma è banalmente crackabile dal momento che la parola originale appare in un dizionario di base e le modifiche sono considerate abbastanza comuni da far parte di qualsiasi attacco di dizionario decente. Anche le tipiche conversioni di lettere -> numeri (cioè 3v3rywh3r3) dovrebbero essere considerate piuttosto deboli e dovresti penalizzarle.

In misura molto minore, altre password problematiche possono essere quelle che hanno schemi evidenti, come:

  • ABCDEFGHIJKLMNOP
  • abcde12345

Sebbene questi abbiano probabilmente meno probabilità di essere presi di mira in attacchi con dizionari reali, soffrono di problemi simili al tuo esempio "aaaaa ...".

Non sono sicuro che le frasi con password siano attualmente prese di mira nella maggior parte degli attacchi del dizionario, ma senza dubbio man mano che guadagnano popolarità, saranno prese di mira sempre di più. Penso che il famoso esempio di xkcd ne tenga conto, dato che a ogni "parola comune" sono assegnati solo 11 bit. Il tuo algoritmo sopravvaluta anche questi tipi di password.

Quindi, per riassumere, l'algoritmo fa un buon lavoro di stima, ma dovrebbe davvero prendere in considerazione la struttura della password e schemi comuni e noti.


Un livello di controllo dei derivati ​​identificherà tutti questi modelli.
Wug
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.