[英]Generating passwords in Python 3.1.1
我正在寻找使用用户键入的字符串生成密码的方法,我正在阅读的书推荐使用sha
over md5
因为它被认为更强。
但是sha
已过时,我现在使用hashlib
模块以类似于以下所示的方式对我的字符串进行加密: http : 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
这是用于密码加密的合适技术还是有更好的方法? 我也对以这种方式存储密码是否合适以及替代方法可能感兴趣。
谢谢
没有“ sha”算法。 sha1算法比md5强大得多,因为md5已被完全破坏。 我相信有一种算法需要微秒才能产生碰撞。
密码分析人员已大大削弱了Sha1,并且正在寻找下一个重要的事物,但它目前仍适用于除最偏执狂之外的所有事物。
关于它们在密码中的使用,目的是防止发现原始密码。 因此,产生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()
将密码的哈希与保存的哈希进行比较是一种合适的身份验证方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.