本文要点在于演示如何使用正则表达式验证密码强度,以及如何生成大量字符的排列。由于下面代码生成的字典过于庞大,所以并没有很直接的应用场景,可对生成的强密码再次进行过滤,仅保留可能性较大的密码,这样可以减小字典体积,但同时也会降低暴力破解的成功率。
from itertools import permutations
import re
import string
#所有备选字符
allLetters = string.ascii_letters + string.digits + ',.;![]()@#$&*'
#用来验证密码强度的正则表达式
#如果字符串中同时包含英文字母大写、小写、数字、标点符号,则认为是强密码
pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[,.;!\[\]\(\)@#$&*_]).{4,}$'
def generateStrongPwd():
with open('dict.txt', 'w') as fp:
for length in range(4, 9):
#permutations()函数用来生成从n个元素中任选k个得到的所有排列
for pwd in permutations(allLetters, length):
#迭代permutations对象时得到的是元组
#所以需要转换成字符串
pwd = ''.join(pwd)
#检查密码强度
if re.match(pattern, pwd):
#如果是强密码,写入字典文件
fp.write(pwd)
generateStrongPwd()