Генерация паролей в Python 3.1.1 - PullRequest
1 голос
/ 15 июля 2010

Я хочу сгенерировать пароли, используя строки, набранные пользователем, в книге, которую я читаю, рекомендуется использовать sha вместо md5, поскольку она считается более надежной.

sha однако устарела иТеперь я использую модуль hashlib для шифрования строк, как показано здесь: http://docs.python.org/py3k/library/hashlib.html#module-hashlib.

import os
import hashlib
from getpass import getpass

print('Username: ' + os.environ['USER'])
passwd = getpass('Password: ')
h = hashlib.md5()
h.update(passwd.encode())
passwd_encrypt = h.hexdigest()

Затем я сравниваю passwd_encrypt с простым файлом ascii, содержащим списокимена пользователей и зашифрованные пароли, например, так:

THO     5f4dcc3b5aa765d61d8327deb882cf99

Это подходящая техника для шифрования пароля или есть лучший способ?Меня также интересует, подходит ли такое хранение паролей и какие могут быть альтернативы.

Спасибо

Ответы [ 2 ]

7 голосов
/ 15 июля 2010

Нет алгоритма "ша".Алгоритм sha1 намного сильнее, чем md5, так как md5 полностью сломан.Я полагаю, что существует алгоритм, который генерирует коллизию за микросекунды.

Sha1 был значительно ослаблен криптоаналитиками, и поиск следующей большой вещи продолжается, но в настоящее время он подходит для всех, кроме большинстваparanoid.

Что касается их использования в паролях, цель состоит в том, чтобы предотвратить обнаружение оригинального пароля.Таким образом, на самом деле не имеет большого значения, что генерировать коллизии md5 тривиально, поскольку коллизия просто выдает альтернативный пароль, который имеет тот же хэш md5, что и оригинальный пароль, но не раскрывает оригинальный пароль.

Важное примечание:

В вашей версии отсутствует важный компонент: соль.Это случайная строка, которая соединяется с исходным паролем для генерации хэша, а затем соединяется с самим хэшем для хранения.Цель состоит в том, чтобы гарантировать, что пользователи с одним и тем же паролем не получат один и тот же сохраненный хэш.

import random

print('Username: ' + os.environ['USER'])
passwd = getpass('Password: ')
salt = ''.join(random.choice('BCDFGHJKLMNPQRSTVWXYZ') for range(4))
h = hashlib.md5()
h.update(salt)
h.update(passwd.encode())
passwd_encrypt = salt + h.hexdigest()

Затем вы проверяете пароль, повторно используя сохраненную соль:

passwd = getpass('Password: ')
salt = passwd_encrypt[:4]
h = hashlib.md5()
h.update(salt)
h.update(passwd.encode())
if passwd_encrypt != salt + h.hexdigest():
    raise LoginFailed()
0 голосов
/ 15 июля 2010

Сравнение хеша пароля с сохраненным хешем является подходящим методом для аутентификации.

...