密碼強度指一個密碼被非認證的用戶或計算機破譯的難度。 密碼強度通常用“弱”或“強”來形 容。“弱”和“強”是相對的,不同的密碼系統對于密碼強度有不同的要求。密碼的破譯與系統允許客戶嘗試不同密碼的次數、是否熟悉密碼主人等因素相關。然而,即使再強的密碼也有可能被偷取、破譯或泄漏,在用戶設置密碼時,盡可能的將密碼設置的越復雜、位數越長、經常更換此類型的密碼,從而才能讓密碼強度盡可能達到最高。
條件1: 密碼只能是數字或大小寫字母或下劃線的組合
條件2: 如果密碼包含數字和字母的組合即為強.
例如 : 123abc 為強密碼
123abc_也是強密碼
123456 為弱密碼
123456_為弱密碼
abcdef 為弱密碼
abcdef_ 為弱密碼
首先,畫一個DFA:

其中,S是開始狀態,A代表包含數字但不包含字母的狀態,B代表包含字母但不包含數字的狀態,C代表既包含字母又包含數字的狀態,O代表包含非法字符的陷阱狀態。如果狀態機停在S、A、B狀態,則為弱密碼。如果狀態機停在C狀態,則為強密碼。如果狀態機停在O狀態,則為非法密碼。然后,把它轉化成正則就可以啦。
下面這個正則要求密碼長度最少12位,包含至少1個特殊字符,2個數字,2個大寫字母和一些小寫字母。
```
(?=^.{12,25}$)(?=(?:.*?\d){2})(?=.*[a-z])(?=(?:.*?[A-Z]){2})(?=(?:.*?[!@#$%*()_+^&}{:;?.]){1})(?!.*\s)[0-9a-zA-Z!@#$%*()_+^&]*$
```
## 分解:
```
(?=^.{12,25}$) -- 密碼長度12-25,自己改變數字可以調節
(?=(?:.*?[!@#$%*()_+^&}{:;?.]){1}) -- 至少一個特殊字母,FYI
(?=(?:.*?\d){2}) -- 至少2個數字,FYI
(?=.*[a-z]) -- a-z的小寫字母
(?=(?:.*?[A-Z]){2}) -- 至少2個大寫字母,FYI
```