0%

[Python] 使用 regular expression 驗證密碼長度與安全性

前言

在申請使用者帳號時,常常會看到要求密碼內至少要幾個大寫、小寫與數字。若是我們自己開發的系統,要如何寫才能滿足所有條件?這時候就必須請出正規表示式 (regular expression 也稱為 regex)。

訂定密碼原則

在寫程式之前,需把所有的限制都先條列出來,避免遺漏或理解錯誤

  1. 至少有 1 個數字
  2. 至少有 1 個小寫英文字母
  3. 至少有 1 個大寫英文字母
  4. 密碼長度在 6 ~ 20 個字母之間

Python 實現

現在就用 Python 來實現檢查密碼的功能吧!直接上程式碼再解釋

1
2
3
4
5
6
7
8
import re
pattern = "^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$"
password = input("Enter string to test: ")
result = re.findall(pattern, password)
if (result):
print("Valid password")
else:
print("Password not valid")

regular expression 找字串的原理關鍵是使用 pattern,如上程式碼中的 "^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$",再使用 re.findall 查看字串裡面有沒有符合 pattern,若是有符合 pattern,則等同符合密碼原則。

仔細解析一下 pattern

1
pattern = "^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$"

一堆符號看得眼花撩亂?我會拆成有 (?=) 的部分和沒有 (?=) 的部分來看

  • (?=)的部分
    1. ^(?=.*\d):從頭 (^) 檢查此字串是否有數字 (.*\d)。
    2. ^(?=.*[a-z]):從頭 (^) 檢查此字串是否有小寫英文字母 (.*[a-z])。
    3. ^(?=.*[A-Z]):從頭 (^) 檢查此字串是否有小寫英文字母 (.*[A-Z])。
  • 沒有 (?=) 的部分
    1. ^.{6,20}$:若上述 (?=) 的條件都滿足,再來找從頭 (^) 到尾 ($) 的字串長度是否在 6 至 20 之間。

結論

正規表示式是非常好用的字串查找、檢查的工具,只要理解如何寫 pattern,就能寫出各種難以用 if else 判斷的功能。

很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵