2010-06-17 106 views

回答

8

我們有一個偉大的討論前一陣子的最佳做法醃製密碼的時候,你可能會發現一些偉大的想法有:

Salting Your Password: Best Practices?

我發現,同時仍然一個最簡單的, 相當於安全,就是使用GUID作爲你的鹽。這是隨機的,足夠長的。如果包含GUID的字符串格式('{'和' - '字符),但最好不要。

請記住,鹽每個項目都必須是獨一無二的鹽,爲了最安全起見,您應該使用密碼安全的隨機數生成器。還要記住,你必須存儲你的鹽和密碼,否則你將無法檢查明文版本與散列版本!如果你喜歡,你可以存儲未加密的鹽;我通常把它放在與密碼相同的表格中。鹽的目的不是保持隱藏,而是要使得彩虹表很難(有希望不可能)及時計算。

這裏有一個快速的摘錄,在C#中的工作:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
byte[] buffer = new byte[1024]; 

rng.GetBytes(buffer); 
string salt = BitConverter.ToString(buffer); 
var saltedPassword = password + salt; 

或...

var salt = Guid.NewGuid().ToString(); 
var saltedPassword = password + salt; 
+3

如果您生成隨機鹽,請記住保留它們,因爲您需要它們在出口時解密。 – 2010-06-17 16:00:29

+0

@亞當:好點。我原本有這樣一句話,但顯然已經編輯出來了。我會把它放回去。 – Randolpho 2010-06-17 16:03:27

+1

不用擔心,+1對於一個很好的解釋:) – 2010-06-17 18:07:10

2

這是nice articleanother one(它更適合於ASP.NET應用程序)。

+1

第二條是更好的,因爲它允許任意鹽大小。第一個推薦一個4字節的鹽;絕對的方式來小。鹽應該很長。我不是在批評你,只是把它放在這裏作爲後代。 :) – Randolpho 2010-06-17 15:57:29

0

有沒有巫術,鹽只是一些隨機的文本附加到密碼來打敗字典攻擊 - 組成你自己的亂碼。

0

看一看像hmacdm5hmacsha1hmacsha256HMAC功能。
也請看System.Security.Cryptography命名空間。

+0

@downvoter:我想聽聽這個問題... thx – tanascius 2010-06-17 16:08:29

+0

我也是。 :S爲什麼會被低估? – 2010-06-17 16:45:39

+0

可能是因爲它不直接與鹽有關嗎?不確定... – 2010-06-17 19:28:02

4

我假設你正在與密碼一起詢問用戶名?

在某些系統中,用戶名被用作鹽。 (我認爲這樣做可以。) 否則,你需要將你的鹽存儲在某個地方,並在散列之前檢索它(在隨機創建的鹽的情況下)或者有一個算法將返回相同的鹽同一個用戶(並且使用普通用戶名並不會更好)。

個人使用下面的代碼:

byte[] GetSaltedPasswordHash(string username, string password) 
{ 
    byte[] pwdBytes = Encoding.UTF8.GetBytes(password); 
    // byte[] salt = BitConverter.GetBytes(userId); 
    byte[] salt = Encoding.UTF8.GetBytes(username); 
    byte[] saltedPassword = new byte[pwdBytes.Length + salt.Length]; 

    Buffer.BlockCopy(pwdBytes, 0, saltedPassword, 0, pwdBytes.Length); 
    Buffer.BlockCopy(salt, 0, saltedPassword, pwdBytes.Length, salt.Length); 

    SHA1 sha = SHA1.Create(); 

    return sha.ComputeHash(saltedPassword); 
} 
相關問題