使用区分大小写标准生成密码

时间:2015-10-09 12:45:05

标签: python

我一直在研究一些代码来生成密码。我正在使用一些很酷的东西,如随机长度(由范围定义),一些大写和小写字符以及数字。我现在想制定一个小规则:

  • 密码必须始终包含至少一个数字,一个大写字母和一个小写字母
  • 相邻的字符不一样。

这是我的生成器及其规则的代码:

import random
length==random.randint(7,14)
ListOfChars=[]
    codes=list(range(48,57))+list(range(65,90))+list(range(97,122))
for a in range(length):
    ASCIIcode=random.choice(codes)
    ListOfChars.append(chr(ASCIIcode))
print(''.join(ListOfChars)

在这里你可以看到已经定义了ascii范围以及变量长度7-14,但我似乎找不到再次生成相同char的方法,或者确保每个中至少有1个3个字符类型。

2 个答案:

答案 0 :(得分:1)

以下应该很好用。它首先为密码中的每个条目构建一组要求并对其进行洗牌。然后,它根据该要求构建每个条目,并且没有相同的连续条目:

import string

length = random.randint(7, 14)

set1 = string.ascii_uppercase                   # A-Z   
set2 = string.digits                            # 0-9
set3 = string.digits + string.ascii_letters     # a-z A-Z 0-9
build = [set1, set2] + [set3] * (length - 2)    # 1 uppercase, one digit, reset from full set
random.shuffle(build)                           # shuffle the order

password = []
index = 0
last = ''

while len(password) < length:                   # keep appending until length is reached
    choice = random.choice(build[index])
    if choice != last:
        password.append(choice)
        index += 1
        last = choice

print ''.join(password)

给出如下结果:

6ZFTauQ
c6a29MTditDJUy

答案 1 :(得分:0)

正如我在评论中所建议的,这是解决这个问题的一种方法:

from string import ascii_lowercase, ascii_uppercase, digits
from random import randint, shuffle, sample

length = randint(7, 14)

length1 = randint(1, length - 2)
length2 = randint(1, length - length1 - 1)
length3 = randint(1, length - length1 - length2)

lengths = [length1, length2, length3]
shuffle(lengths)

subsets = list(map(sample, [ascii_lowercase, ascii_uppercase, digits], lengths))
result = subsets[0]
result.extend(subsets[1])
result.extend(subsets[2])
shuffle(result)
result = ''.join(result)
print(result)

我不知道它有多均匀,即它可能偏向更长的长度。