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.

Comparando 2 valores de hash y devuelve False a pesar de ser iguales.

Cómo funciona el programa es que el usuario envía 2 entradas (userinput y passwordinput). Estas se comparan con el nombre de archivo de un archivo de texto (que es el nombre de usuario) y el contenido (que es la contraseña encriptada). La contraseña se encripta y se devuelve lo mismo que la contraseña original encriptada sin diferencias, sin embargo, cuando se compara con la declaración if devuelve False. Aquí está mi código:

import os
import hashlib

username = "coolcat"
password = "mi contraseña secreta!!"

result = hashlib.sha1(password.encode("utf-8"))

if not os.path.exists(f"{username}.txt"):
    open(f"{username}.txt", 'w').close()
with open(f"{username}.txt", "w") as file:
    file.write(str(result.digest()))

userinput = input("Por favor ingrese su nombre de usuario: ")
passwordinput = input("Por favor ingrese su contraseña: ")
resulte = hashlib.sha1(passwordinput.encode("utf-8"))
print(str(resulte.digest()))
try:
    with open(f"{userinput}.txt", "r") as file:
        hashed = file.read()
    print(hashed)

    if hashed == resulte.digest():
        print("Acceso concedido")
    if hashed != resulte.digest():
        print("¡Contraseña incorrecta!")
except FileNotFoundError:
    print("¡Nombre de usuario no encontrado!")
Tags:  ,

Answer

  1. Avatar for davy.ai

    Explicación del Código Python

    El código es una implementación simple de validación de contraseñas usando la biblioteca hashlib de Python. El programa funciona tomando dos entradas del usuario, userinput y passwordinput.

    El passwordinput se hashea utilizando el algoritmo SHA1 de la biblioteca hashlib, y el resultado se guarda en un archivo de texto (con el nombre de usuario como nombre de archivo).

    Cuando el usuario inicia sesión nuevamente, su passwordinput se hashea nuevamente, y el programa lo compara con la contraseña hasheada almacenada en el archivo de texto.

    Sin embargo, en esta implementación, la comparación if hashed == resulte.digest() devuelve False, incluso cuando los valores que se están comparando son los mismos. Esto se debe a que str(resulte.digest()) devuelve la contraseña hasheada como una cadena de bytes (precedida por b'), mientras que el valor leído del archivo de texto es una cadena regular.

    Para solucionar este problema, podemos convertir la cadena de bytes en una cadena regular utilizando el método decode() de las cadenas de bytes. La comparación corregida debería ser if hashed == resulte.digest().decode('utf-8'):

    A continuación se muestra el código corregido:

    import os
    import hashlib
    
    username = "coolcat"
    password = "mi contraseña secreta!!"
    
    result = hashlib.sha1(password.encode("utf-8"))
    
    if not os.path.exists(f"{username}.txt"):
        open(f"{username}.txt", 'w').close()
    with open(f"{username}.txt", "w") as file:
        file.write(str(result.digest()))
    
    userinput = input("Por favor, ingrese su nombre de usuario: ")
    passwordinput = input("Por favor, ingrese su contraseña: ")
    resulte = hashlib.sha1(passwordinput.encode("utf-8"))
    print(str(resulte.digest()))
    try:
        with open(f"{userinput}.txt", "r") as file:
            hashed = file.read()
        print(hashed)
    
        if hashed == resulte.digest().decode('utf-8'):
            print("Acceso concedido")
        if hashed != resulte.digest().decode('utf-8'):
            print("¡Contraseña incorrecta!")
    except FileNotFoundError:
        print("¡Nombre de usuario no encontrado!")
    

Comments are closed.