Функция Python md5 имеет разные выходные данные с одинаковым вводом

Я делаю домашнюю работу: функция register() сохраняет пары имя пользователя-md5 (пароль) вместо пар имя пользователя-пароль в dict, затем функция login() проверяет правильность пары имени пользователя и пароля или нет. Но у меня проблема с login(), если я добавляю «соль» к хэшу md5: md5 имеет разные результаты, когда входные данные одинаковы.

import hashlib
salt = '1ha3'
def register (**kw):
    md5DB = {}
    md5 = hashlib.md5()
    for key,value in kw.items():
        origin_str = key + value + salt
        md5.update(origin_str.encode('utf-8'))
        md5DB.update( {key : md5.hexdigest()} )
    return md5DB

def login (user, password,**kw):
    input_str = user + password+ salt
    md5 = hashlib.md5()
    md5.update(input_str.encode('utf-8'))
    md5_result = md5.hexdigest()
    if md5_result == kw[user]:
        print ('Correct')
    else:
        print ('Wrong')

database = {'Mike':'mike2001','Bob':'abcd2010','Alice':'2015alice'}
mydb = register(**database)
print (mydb)
login ('Bob','abcd2010',**mydb)

Моя функция входа в систему должна выводить «Правильно», однако результат «Неправильный», поскольку результат хеширования md5 отличается от соответствующего элемента mydb. Может кто-то помочь мне с этим? Заранее спасибо.


person Sissi    schedule 22.05.2015    source источник
comment
Прежде всего, вы должны никогда использовать md5 для паролей.   -  person jeromej    schedule 22.05.2015
comment
Не используйте для этого md5 .. ! Используйте 1_   -  person wim    schedule 22.05.2015
comment
Для текущей реализации вам действительно не нужны аргументы ключевого слова — register() может просто взять словарь.   -  person eddiewould    schedule 22.05.2015


Ответы (1)


Игнорируя вопрос о том, использовать ли MD5 или нет, вы можете решить проблему, создав новый экземпляр MD5 для каждой итерации в regsiter().

i.e.

def register (**kw): md5DB = {} for key,value in kw.items(): md5 = hashlib.md5()
origin_str = key + value + salt md5.update(origin_str.encode('utf-8')) md5DB.update( {key : md5.hexdigest()} ) return md5DB

person eddiewould    schedule 22.05.2015
comment
+1 Я собирался нажать Enter, когда ты впервые сказал это. Также md5DB[key] = md5.hexdigest() будет делать то же самое, что и md5DB.update( {key : md5.hexdigest()} ), но лучше. - person jeromej; 22.05.2015