2010-01-23 47 views

回答

2

退房FormsAuthentication.HashPasswordForStoringInConfigFile

string hashMD5 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "MD5"); 

string hashSHA1 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "SHA1"); 
+0

此API現在已過時。 – 2014-02-25 08:55:10

2

我不認爲有一個單一的功能,但你可以在幾行做到這一點(這裏使用SHA512,但也有其他選項):

using (var sha = new SHA512CryptoServiceProvider()) 
{ 
    byte[] hashed = sha.ComputeHash(Encoding.Default.GetBytes(saltedPassword)); 
    string output = Convert.ToBase64String(hashed); 
} 

確保您使用的加密之一。 ..類以確保使用更安全的算法。

+4

很糟糕的計劃。沒有鹽的散列會受到彩虹表攻擊。你使用加密類很好,但你必須包含一個鹽來使這個答案有用。另外,最後一行應該使用'Convert.ToBase64String',它與'BitConverter.ToString'一樣快,併產生一個更短的字符串(在這種情況下爲88字節vs 192字節)。如果這兩個問題得到糾正,這可能會成爲最好的答案,恕我直言。 – 2010-01-23 04:33:17

+0

謝謝您的澄清。是的,顯然密碼應該在哈希之前被醃製,我想在這裏看到,但是我看到混淆來自哪裏。我會更新以更明確。感謝您提及Base64String轉換。 – 2010-01-23 14:59:51

+0

請不要使用任何哈希函數的單個傳遞,無論它是多麼好的函數。使用已知擅長密碼散列的方法 - SCrypt,BCrypt或PBKDF2(如.NET的RFC2898DeriveBytes)。雖然SHA-512是一種很好的加密散列函數,但由於2014年復古GPU上的64位操作性能較差,即使存在嚴重缺點,在單個8x電腦上的[oclHashcat](http://hashcat.net/oclhashcat/) AMD R9 290Xstock核心時鐘仍然可以嘗試每秒7.97億次猜測或每月2E15次猜測。 – 2014-03-29 01:45:37

1

不,你不應該使用MD5密碼散列!!!!!

不好!!!!!您也不應該通過單個哈希傳遞(md5或其他)執行salt +密碼!壞!!!!

也不應該做鹽+哈希密碼多次(每PBKDF2 unles XOR每個散列通的!壞!!!!

使用此API:https://sourceforge.net/projects/pwdtknet好!!!!!

1

是的,.NET Framework 2.0及更高版本(現在包括4.5版本)在一個名爲Rfc2898DeriveBytes的類中實現了PBKDF2(也稱爲RFC2898和PKCS#5v2),從技術上講它實現了PBKDF2-HMAC-SHA-1,與PBKDF2-HMAC-SHA-512一樣好,對於密碼散列仍然合理。

PBKDF2參數:

  • HMAC不是這個類的參數 - HMAC-SHA-1在此實現中已修復,因此您不必擔心它。
  • 密碼是用戶的密碼。
    • 明文在散列後當然會被丟棄。
  • salt是一個足夠長度的密碼隨機每行字符串(例如至少8個字節)。每個密碼都需要它自己的隨機鹽,所以如果300個用戶都選擇「P @ $$ w0rd」作爲他們的密碼,則散列結果都是不同的。
    • 鹽以明文形式存儲在數據庫中;您下一次生成密碼哈希時需要它,以查看結果是否相同。
  • 迭代次數是你要循環的次數。對於任何臺式機或服務器硬件,從數萬開始直到它受傷。
    • 迭代的次數也應該以明文形式存儲在數據庫中,以便稍後改變這個數字是微不足道的(即,隨着處理能力的增加使其更高)。
  • .GetBytes是輸入長度,你猜對了,字節。在這種情況下,你應該使用20。
    • 原因(高級討論):對於密碼散列,這應該永遠不會超過本機散列大小,因爲攻擊者不需要生成更多的內容(並且生成本地散列大小+ 1個字節需要兩倍的時間,因爲它會爲輸出長度中的每個本機散列大小量啓動一組全新的迭代,並將結果連接在一起 - 攻擊者可以安全地假設,如果第一個輸出匹配,它將全部匹配,並且100%確定如果第一個塊失敗,這不是一個匹配)。由於此類僅限於SHA-1,因此本機散列大小爲20個字節。如果您使用另一個具有該選項的庫,SHA-256是32字節,SHA-512是64字節。

注意HMACSHA512 versus Rfc2898DeriveBytes for password hash包含我還沒有詳細地分析某些示例.NET代碼,但也可以是一個有用的起點。

+0

關於它如何比「FormsAuthentication.HashPasswordForStoringInConfigFile」更好/更差的評論? – 2014-02-25 03:38:15

+1

RFC2898要好得多,即使有1個虛擬迭代計數 - 在成千上萬的合理迭代計數下,成倍提高數萬倍!他們從微軟自己的[注意:這個API現在已經過時。](http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile(v = vs.110).aspx )並繼續完成「這只是(幾乎可以肯定)沒有影響的MD5或SHA-1!不要這樣做!!!」基於[代替FormsAuthentication.HashPasswordForStoringInConfigFile?](https://stackoverflow.com/q/13527277/1967612) – 2014-02-25 03:44:20