
1. 開發(fā)環(huán)境
編程語言:Python3.7.4
IDE: VSCodium
操作系統(tǒng):Windows 10 專業(yè)版
2. 前言
??作為一名測試工程師在測試工作中經(jīng)常需要搜集測試數(shù)據(jù),涉及修改密碼,注冊等操作的時(shí)候總是一個(gè)密碼想半天,為了解決這個(gè)問題干脆用Python手動寫一個(gè)密碼生成器。
??當(dāng)然網(wǎng)絡(luò)上也有現(xiàn)成的密碼生成器例如LINUX系統(tǒng)下的mkpasswd(系統(tǒng)自帶)、pwgen(需要安裝)等。
3. 開始碼代碼
-
需要了解的知識點(diǎn)
random 模塊
密碼構(gòu)成:數(shù)字,大寫字母,小寫字母,特殊字符, 通常規(guī)則要求8-20位
-
設(shè)計(jì)思路
將大小寫字母(a-zA-Z)數(shù)字(0-9)特殊字符組成一個(gè)字符串,然后用random函數(shù)隨機(jī)抽取一部分內(nèi)容返回
3.1 初步代碼設(shè)計(jì)
# _*_ coding:utf-8 _*_
'''
@File : password_01.py
@TIME : 2019/09/27 13:32:36
@Autho : ningbing
@Phone : 15136220360
@Version : V1.0
@Email : 823825804@qq.com
@Desc : 密碼生成器設(shè)計(jì),將大小寫字母(a-zA-Z)數(shù)字(0-9)特殊字符組成一個(gè)字符串,然后用random函數(shù)隨機(jī)抽取一部分內(nèi)容返回
'''
import string
from random import sample
def password_01(num):
# 獲取所有的數(shù)字
num_str = string.digits
# 獲取所有的消息字母
lower_str = string.ascii_lowercase
# 獲取所有的大寫字母
upper_str = string.ascii_uppercase
# 特殊字符
spe_str = '_@#!,.;:-=+\\/?'
# 返回隨機(jī)密碼
return ''.join(sample(num_str + lower_str + upper_str + spe_str, num))
執(zhí)行函數(shù)50次查看執(zhí)行結(jié)果:

-
代碼解析
- 首先引入string、random模塊
string模塊中內(nèi)置函數(shù): digits, ascii_lowercase, ascii_upper。分別可以獲取數(shù)字,小寫字母,大寫字母

- random模塊內(nèi)置函數(shù): sample 可以從目標(biāo)列表或者字符串中隨機(jī)獲取指定數(shù)目的字符生成一個(gè)數(shù)組

最后返回即可
-
總結(jié)
上面的代碼沒有控制密碼復(fù)雜度,隨機(jī)性太強(qiáng)有可能會出現(xiàn)生成的密碼都是數(shù)字或者純字母的情況。因此需要改進(jìn)。
3.2 改進(jìn)升級
-
設(shè)計(jì)思路
新增參數(shù)level和length, level為密碼復(fù)雜度(1-4) length 為密碼長度
新增函數(shù)CutLength, 根據(jù)level和length 將密碼長度分割為一個(gè)數(shù)組數(shù)組長度為:level, 數(shù)組個(gè)數(shù)字之和為length。
例如:level=3 , length=10 輸出: [4, 3, 3],
-
代碼如下
# _*_ coding:utf-8 _*_ ''' @File : password_02.py @TIME : 2019/10/07 21:00:55 @Autho : ningbing @Phone : 15136220360 @Version : V1.0 @Email : 823825804@qq.com @Desc : 密碼生成器改造 ''' import string from random import randint, choices, shuffle, sample def CutLength(level, length): # 剪切密碼長度,根據(jù)密碼等級將密碼長度剪切 # 例如:輸入:level = 3, length = 10。 輸出 [3, 4, 3] res_arr = [] for i in range(level, 1, -1): res_arr.append(randint(1, length - sum(res_arr) - i + 1)) res_arr.append(length - sum(res_arr)) shuffle(res_arr) return res_arr def markpassword(dict, arr): # 獲取密碼數(shù)組,根據(jù)輸入的密碼字典和密碼長度數(shù)組,隨機(jī)獲取密碼值 res = [] for i in range(len(arr)): res += choices(dict[i], k=arr[i]) return res # 密碼生成器主函數(shù) def passwordgent(level, length): # 獲取密碼長度分布數(shù)組 arr = CutLength(level, length) # 獲取所有數(shù)字(0-9) p_digits = string.digits # 獲取所有小寫字母(a-z) p_lowercase = string.ascii_lowercase # 獲取所有大寫字母(A-Z) p_uppercase = string.ascii_uppercase # 獲取所有特殊字符 p_strt = '_@#!,.;:-=+\\/?' # 組裝成數(shù)組字典 passdict = [p_digits, p_lowercase, p_uppercase, p_strt] res = [] # 判斷l(xiāng)evel等級,如果level等級為1,則只在前三項(xiàng)中提取,避免密碼都是特殊字符的情況 res = markpassword( sample(passdict[:-1] if level == 1 else passdict, level), arr) # 檢查密碼首位是否為特殊字符 while True: # 如果密碼數(shù)組首位是特殊字符則重新排序 if res[0] in p_strt: shuffle(res) else: break # 返回密碼,join函數(shù)將數(shù)組轉(zhuǎn)為字符串 return ''.join(res) 測試結(jié)果
