es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de verificar la validez de una contraseña solo si se cumplen 3 de 4 condiciones?

Tengo que crear un programa para verificar la validez de una contraseña.
Las condiciones son: al menos 8 caracteres, 1 letra mayúscula, 1 letra minúscula, 1 número dentro del rango 0-9, 1 símbolo.
Si se cumplen 3/4 de las condiciones (excluyendo la longitud de la contraseña, ya que siempre debe ser mayor a 8 caracteres), el programa deberá verificar la fortaleza de la contraseña.
Si la longitud de la contraseña es de exactamente 8 caracteres, la fortaleza será igual a 1. Por cada 4 caracteres adicionales, la fortaleza aumentará en 1.
En caso de cumplirse todas las condiciones, la fortaleza deberá duplicarse.

En el código a continuación, escribí una línea de código enorme, pero creo que tengo un error y que hay una forma mucho más rápida de hacerlo.
Así que te pregunto si hay una forma más rápida de hacerlo o no. Si la hay, ¿cuál sería?

def is_valid_password():
    pwd=input("Introduce una contraseña: ")
    f=1
    l=0
    u=0
    d=0
    s=0
    p=0
    if(len(pwd)>=8):
        for i in pwd:
            if i.islower():
                l+=1
            if i.isupper():
                u+=1
            if i.isdigit():
                d+=1
            if(i=='!' or i=='@' or i=='#' or i=='$' or i=='&' or i=='_'):
                s+=1
    if((l+u+d+s)==len(pwd) and l==0 and u>=1 and d>=1 and s>=1) or ((l+u+d+s)==len(pwd) and l>=1 and u==0 and d>=1 and s>=1) or ((l+u+d+s)==len(pwd) and l>=1 and u>=1 and d==0 and s>=1) or ((l+u+d+s)==len(pwd) and l>=1 and u>=1 and d>=1 and s==0) or ((l+u+d+s)==len(pwd) and l>=1 and u>=1 and d>=1 and s>=1):
        if((l+u+d+s)==len(pwd) and l>=1 and u>=1 and d>=1 and s>=1):
            if(len(pwd)>12):
                f=(f+(len(pwd)-8)//4)*2
            elif(len(pwd)>=9 and len(pwd)<=12):
                f=4
            elif(len(pwd)==8):
                f=2
            print(f"Contraseña válida con una fortaleza de {f}")
        else:
            if(len(pwd)>12):
                f=f+(len(pwd)-8)//4
            elif(len(pwd)>=9 and len(pwd)<=12):
                f=2
            elif(len(pwd)==8):
                f=1
            print(f"Contraseña válida con una fortaleza de {f}")
    else:
        print("¡Contraseña inválida!")

while True:
    is_valid_password()

Espero que esto sea de ayuda para tu proyecto. ¡Buena suerte!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma más simple y eficiente de verificar la validez de una contraseña. Puede utilizar expresiones regulares para comparar la contraseña con el patrón especificado. Aquí hay un ejemplo de código que utiliza expresiones regulares:

    import re
    
    def is_valid_password():
        pwd = input("Ingrese una contraseña: ")
    
        # definir el patrón a comparar
        pattern = r"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$&*_]).{8,}$"
    
        if re.match(pattern, pwd):
            strength = 1 + (len(pwd) - 8) // 4  # calcular la fortaleza basada en la longitud de la contraseña
            if re.match(r"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$&*_]).+$", pwd):
                strength *= 2  # duplicar la fortaleza si se cumplen todas las condiciones
            print(f"Contraseña válida con fortaleza {strength}")
        else:
            print("¡Contraseña inválida!")
    
    while True:
        is_valid_password()
    

    En este código, primero definimos el patrón de la expresión regular para comparar con la contraseña. Este patrón especifica que la contraseña debe contener al menos un dígito (\d), una letra minúscula ([a-z]), una letra mayúscula ([A-Z]), un símbolo de la lista !@#$&*_ ([!@#$&*_]), y debe tener al menos 8 caracteres de longitud (.{8,}). Los anclajes ^ y $ indican que el patrón debe coincidir con toda la cadena de la contraseña.

    Luego utilizamos la función re.match() para verificar si la contraseña coincide con el patrón. Si coincide, calculamos la fortaleza de la contraseña basándonos en su longitud, utilizando la misma fórmula que en el código original. Si se cumplen todas las condiciones (es decir, la contraseña coincide con un patrón con al menos un símbolo), duplicamos la fortaleza. Finalmente, imprimimos el resultado.

    Este código es más conciso y más fácil de leer que el código original. También evita la necesidad de largas declaraciones if/else para verificar las diversas condiciones.

Comments are closed.