跟同事討論到新建帳號時如何隨機產生預設密碼,寄給申請人於第一次登入使用。這組密碼有幾個要求:

1.避免涉及申請者生日、電話之類會被猜中的資料。
2.產生的規則必須無法被掌握。
3.要符合某些優質密碼的要求(例如: 長度限制、必須英數字交雜)
4.產生的邏輯愈簡單愈好(花兩個工作天寫這種雞毛蒜皮的小東西未必太奢侈了?)

以前有看過有人寫了近百行Code用亂數及XOR完成這項工作,我原本只想用一行.NET Guid.NewGuid()打死,沒想到為了100%符合"優質"密碼的要求,還是花了五行才搞定,不過應該夠簡單囉!! Check It Out!

string randPwd = "";
do
{
    randPwd = Guid.NewGuid().ToString().Substring(0, 8).ToUpper();
} 
while ( System.Text.RegularExpressions.Regex.IsMatch(randPwd, "\\d{8}") //全數字
        || !System.Text.RegularExpressions.Regex.IsMatch(randPwd, "\\d") //全英文
        ); 
//用迴圈是防止得到的八碼全是數字(機率為100^4/256^4)或全是英文(25^4/256^4)

Updated @ 2007-08-04

Steve 很熱心地扮演了奧客,又加了兩條要求: 中英文要交雜及英文要有的大寫有的小寫! 還好還好,還是可以六行打死! RegEx 好棒呀~~

string randPwd = "";
do{    
    randPwd = Guid.NewGuid().ToString().Substring(0, 8).ToUpper();
} while ( !System.Text.RegularExpressions.Regex.IsMatch(randPwd, 
"\\d+[A-F]+\\d+[A-F]") );
//具有兩個以上的英文字母,並且中間夾數字才算合格
//將第二個英文字母變小寫
int p = Regex.Matches(randPwd, "[A-F]")[1].Index;
randPwd = randPwd.Insert(p, randPwd[p].ToString().ToLower()).Remove(p+1, 1);

Comments

# by steve

大師很愛用GUID喔 如果除了英數字交雜之外,英文還必須有大寫跟小寫咧?

# by Jeffrey

To Steve, 閣下挺有當奧客天份的嘛! 沒在甲方當Project窗口真是暴殄天物,哈! 文字處理的需求,交給RegEx就對了,新的Logic我Update在Post本文了,Check it out!

# by steve

好說好說,那是因為以前被甲方玩多了.... 我現在的確是在甲方上班 :P 不過跟大師一樣,現在是「甲方裡的乙方」 還是要面對甲方裡的甲方....公司的User....

# by Eric

(1) 長度介於 8 - 16 且需有數字、英文大小寫的密碼 @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$" (2) 長度介於 8 - 16 且有數字、英文大小寫、特殊符號的密碼 @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])" + @"(?=.*[\-\+\?\*\$\[\]\^\.\(\)\|`!@#%&_=:;',/]).{8,16}$" 如果密碼還要包含特殊符號,會不會更難產生咧? :P

# by Jeffrey

"密碼還要包含特殊符號,會不會更難產生咧?" 我想不會,產生好英文數字夾雜密碼後,再用亂數從`!@#%&_=:;',/+-?*$\^.(我不是在罵髒話,真的!)挑一個符號,接著插入到剛才產生的密碼中的隨機位置(亂數決定),再Trim掉最後一位就搞定囉。

# by SuperShowwei

黑大~~~ 我有點不懂 @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$" 這之中的 ?=. 是什麼意思~ 能替小小稍稍解釋一下嗎?

# by Eric

To SuperShowwei: 請參考 MSDN 關於 Grouping Constructs 的部份: http://msdn.microsoft.com/en-us/library/az24scfc.aspx#grouping_constructs ?= 表示必須符合符號右方的 expression . 表示任意字元 \d 表示0-9 所以 (?=.*\d) 表示任意字元加上 0-9 的任意字元...

# by Jeffrey

謝謝Eric的回覆,另外再補充保哥一篇詳盡的說明: http://blog.miniasp.com/post/2008/05/Using-Regular-Expression-to-validate-password.aspx

Post a comment