密码强度指一个密码被非认证的用户或计算机破译的难度。 密码强度通常用“弱”或“强”来形 容。“弱”和“强”是相对的,不同的密码系统对于密码强度有不同的要求。密码的破译与系统允许客户尝试不同密码的次数、是否熟悉密码主人等因素相关。然而,即使再强的密码也有可能被偷取、破译或泄漏,在用户设置密码时,尽可能的将密码设置的越复杂、位数越长、经常更换此类型的密码,从而才能让密码强度尽可能达到最高。
条件1: 密码只能是数字或大小写字母或下划线的组合
条件2: 如果密码包含数字和字母的组合即为强.
例如 : 123abc 为强密码
123abc_也是强密码
123456 为弱密码
123456_为弱密码
abcdef 为弱密码
abcdef_ 为弱密码
首先,画一个DFA:
![mark](http://qiniu.newthink.cc/blog/20180205-114102179.jpg)
其中,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
```