2012-01-19 83 views
0

我正在研究一些C#安全代碼,並且當我看到它正在使用HMACSHA1類時即將替換它。該代碼用於散列密碼以存儲在數據庫中。引起我注意的事情是,它使用密碼作爲HMAC密鑰,這正是計算哈希的密碼。那麼是使用密鑰和哈希的東西的數據好嗎?這會使安全性變得更強還是更弱?HMAC SHA1使用相同的密鑰和消息值

僞代碼:

string pwd = "[email protected]#123$"; 

using (HMACSHA1 hasher = new HMACSHA1()) 
{ 
    hasher.Key = encoding.GetBytes(pwd); // using password for the key 
    return BytesToHex(hasher.ComputeHash(encoding.GetBytes(pwd))); // computing the hash for the password 
} 

回答

3

它是關於與兩次迭代的無鹽SHA1哈希強。即非常弱。

缺乏鹽可以讓攻擊創建彩虹表,或者只是同時攻擊數據庫中的所有密碼哈希。

由於攻擊者可以簡單地嘗試更多的密碼候選項,因此低迭代次數使得攻擊速度更快。

您應該添加一個salt,並使用較慢的哈希方法,例如PBKDF2和bcrypt。 .net類Rfc2898DeriveBytes實現了PBKDF2,所以我推薦使用那個。

1

我不會推薦HMACSHA1用於數據庫密碼存儲,但將密鑰設置爲與密碼相同確實會削弱密鑰在此目的中的用處。密鑰應該是祕密的,用於確定底層哈希數據是否已經改變。

對於密碼,您應該使用SALT +密碼組合來增加HASH算法的安全性。我通常使用對用戶唯一的SALT,但與密碼不同,例如用戶號碼或初始註冊IP地址。

另外,請記住,SHA1不再被推薦爲哈希算法。

爲了更清楚地理解,您可以參考MSDN

此屬性是密鑰散列算法的關鍵。

基於散列的消息認證碼(HMAC)可用於確定 發送通過不安全信道的消息是否已經 篡改,只要發送者和接收者共享祕密 密鑰。發件人計算原始數據的散列值,並且將原始數據和HMAC作爲單個消息發送。接收器重新計算接收到的消息上的散列值,並檢查計算出的散列值與發送的散列值是否匹配。

HMAC可以與任何迭代加密散列函數一起使用,例如 與MD5或SHA-1結合使用一個祕密共享密鑰。 HMAC的密碼強度取決於底層散列函數的屬性。

對數據或散列值的任何更改都會導致不匹配 ,因爲需要知道密鑰才能更改消息 並重現正確的散列值。因此,如果原始計算的哈希值和 匹配,則會對消息進行身份驗證。