Esiste un modo più semplice per verificare il livello elevato di password?

0

Quindi ho scoperto questo codice seguente utilizzato per verificare il livello elevato di password. Ero un po 'confuso riguardo alla parte: score = len([x for x in password_strength.values() if x]) So che è stato usato per contare il valore apparso in 'password', ma la sintassi è strana per me. E mi chiedo se questo è il modo più semplice.

#!/usr/bin/python
import re



def password():
    print ('Enter a password\n\nThe password must be between 6 and 12 characters.\n')

    while True:
        password = input('Password: ... ')
        if 6 <= len(password) < 12:
            break
        print ('The password must be between 6 and 12 characters.\n')

    password_scores = {0:'Horrible', 1:'Weak', 2:'Medium', 3:'Strong'}
    password_strength = dict.fromkeys(['has_upper', 'has_lower', 'has_num'], False)
    if re.search(r'[A-Z]', password):
        password_strength['has_upper'] = True
    if re.search(r'[a-z]', password):
        password_strength['has_lower'] = True
    if re.search(r'[0-9]', password):
        password_strength['has_num'] = True

    score = len([x for x in password_strength.values() if x])

    print ('Password is %s' % password_scores[score])
password()
    
posta The One 21.04.2016 - 10:57
fonte

1 risposta

5

La stima della forza della password non è un problema semplice. È necessario riconoscere i modelli comuni che gli umani amano usare nelle password (parole, schemi di tastiera, ecc.). Ad esempio lo stimatore di dropbox zxcvbn è abbastanza avanzato. Dovresti prendere in considerazione l'utilizzo di una libreria di stimatori esistente.

Come semplice approssimazione consiglierei:

Base-2-Logarithm(distinct-characters-in-password + 1) * password-length
  • Base-2-Logarithm(alphabet-size) * password-length calcola l'entropia shannon di una password in bit, assumendo che ciascun carattere sia scelto indipendentemente da un insieme di dimensioni alphabet-size con uguale probabilità.
  • Uso il numero di caratteri distinti nella password più uno come approssimazione per il set di caratteri scelto dall'utente. Il + 1 garantisce che il logaritmo non restituisca -infinity quando si lavora su una password vuota.
  • Puoi assegnare alcuni punti bonus a alphabet-size per scegliere personaggi di classi di caratteri diverse (maiuscole, minuscole, cifre, altro), ma probabilmente non ne vale la pena.

Questo algoritmo ha la proprietà che la lunghezza della password è più importante per la sicurezza della password e l'aumento della dimensione dell'alfabeto mostra rendimenti decrescenti dopo un certo punto. Non è certo perfetto (ad esempio abcdefghijklmnopqrstuvwxyz è considerato molto strong), ma probabilmente è buono come una semplice formula.

Scegli diverse soglie per il nome della forza, a seconda della limitazione della velocità, dell'algoritmo di hash e dei requisiti di sicurezza. Ad esempio puoi usare:

0 - 14 = > orribile
15 - 29 = >
deboli 30 - 49 = > media
50 + = > strong

Codice C #:

alphabetSize = 1 + password.Distinct().Count(); 
strength = Math.Log(alphabetSize, 2) * Password.Length;

Codice Python:

alphabetSize = len(set(password)) + 1
strength = math.log2(alphabetSize) * len(password)
    
risposta data 21.04.2016 - 11:20
fonte

Leggi altre domande sui tag