如何在python中生成密码?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我喜欢在python中生成一些字母数字密码。一些可能的方法是:

import string
from random import sample, choice
chars = string.letters + string.digits
length = 8
''.join(sample(chars,length)) # way 1
''.join([choice(chars) for i in range(length)]) # way 2

但我不喜欢两者都是因为:

方式1只选择了唯一的字符,不能生成密码长度> len字符。

方式2我们有变量未使用,我找不到如何避免这种情况的好方法。

还有其他好的选择吗?

我们在这里进行了一些测试timeit对于100000次迭代:

''.join(sample(chars,length)) # way 1; 2.5 seconds
''.join([choice(chars) for i in range(length)]) # way 2; 1.8 seconds (optimizer helps?)
''.join(choice(chars) for _ in range(length)) # way 3; 1.8 seconds
''.join(choice(chars) for _ in xrange(length)) # way 4; 1.73 seconds
''.join(map(lambda x: random.choice(chars), range(length))) # way 5; 2.27 seconds

所以,成功的是''.join(choice(chars) for _ in xrange(length))

提问于
用户回答回答于

Python 3.6以后

你应该使用秘密模块要生成密码安全密码,可从Python3.6中获得,改编自文档:

 import secrets
 import string
 alphabet = string.ascii_letters + string.digits
 password = ''.join(secrets.choice(alphabet) for i in range(20)) # for a 20-character password
用户回答回答于

random.SystemRandom使用相同的底层密码随机函数os.urandom但它使用了熟悉的random接口。这个函数不会受到128字节的限制。

import random
import string

def gen_random_string(char_set, length):
    if not hasattr(gen_random_string, "rng"):
        gen_random_string.rng = random.SystemRandom() # Create a static variable
    return ''.join([ gen_random_string.rng.choice(char_set) for _ in xrange(length) ])

password_charset = string.ascii_letters + string.digits
gen_random_string(password_charset, 32)

扫码关注云+社区

领取腾讯云代金券