星期五, 7月 27, 2012

密碼產生器

今天業主跟我說,他希望 user 密碼不要自己設,因為 user 設密碼都用超級簡單的,例如:身分字號、電話號碼、生日等等..這樣哪天被惡搞,就很倒楣,所以我就跟客戶建議說,那寫支密碼產生器好了,讓我們來幫客戶設,我們把規則設定好,這樣有每個用戶就都會有很難記的密碼啦!XD..

不過難記歸難記,總不能連打都不知怎麼打吧!所以討論規則如下:

1.要有小寫英文
2.要有大寫英文
3.要有數字
4.密碼長度可以業主自己設定

上面這些條件,應該是地球人可口述也可以勉強記起來的規則..所以,噹噹噹..開工!

public class PasswordCreator
{
    Random r = new Random();
    string[] strArr = {
        "abcdefghijklmnopqrstuvwxyz",
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
        "0123456789"
    };
    
    public string GetPassword(int passwordLength)
    {
        //strArr.Sum(a=>a.ToCharArray().Count()).Dump();
                        
        if(strArr.Sum(a=>a.ToCharArray().Count())< passwordLength)
            throw new Exception("密碼長度太長");
            
        if(passwordLength<strArr.Count())
            throw new Exception("密碼長度太短");
        
        if(strArr.Count()==0)
            throw new Exception("密碼條件規則不許為空");
    
        int partLength = (passwordLength / strArr.Count()) 
                          + ((passwordLength % strArr.Count()) == 0 ? 0 : 1);
        
        var finialArr = new List<char>();
        foreach(var item in strArr)
            finialArr.AddRange(GetCharArr(item, partLength));            
        var randomChars = GetCharArr(string.Join("", finialArr),finialArr.Count())
                                .Take(passwordLength).ToArray();
        return    string.Join("",randomChars);    
    }
    
    private IEnumerable<char> GetCharArr(string str, int number)
    {        
        return str.ToCharArray()
                    .OrderBy(a => r.Next())
                    .Take(number);
    }
}

用法

void Main()
{
    var pc = new PasswordCreator();
    Console.WriteLine(pc.GetPassword(8));
    Console.WriteLine(pc.GetPassword(6));
    Console.WriteLine(pc.GetPassword(4));
    Console.WriteLine(pc.GetPassword(3));
    Console.WriteLine(pc.GetPassword(15));
}

結果

bSIg7aQ3
wo9JS4
5wEr
9qQ
gWH0fO3IpPr912a

上面這段程式,花一點點時間寫的,沒有很嚴謹的測試,有 bug 記得要自己改啊,還有如果需要有更"困難"的字元,請自己加入就行啦,程式也不用啥改,各位大大如果有需要就拿去參考吧!記得看懂再用XD

PS:幫客戶設密碼,是有副作用的,就是...user 不會記密碼,會一直問你,然後你(業主)就要幫 user 重新設定密碼,這一點記得要跟業主打預防針啊!!!!!!

參考:
http://stackoverflow.com/questions/1287567/c-is-using-random-and-orderby-a-good-shuffle-algorithm

沒有留言: