2011-07-11 105 views
1

我試圖將用戶密碼存儲在我的程序中,但我不想以純文本形式存儲它。因此,我將其散列並存儲起來,而當用戶需要在程序啓動時輸入密碼(以防止未經授權的用戶)時,我將輸入的密碼散列並對兩個散列進行比較。SHA1散列算法問題

但是,以下代碼爲幾乎所有輸入的密碼生成相同的散列。任何人都可以告訴我如何修復下面的代碼,或指導我更好的散列函數?

public static string getSHA1(string userPassword) 
{ 
    return BitConverter.ToString(SHA1Managed.Create().ComputeHash(Encoding.Default.GetBytes(userPassword))).Replace("-", ""); 
} 

感謝您的任何幫助。

+1

使用服用點你應該用鹽醃SHA512散列,或最好,bcrypt。 – SLaks

+0

@SLaks:你想提供一些代碼嗎?我對加密遊戲非常陌生,需要我所能獲得的所有幫助。如果你願意,我會很樂意接受它作爲答案!如果沒有,謝謝你的開頭。 – CODe

+0

http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx – geofftnz

回答

0

我把你的函數插入到一個新的項目中,它似乎工作正常,所以檢查密碼是如何提供給函數的。我會小心使用Encoding.Default而不是明確的編碼,因爲它說它是系統相關的。

這是我做的一個:

public static string getSHA1(string userPassword) 
    { 
     return Convert.ToBase64String(new SHA1Managed().ComputeHash(Encoding.Unicode.GetBytes(userPassword))); 
    } 

注:如在評論中指出,這樣做密碼存儲/這樣的匹配不好:

    您使用的是快速散列算法
  • 。你想要密碼哈希緩慢來緩解暴力攻擊。 Bcrypt做得很好。
  • 你不會醃製你的散列。 Salting意味着在散列之前向密碼添加一些隨機數據,然後將隨機數據與散列一起存儲。這使得彩虹表(對密碼地圖的巨大散列)毫無用處。
+0

非常感謝這些信息。我應該使用單一鹽進行散列嗎? – CODe

+0

不,您的鹽必須爲每個用戶不同。目的是迫使攻擊者單獨暴力破解每個用戶的密碼,而不是能夠並行處理每個用戶。 – geofftnz

+0

我明白了,所以對於每個用戶,單個salt值可以用於所有散列,但每個用戶需要不同的salt。再次感謝! – CODe

1

這樣

private static string GetSHA1(string text) 
    { 
     UnicodeEncoding UE = new UnicodeEncoding(); 
     byte[] hashValue; 
     byte[] message = UE.GetBytes(text); 

     SHA1Managed hashString = new SHA1Managed(); 
     string hex = ""; 

     hashValue = hashString.ComputeHash(message); 
     foreach (byte x in hashValue) 
     { 
      hex += String.Format("{0:x2}", x); 
     } 
     return hex; 
    }