python随机密码长度_Python生成指定长度和字符类型的随机密码并验证安全性,校验...

本文介绍了使用Python生成指定长度和包含多种字符类型的随机密码,并进行安全性校验的方法。通过随机选择不同字符集,确保密码包含数字、大小写字母和特殊字符,同时满足最小长度和字符种类要求。
摘要由CSDN通过智能技术生成

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import re

import time

import string

import random

def new_password(min_pass_len, max_pass_len, min_char_kind):

pass_choice = [string.ascii_lowercase, string.ascii_uppercase, string.digits, '!@#$%^&*-_=+']

pass_len = random.randint(min_pass_len, max_pass_len) # 随机密码长度

# 随机字符种类,如果为1表示密码包含该种字符

char_kind_count = random.randint(min_char_kind, 4)

char_kind_map = [0, 0, 0, 0]

for index in range(char_kind_count):

char_kind_map[index] = 1

random.shuffle(char_kind_map)

password, char_kind_num = [], 0

for index, contain_the_kind in enumerate(char_kind_map):

if contain_the_kind:

char_kind_num += 1 # 已完成随机添加的字符种类+1

# 最大可随机添加字符数=剩余可用密码位数-减预留密码位数

max_random_count = pass_len - len(password) - (char_kind_count - char_kind_num)

if char_kind_num == char_kind_count: # 最后一类字符的最小可随机添加字符数

min_random_count = min_pass_len - len(password)

min_random_count = min_random_count > 1 and min_random_count or 1

else:

min_random_count = 1

max_random_count = max_random_count >= min_random_count and max_random_count or min_random_count

random_char_count = random.randint(min_random_count, max_random_count) # 该类字符要随机添加的字符数

# 生成可选字符列表

choice_char_list = pass_choice[index]

while len(choice_char_list) < random_char_count:

choice_char_list += choice_char_list

password.extend(random.sample(choice_char_list, random_char_count)) # 随机添加字符

# print(char_kind_count, char_kind_num, min_random_count, max_random_count, random_char_count, index, password)

if len(password) >= pass_len:

break

random.shuffle(password) # 打乱字符列表

return ''.join(password)

def verify_password(password, min_pass_len, max_pass_len, min_char_kind):

if len(password) < min_pass_len:

return '密码不能小于%s个字符' % min_pass_len

if len(password) > max_pass_len:

return '密码不能大于%s个字符' % max_pass_len

char_types = 0

for regex in [r'[0-9]', r'[a-z]', r'[A-Z]', r'[^0-9a-zA-Z]']:

if re.search(regex, password, re.S):

char_types += 1

if char_types >= min_char_kind:

return '校验通过'

return '密码至少包含数字、大小写字母、特殊字符中的%s种' % min_char_kind

if __name__ == '__main__':

min_pass_len, max_pass_len = 8, 12 # 密码长度范围,min_pass_len必须大于等于min_char_kind

min_char_kind = 3 # 最少字符种类,不能大于4种

while True:

password = new_password(min_pass_len, max_pass_len, min_char_kind)

check_result = verify_password(password, min_pass_len, max_pass_len, min_char_kind)

print(password, check_result)

if check_result != '校验通过':

break

time.sleep(0.01)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值