2014年8月19日 星期二

密碼複雜度

密碼複雜度利用Regular Expression可以簡單地完成
先用一個簡單的例子,6~12個英數字混合的規則
<div>
    <asp:TextBox ID="Tbx_Password" runat="server" />
    <asp:Button ID="Btn_Save" Text="Save" OnClick="Btn_Save_Click" runat="server" />
    <asp:RequiredFieldValidator ID="Rfv_Password" ControlToValidate="Tbx_Password" 
        ErrorMessage="密碼不可空白" SetFocusOnError="true" Text="密碼不可空白" ForeColor="Red" 
        Display="Dynamic" runat="server" />
    <asp:RegularExpressionValidator ID="Reg_Password" ControlToValidate="Tbx_Password" 
        ValidationExpression="^(?!.*[oO0])(?=.*[a-zA-Z])(?=.*[\d])(?!.*[\d][\d][\d]).{6,12}$"
        ErrorMessage="密碼長度6~12英數混合" Text="密碼長度6~12英數混合" SetFocusOnError="true" 
        ForeColor="Red" Display="Dynamic" runat="server" />
</div>

^ 開頭符號
(?=.*[a-zA-Z]) 最少一個英文字
(?=.*[\d]) 最少一個數字
.{6,12} 6~12長度
$ 結尾符號

利用群組的功能還可以組合出更多的規則
(?=.*[!@#$%^&*]) 最少一個符號
(?=.*[\d][\d]) 連續兩個數字
(?=.*[a-z][a-z]) 連續兩個小寫英文
(?!.*[\d][\d][\d]) 禁止連續三個數字
(?!.*[oO0]) 禁止小寫的o和大寫的O和數字的0

如果不是WebForm專案,也可以透過System.Text.RegularExpressions空間下的Regex物件來使用

protected void Btn_Save_Click(object sender, EventArgs e)
{
    Regex reg = new Regex(@"^(?!.*[oO0])(?=.*[a-zA-Z])(?=.*[\d])(?!.*[\d][\d][\d]).{6,12}$");
    if (reg.IsMatch(Tbx_Password.Text))
    {
        Response.Write("Match");
    }
    else
    {
        Response.Write("Not Match");
    }
}