Comprobación de la seguridad de una contraseña (cómo comprobar las condiciones)

Estoy intentando crear un sistema que requiere que ingreses una contraseña. Si todo es inferior, superior o num, entonces la impresión es débil, si se trata de dos de las condiciones, entonces es med y si se han cumplido todas, es fuerte. Simplemente no parece funcionar.

El trabajo débil y fuerte, sin embargo, el medio no lo hace.

No sé dónde me he equivocado.

def password(): print ('enter password') print () print () print ('the password must be at least 6, and no more than 12 characters long') print () password = input ('type your password ....') weak = 'weak' med = 'medium' strong = 'strong' if len(password) >12: print ('password is too long It must be between 6 and 12 characters') elif len(password) =6 and len(password) <= 12: print ('password ok') if password.lower()== password or password.upper()==password or password.isalnum()==password: print ('password is', weak) elif password.lower()== password and password.upper()==password or password.isalnum()==password: print ('password is', med) else: password.lower()== password and password.upper()==password and password.isalnum()==password print ('password is', strong) 

Hola
El mejor enfoque es usar la búsqueda de expresiones regulares
Aquí está la función que estoy usando actualmente

 def password_check(password): """ Verify the strength of 'password' Returns a dict indicating the wrong criteria A password is considered strong if: 8 characters length or more 1 digit or more 1 symbol or more 1 uppercase letter or more 1 lowercase letter or more """ # calculating the length length_error = len(password) < 8 # searching for digits digit_error = re.search(r"\d", password) is None # searching for uppercase uppercase_error = re.search(r"[AZ]", password) is None # searching for lowercase lowercase_error = re.search(r"[az]", password) is None # searching for symbols symbol_error = re.search(r"[ !#$%&'()*+,-./[\\\]^_`{|}~"+r'"]', password) is None # overall result password_ok = not ( length_error or digit_error or uppercase_error or lowercase_error or symbol_error ) return { 'password_ok' : password_ok, 'length_error' : length_error, 'digit_error' : digit_error, 'uppercase_error' : uppercase_error, 'lowercase_error' : lowercase_error, 'symbol_error' : symbol_error, } 

EDITAR:
A continuación una sugerencia de Lukasz aquí es una actualización de la verificación de la condición del símbolo especial

 symbol_error = re.search(r"\W", password) is None 

password.isalnum() devuelve un valor booleano, por lo que password.isalnum()==password siempre será False .

Simplemente omita la parte de ==password :

 if password.lower()== password or password.upper()==password or password.isalnum(): # ... 

A continuación, nunca puede ser tanto superior como inferior, o bien todos los números superiores o inferiores o todos los números inferiores y todos, por lo que la segunda condición (medio) es imposible. ¿Quizás deberías buscar la presencia de mayúsculas, minúsculas y dígitos?

Sin embargo, primero otro problema a tratar. Está probando si la contraseña es alfanumérica , que consiste solo en caracteres y / o números. Si solo quieres probar números, usa .isdigit() .

Es posible que desee familiarizarse con los métodos de cadena . Hay .islower() prácticos disponibles para .islower() y .isupper() que tal vez quiera probar, por ejemplo:

 >>> 'abc'.islower() True >>> 'abc123'.islower() True >>> 'Abc123'.islower() False >>> 'ABC'.isupper() True >>> 'ABC123'.isupper() True >>> 'Abc123'.isupper() False 

Estos son más rápidos y menos detallados que al usar password.upper() == password , lo siguiente probará lo mismo:

 if password.isupper() or password.islower() or password.isdigit(): # very weak indeed 

El siguiente truco que quieres aprender es recorrer una cadena, para que puedas probar caracteres individuales:

 >>> [c.isdigit() for c in 'abc123'] [False, False, False, True, True, True] 

Si combinas eso con la función any() , puedes probar si hay algunos caracteres que son números:

 >>> any(c.isdigit() for c in 'abc123') True >>> any(c.isdigit() for c in 'abc') False 

Creo que encontrarás esos trucos a la mano cuando pruebes las fortalezas de las contraseñas.

Aquí hay una nueva versión de lo que escribiste:

 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'[AZ]', password): password_strength['has_upper'] = True if re.search(r'[az]', password): password_strength['has_lower'] = True if re.search(r'[0-9]', password): password_strength['has_num'] = True score = len([b for b in password_strength.values() if b]) print ('Password is %s' % password_scores[score]) 

Salida (muestra):

 >>> password() Enter a password The password must be between 6 and 12 characters. Password: ... ghgG234 Password is Strong 

También estaba buscando alguna función para examinar la fortaleza de la contraseña, y encontré muchas sugerencias a medio hacer. Monté mi propia función basada en unas.

espero ayudar

 def get_pw_strength( pw ): s_lc = set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z']) s_uc = set(['A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'Q', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Y', 'X', 'Z']) s_dg = set(['1', '0', '3', '2', '5', '4', '7', '6', '9', '8']) s_sp = set(['+', ',', '.', '-', '?', ':', '_', '(', ')', '*', '/', ';', '+', '!']) pw_s = 0 pw_steps = (5, 8, 12) pw_l = len(pw) if ( pw_l < 4 ): return 0 for l in pw_steps : if ( pw_l > l ): pw_s += 1 #print "length over ", l," giving point", pw_s c_lc = c_uc = c_dg = c_sp = 0 for c in pw : if ( c in s_lc ) : c_lc += 1 if ( c in s_uc ) : c_uc += 1 if ( c in s_dg ) : c_dg += 1 if ( c in s_sp ) : c_sp += 1 if ( c_lc + c_uc + c_dg + c_sp <> pw_l ): #print c_lc, c_uc, c_dg, c_sp, pw_l #raise Exception "Forbidden chracter" return -1 charset = 0 if ( c_lc ) : pw_s += 1 charset = len(s_lc) if ( c_uc ) : pw_s += 1 charset = len(s_uc) if ( c_dg ) : pw_s += 1 charset = len(s_dg) if ( c_sp ) : pw_s += 2 charset = len(s_sp) entropy = log(pow(charset,pw_l),2) return pw_s, entropy