繁体   English   中英

在Python 3.1.1中生成密码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM