Python v3(随机密码生成器)

时间:2013-10-06 19:53:10

标签: python python-3.x

我的问题是:如何生成随机密码,其长度在每次生成时(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())

6 个答案:

答案 0 :(得分:8)

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))

答案 1 :(得分:1)

import random
import string

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

答案 2 :(得分:0)

range(size,12)仅返回size(您已硬编码为8)和12之间的数字,因此您的密码长度只有4个字符。制作... for x in range(size)

答案 3 :(得分:0)

我认为由于size = 8range(size,12),它只打印4个字符。这转换为范围(8,12)= 4个字符。您可以增加第二个数字以分配更大的范围来打印随机字符,如此

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,20))

print(randompassword())

另外请务必查看python的随机文档here

答案 4 :(得分:0)

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

  • 有些答案使用string.printable,但这并不是一个好主意,因为它包含空格字符。虽然它们对于密码并非严格违法,但您无法轻易看到它们,因此无法区分(例如)来自多个空格标签(依此类推)。 下面我只使用较低的&大写字母,数字和标点字符
  • 根据元素位置从一组字符中随机选择并不是随机的,因为每个包含的字符类的基数不是均匀的分布式: 26 小写字母; 26 大写字母; 10 数字; 32 标点字符。因此,生成的密码可能包含比标点字符和数字更多的字母;标点符号多于数字; (等等)。因此,如果使用random.choices()(如在其他答案中),则还应使用weights=cum_weights=选项,以通过平衡分发来消除上述偏见。
  • 那就是说,我鼓励使用Python的secrets模块而不是其random模块用于此用例。来自documentation on random
  

警告:不应使用此模块的伪随机生成器   出于安全目的。有关安全性或加密用途,请参阅   secrets模块。

这是使用 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.

DEMO :使用从每个字符类统一选择的字符生成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完成类似的操作。我希望这有帮助!

答案 5 :(得分:0)

  

string.ascii_letters #考虑所有大小写字母。    string.digits (#)包含0到9位数字。    string.punctuation #考虑特殊字符,例如符号。    random.choice (#)考虑从给定的数据中随机选择。    range(random.randint(6,12))#考虑从给定数据中选择一个随机的int范围。    print(generator_pw())#打印随机生成的密码。

import random, string

def generator_pw():
    pwd = string.ascii_letters + string.digits + string.punctuation
    return "".join(random.choice(pwd) for x in range(random.randint(6, 12)))

print(generator_pw())