【问题标题】:Generating passwords in Python 3.1.1在 Python 3.1.1 中生成密码
【发布时间】:2011-03-16 08:17:24
【问题描述】:

我希望使用用户输入的字符串生成密码,我正在阅读的书建议使用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

这是加密密码的合适技术还是有更好的方法?我也对以这种方式存储密码是否合适以及可能的替代方案感兴趣。

谢谢

【问题讨论】:

    标签: python encryption passwords python-3.x


    【解决方案1】:

    没有“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()
    

    【讨论】:

    • 我刚从wikipedia salt entry回来,想问这个问题。你打败了我 :-) 谢谢
    • +1 提及盐。添加它是一件微不足道的事情,但它增加了一层很好的额外安全性 - 如果您存储类似 MD5 哈希的内容,它还具有防止彩虹表查找的额外好处,如果实施正确(即您的机制是未暴露)
    • 是否有充分的理由省略盐中的元音?我可以使用类似于salt = ''.join(chr(random.randint(0, 255)) for i in range(4)) 的东西吗?
    • @Thorsley:它避免了脏话。这是一个很好的理由吗?这是一个非常主观的问题。 ;-)
    【解决方案2】:

    将密码的哈希值与保存的哈希值进行比较是一种合适的身份验证方法。

    【讨论】:

    • 不加盐不适合。
    猜你喜欢
    • 2011-04-20
    • 2021-03-29
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多