python - 在 Python 3.1.1 中生成密码

标签 python encryption passwords python-3.x

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

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

谢谢

最佳答案

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

关于python - 在 Python 3.1.1 中生成密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3254713/

相关文章:

python - ir.attachment在不同型号可以查看不同方式

swift - 使用 CryptoSwift 和 CryptoJS 的 AES 加密

security - 我应该对密码施加最大长度限制吗?

azure - 尝试从 Azure 表存储检索实体时收到错误消息 "Error occurred while decoding OAEP padding"

language-agnostic - 揭开 Web 身份验证的神秘面纱

php - 您如何确保您存储的密码使用 php 和 mySql 进行了很好的加密?

Python 单元测试 - 'gcsfs.utils.HttpError: Anonymous caller does not have storage.objects.list access to the Google Cloud Storage bucket.'

Python:更改列表类型以进行 json 解码

python - 从 matplotlib 导入地理图到 plotly

Javascript 数字签名