Python v3(随机密码生成器)

2024-04-26 23:35:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是:如何生成一个随机密码,每次生成的密码长度从8到12个字符不等。

这是我的代码:

import string
import random

def randompassword():
    chars=string.ascii_uppercase + string.ascii_lowercase + string.digits
    size=8 
    return ''.join(random.choice(chars) for x in range(size,12))

print(randompassword())

Tags: 代码import密码sizestringreturndefascii
3条回答
import random
import string

def randompassword():
    return ''.join([random.choice(string.printable) for _ in range(random.randint(8, 12))])

size = 8; range(size, 12)总是返回数组[8,9,10,11],因此您总是得到长度为4的密码。 相反,请提前使用randint确定此特定密码的大小:

import string
import random

def randompassword():
  chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
  size = random.randint(8, 12)
  return ''.join(random.choice(chars) for x in range(size))

这个问题有几个细微差别:

  • 有些答案使用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模块时,可以使用numpynumpy.random执行类似的操作。我希望这有帮助!

相关问题 更多 >