最近在改一個需求,根據資安法與政府組態基準 (GCB),密碼必須要參考 Windows 的密碼安全性原則(密碼複雜度設定),達到以下要求:
- 至少 8 個字元
- 至少有以下四個內容的其中三個
- 小寫字母
- 大寫字母
- 數字
- 特殊符號
寫不出漂亮的正規表示式 (regular expression),光是中括號就一直卡住,只好上網求助萬能的網路搜尋。找到一篇 "RegEx for strong password",裡面提到:
「以下的 pattern 可以符合需求:
"^((?=.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!\u0022#$%&'()*+,./:;<=>?@[\]\^_`{|}~-]).*)"
各種符號讓這個 pattern 又長又醜。遺憾的是 unicode 的範圍與類別都不支援,所以只能把它們用字元的方式寫出來。你會注意到我特別把雙引號換成 unicode (\u0022),避免這個雙引號讓 ValidationExpression(註:ASP.NET 拿來放正規表示式的屬性)提早被截斷。
在這個情況下,你的程式碼可能長成這樣:
<asp:TextBox ID="password" runat="server" />
<asp:RequiredFieldValidator ID="rfvPassword" runat="server" Display="Dynamic"
ControlToValidate="password" ErrorMessage="Password is required!" />
<asp:RegularExpressionValidator ID="revPassword" runat="server" Display="Dynamic"
ControlToValidate="password" ErrorMessage="Invalid password!"
ValidationExpression="^((?=.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!\u0022#$%&'()*+,./:;<=>?@[\]\^_`{|}~-]).*)"
/>」
我是把它拿到 JavaScript 裡用,所以長成這樣:
<script type="text/javascript">
// 以下是這個正規表示式的 pattern 的內容:
// 密碼長度須超過八個字 {8,}
// 密碼複雜度須包含:
// - 小寫字母 [a-z]
// - 大寫字母 [A-Z]
// - 數字 \d
// - 特殊符號 "#$%&'()*+,./:;<=>?@[]^_`{|}~-
var regex = new RegExp(/^((?=.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!\u0022#$%&'()*+,./:;<=>?@[\]\^_`{|}~-]).*)/, "g");
// 用另一個變數把使用者輸入的密碼接進來,假設那個密碼變數是 newpwd
if (newpwd.match(regex) == null) {
alert('密碼複雜度不符合');
}
</script>
打完收工~感恩網路上的大大們精美的奉獻。(合掌)
留言列表