Нет алгоритма "ша".Алгоритм 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()