[JavaScript] 利用正規表示式(RegExp)檢查密碼複雜度 | javascript密碼複雜度
最近在改一個需求,根據資安法與政府組態基準(GCB),密碼必須要參考Windows的密碼安全性原則(密碼複雜度設定),達到以下要求:至少8個字元至少有以下四個內容的其中三個小寫字母大寫字母數字特殊符號寫不出漂亮的正規表示式(regularexpression),光是中括號就一直卡住,只好上網求助萬能的網路搜尋。找到一篇"RegExforstrongpassword"[1],裡面提到:「以下的pattern可以符合需求:"((?=.{8,}$)(?=.*d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*d)(?=.*[a-zA-Z])(?=.*[!u0022#$%&()*+,./:;<=>?@[]\_`{|}~-]).*)"各種符號...
最近在改一個需求,根據資安法與政府組態基準 (GCB),密碼必須要參考 Windows 的密碼安全性原則(密碼複雜度設定),達到以下要求:
至少 8 個字元 至少有以下四個內容的其中三個 小寫字母 大寫字母 數字 特殊符號寫不出漂亮的正規表示式 (regular expression),光是中括號就一直卡住,只好上網求助萬能的網路搜尋。找到一篇 "RegEx for strong password"[1],裡面提到:
「以下的 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,}$)(...