在Python 3.1.1中生成密码

Tho*_*ley 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()
Run Code Online (Sandbox Code Playgroud)

然后passwd_encrypt,我将与包含用户名和加密密码列表的普通ascii文件进行比较,如下所示:

THO     5f4dcc3b5aa765d61d8327deb882cf99
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Mar*_*tos 7

没有"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()
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过重用存储的salt来验证密码:

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()
Run Code Online (Sandbox Code Playgroud)