Хеш-функция MD5, изменяющая данные в Python

Я пытаюсь создать программу входа в Python с использованием графического интерфейса Tkinter и использовать hashlib MD5 для хеширования пароля. Вот мой код для создания учетной записи.

def AccountEntry():
    tk.Label(m, text = "Account Creation").grid(row =2 ,column =1)
    tk.Label(m, text = "Enter name").grid(row = 3, column = 0)
    ename = tk.Entry(m)
    ename.grid(row = 3, column = 1)
    tk.Label(m, text = "Enter password").grid(row = 4,column = 0)
    epassword = tk.Entry(m, show = "*")
    epassword.grid(row = 4, column = 1)
    tk.Button(m, text = "Submit", command = lambda:Account(epassword,ename)).grid(row = 5, column = 1)

def Account(epassword,ename):
    name = ename.get()
    password = epassword.get()
    bytepass = bytes(password, 'utf-8')
    hexpass = str(hashlib.md5(bytepass))
    enter_table = (name,hexpass)
    cursor.execute("insert into lusers(name, hexpass) values(%s,%s)",(enter_table))
    db.commit()
    tk.Label(m, text = "Successfully made account").grid(row = 6, column = 1)

Проблема в том, что функция md5 возвращает разные значения. Итак, в первый раз, когда я нажимаю «отправить», он возвращает «md5 HASH object @ 0x03845C68», но он возвращает «md5 HASH object @ 0x03845DE8» во второй раз, когда я нажимаю «submit» с тем же именем и паролем. Это создает проблему, поскольку для входа в систему программа берет пароль, снова использует хеш-функцию, а затем сравнивает новый хеш-объект с тем, который находится в базе данных, которые отличаются, так как они искажают значения в создании учетной записи.

Я подозреваю, что str (hashlib.md5 (bytepass)) может иметь какое-то отношение к нему, поскольку он делал то же самое в логине, пока я не удалил str (), но мне нужно преобразовать хеш-объект в строку, чтобы поместить это в MySQL.


person Tejas Misra    schedule 04.11.2019    source источник
comment
Эти числа являются адресами памяти объектов, а не хешированным значением. Можете ли вы распечатать строку хеша для проверки? См. Ответ @chepner   -  person Chris    schedule 04.11.2019
comment
Используйте hashlib.md5(value).hexdigest() вместо str(...).   -  person Klaus D.    schedule 05.11.2019
comment
Вам следует подумать об использовании существующей структуры или прочитать о передовых методах аутентификации ... Я не эксперт, но для начинающих несоленый пароль - большой отказ, поэтому я выполняю один раунд хеширования. Существуют хеш-функции, специально предназначенные для хеширования паролей ...   -  person Thomas Guyot-Sionnest    schedule 05.11.2019


Ответы (1)


Вы не получаете хеш md5 из этого вызова; вы получаете объект, у которого есть метод, который может возвращать хеш md5.

hexpass = hashlib.md5(bytepass).hexdigest()
person chepner    schedule 04.11.2019
comment
Если я попытаюсь поместить это в MySQL, он выдает ошибку типа: Python 'builtin_function_or_method' не может быть преобразован в тип MySQL - person Tejas Misra; 05.11.2019
comment
Кажется, вам где-то не хватает скобок; вы используете hexdigest или hexdigest()? - person chepner; 05.11.2019