在 Python 中,我想编写一个密码生成器。
您认为我应该在程序中添加哪些输入来帮助创建一个好的、强密码?
一句话回答就够了。我只想开始一个思考过程。
本着 xkcd 漫画的精神...
>>> import random
>>> def password_gen():
... with open('/usr/share/dict/words') as f:
... words = [w.strip().lower() for w in f if w.strip().isalpha()]
... while True:
... yield ' '.join(random.sample(words, 4))
...
>>> g = password_gen()
>>> next(g)
'mansion yodelling sumner coordination'
>>> next(g)
'proving velvetiest upload muggers'
>>> next(g)
'southey unfortunately longshoremen settings'
>>> next(g)
'inundated mules coevals vicious'
import random
random.choice(['password', 'password1'])
请注意,随机生成密码几乎总是一个坏主意。而是使用长的唯一重置密钥实现某种密码重置算法。例如,根据 Andbrews 的回答使用 uuid 生成。
但是,如果您以某种方式无法实现重置程序,可能是因为您的客户/老板只是拒绝听取原因,那么至少实现一个功能,即一旦用户收到他的新密码,他必须将其更改为一个新的,以便给用户的密码(在纸上或通过电子邮件,因此每个人都可以使用)必须更改为只有他/她知道的密码。
另一件要考虑的事情是确保密码是不可能猜到的,即使您知道以前发送的密码。因此,不要使用 random 模块。我引用:
Python 使用 Mersenne Twister 作为核心生成器。它产生 53 位精度浮点数,周期为 2**19937-1。C 中的底层实现既快速又线程安全。Mersenne Twister 是现有测试最广泛的随机数生成器之一。但是,由于是完全确定性的,它并不适合所有用途,并且完全不适合加密用途。
相反,随机密码的基础应该是os.urandom()
. 但是,它会生成一个二进制字节序列,因此必须对其进行更改。该binascii
模块可用于此目的。我建议使用 hexlify(),它使密码最容易输入,完全没有奇怪的字符:
>>> import os
>>> import binascii
>>> binascii.hexlify(os.urandom(10)).strip()
'7b2d0d5e40c18938bca9'
首先,定义为生成的密码选择哪些字符,字符串模块中定义的常量在这里可能会有所帮助。然后,使用random 模块随机选择这些字符,例如:
import string
import random
def random_password(alphabet=string.ascii_letters+string.digits, length=8):
return ''.join(random.sample(alphabet, length))
>>> random_password()
'KwYGBtFb'
>>> random_password()
'CJOSx8tj'
>>> random_password()
'62BNJyX5'
您可以使用uuid 模块
import uuid
print uuid.uuid4()