用Python開發(fā)隨機(jī)密碼生成器

人生苦短,我用python

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)

    1. random 模塊

    2. 密碼構(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é)果:

image
  • 代碼解析

    1. 首先引入string、random模塊

    string模塊中內(nèi)置函數(shù): digits, ascii_lowercase, ascii_upper。分別可以獲取數(shù)字,小寫字母,大寫字母

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

最后返回即可

  • 總結(jié)

    上面的代碼沒有控制密碼復(fù)雜度,隨機(jī)性太強(qiáng)有可能會出現(xiàn)生成的密碼都是數(shù)字或者純字母的情況。因此需要改進(jìn)。

3.2 改進(jìn)升級

  • 設(shè)計(jì)思路

    1. 新增參數(shù)level和length, level為密碼復(fù)雜度(1-4) length 為密碼長度

    2. 新增函數(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é)果

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容