Search code examples
pythonhashhashlib

Hashed identical strings aren't the same when hashed twice


I have a login program that hashes a string and stores it in a file to create a new account. When I need to log in, the login detail strings get hashed, and the program checks if the hashed strings have a match in the file. The program works without hashing, but when I hash the identical login details, the hash values are not the same. I have checked and the strings are exactly the same. Here is my code:

import tkinter
import math
import os
import hashlib

# The login function #
def login(username, password, file_path):
    file_new = open(file_path, "a")
    file_new.close()

    file = open(file_path, "r")
    file_content = file.read()
    print(file_content)
    file.close()

    hashed_username = hashlib.md5(bytes(username, "utf-8"))
    hashed_password = hashlib.md5(bytes(password, "utf-8"))
    print(f"Hashed username: {hashed_username}, hashed password: {hashed_password}")

    if f"{hashed_username},{hashed_password}" in file_content[:]:
        return "You were logged in successfully"
    else:
        return "We could not find your account. Please check your spelling and try again."

# The account creation function #
def newaccount(username, password, file_path):
    file_new = open(file_path, "a")
    file_new.close()

    # Reading the file #
    file = open(file_path, "r")
    file_content = file.read()
    print(file_content)
    file.close()

    # Hashing the account details #
    hashed_username = hashlib.md5(bytes(username, "utf-8"))
    hashed_password = hashlib.md5(bytes(password, "utf-8"))
    print(f"Hashed username: {hashed_username}, hashed password: {hashed_password}")
    
    file_append = open(file_path, "a")

    # Checking to see if the details exist in the file #
    if f"{hashed_username},{hashed_password}" in file_content[:]:
        file_append.close()
        return "You already have an account, and were logged in successfully"
    else:
        # Writing the hashed details to the file #
        file_append.write(f"{hashed_username},{hashed_password}\n")
        file_append.close()
        return "New account created."        

logins_path = "Random Scripts\Login Program\logins.txt"

signin_message = input("Would you like to: \n1. Create an account \nor \n2. Log in\n")
if signin_message == "1":
    print("User chose to create account")
    newacc_username = input("Input a username: ")
    newacc_password = input("Input a password: ")
    print(newaccount(newacc_username, newacc_password, logins_path))
elif signin_message == "2":
    print("User chose to log in")
    username = input("Input your username: ")
    password = input("Input your password: ")
    print(login(username, password,logins_path))
else:
    print("Please enter 1 or 2")


Solution

  • hashed_username = hashlib.md5(bytes(username, "utf-8"))
    

    This function returns a hash object, and when you print it or write it to a file, you get something like this:

    <md5 HASH object @ 0x7f8274221990>
    

    ... which isn't terribly useful.

    If you want the actual text of the hashes, call .hexdigest():

    hashed_username = hashlib.md5(bytes(username, "utf-8")).hexdigest()
    # returns e.g. "47bce5c74f589f4867dbd57e9ca9f808"