概述
这个问题有几个细微差别:有些答案使用string.printable,但这不是一个好主意,因为它包含空格字符。虽然对于密码来说,它们并不是严格的非法的,但是您很难看到它们,因此无法将选项卡与几个空格(等等)区分开来。下面我只使用大写字母、数字和标点符号。
基于元素位置从一组字符中随机选择不是随机的,因为每个包含的字符类的基数不是均匀分布的:26小写字母;26大写字母;10数字;32标点符号。因此,生成的密码可能包含的字母多于标点字符和数字;标点字符多于数字;(等等)。因此,如果使用random.choices()(如在其他答案中一样),还应该使用weights=和cum_weights=选项,以消除上述偏见,通过晚上的分布。
也就是说,我鼓励在这个用例中使用Python的secrets模块,而不是它的random模块。从他们的documentation on random:Warning: The pseudo-random generators of this module should not be used
for security purposes. For security or cryptographic uses, see the
secrets module.
下面是一个使用Python-3的面向功能的解决方案。它只使用secrets.choice()。它并不能完全解决随机问题(还存在其他细微差别),但它确实改善了选择分布以减少偏差:>>> import string, secrets
>>> char_classes = (string.ascii_lowercase,
string.ascii_uppercase,
string.digits,
string.punctuation)
>>> size = lambda: secrets.choice(range(8,13)) # Chooses a password length.
>>> char = lambda: secrets.choice(secrets.choice(char_classes)) # Chooses one character, uniformly selected from each of the included character classes.
>>> pw = lambda: ''.join([char() for _ in range(size())]) # Generates the variable-length password.
演示:使用从每个字符类中统一选择的字符生成10个可变长度密码字符串:>>> for i in range(1,11):
>>> p = pw()
>>> print('%i) %i chars :: %s' % (i,len(p),p))
1) 11 chars :: IwWNEAUmnJt
2) 10 chars :: ;N/'tO6RTv
3) 8 chars :: l=5.2CDh
4) 10 chars :: V0=I+A`t2Q
5) 12 chars :: PQm8:f,#56"9
6) 10 chars :: KOdx9~%r;F
7) 11 chars :: 67U8}3>F{
8) 11 chars :: G$5y~3fE7o*
9) 10 chars :: 70,|=Rexwn
10) 8 chars :: &31P^@cU
最后,当我们在这里使用secrets模块时,可以使用numpy和numpy.random执行类似的操作。我希望这有帮助!
最后
以上就是端庄吐司为你收集整理的python请编写程序、生成随机密码_Python v3(随机密码生成器)的全部内容,希望文章能够帮你解决python请编写程序、生成随机密码_Python v3(随机密码生成器)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复