2013-06-04 45 views
0

我目前正在研究一個具有明文密碼的項目。現在我們需要將所有明文密碼更改爲HASH。 數據庫具有密碼字段和密碼鹽字段。將明文密碼轉換爲散列 - 相同的鹽

我在.Net(我發現.Net 4使用HMACSHA256算法)中嘗試了下面的內容來將密碼與已經在數據庫中的salt進行哈希。

// I retrieved the password and salt from database and hashed it 
string authDetails = row["Password"] + row["PasswordSalt"].ToString(); //password salt - value from database 
byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(authDetails); 

var hma = new System.Security.Cryptography.HMACSHA256(); 
byte[] hashedBytes = hma.ComputeHash(authBytes); 
string hash = Convert.ToBase64String(hashedBytes); 

並將上述散列var值存儲在密碼字段中。

我改變了配置設置passwordFormat =「hashed」。

如果我嘗試使用密碼登錄,則登錄失敗。我無法使用舊密碼登錄。有任何想法嗎?

謝謝!

編輯:只是爲了澄清.. 我使用asp.net會員提供。我在web.config中將PasswordFormat更改爲'Hashed'。然後我調用Membership.ValidateUser來驗證登錄。 - 我認爲它會自動散列輸入的密碼並與數據庫匹配。但我認爲通過validateuser方法生成的哈希與上面生成的哈希不同。

+0

你是怎麼告訴密碼檢查算法使用哪種鹽的? –

+1

不是*完全*你如何編寫一個散列表......你基本上把密碼散列,把salt加到散列算法上,而不是串聯密碼和鹽,然後散列。 –

+3

@ J.Steen:不一定。從維基百科關於醃製的文章中:「在典型的設置中,鹽和密碼連接在一起並使用加密散列函數進行處理」。 –

回答

0

你不需要使用使用hashmac,但只是像sha256哈希。在hashmack的一點是,當密鑰用於驗證消息被使用,但不需要密碼鹽醃(hashmac需要額外的參數是密鑰)

所有你需要的是

sha256(password + salt) 
+0

謝謝,用這個來散列System.Security.Cryptography.SHA256CryptoServiceProvider(); (密碼+鹽)即使然後我無法登錄 – user1165815

+0

你說的方式來痛這個密碼,你怎麼然後檢查密碼對數據庫? –

+0

我使用asp.net會員提供程序。我在web.config中將PasswordFormat更改爲'Hashed'。然後我調用Membership.ValidateUser來驗證登錄。 - 我認爲它會自動散列輸入的密碼並與數據庫匹配。但我想這裏生成的散列不像我上面生成的散列相同。 – user1165815

0

如果我嘗試使用密碼登錄,則登錄失敗。我無法使用舊密碼登錄。有任何想法嗎?

當您登錄時,您相信提供的用戶名是正確的,並使用它來查找用戶的鹽。然後,使用用戶輸入的salt和密碼來計算哈希值,方法與第一次更新密碼時的方式相同。現在您可以將其與存儲的密碼進行比較。

因此,你需要這樣的代碼:

string GetSalt(string username) 
{ 
    string sql = "SELECT PasswordSalt FROM [users] WHERE username= @username"; 
    //connect to database and return that result 
} 

string ComputeHash(string username, string password) 
{ 
    string salt = GetSalt(username); 

    //should actually concatenate byte arrays, not strings 
    byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(password + salt); 
    var hma = new System.Security.Cryptography.HMACSHA256(); 
    byte[] hashedBytes = hma.ComputeHash(authBytes); 
    return Convert.ToBase64String(hashedBytes); 
} 

bool Login(string username, string password) 
{ 
    string hash = ComputeHash(username, password); 

    string sql = "SELECT COUNT(*) FROM [users] WHERE username= @username AND Password= @Hash"; 
    // run that and make sure you get a row back 

} 
+0

我改變了密碼格式爲'哈希'在web.config ..所以你提到的上述步驟將自動完成.net時,我調用Membership.ValidateUser,是否正確? – user1165815

+0

很好,你正在使用會員供應商。你需要閱讀:http://stackoverflow.com/questions/5798638/convert-asp-net-membership-passwords-from-encrypted-to-hashed –

2

HMAC是一個加密散列/家庭哈希。當您生成一個新的實例時,.net會將該密鑰初始化爲一個隨機值。所以你得到了一個不同的家庭成員,從而得到不同的結果。

原則上,您可以切換到普通的SHA256或使用鹽作爲密鑰,即HMACSHA256(key=salt,message=password)。但這是一個糟糕的主意。

你應該使用專門的密碼哈希函數,這是很慢的。有關密碼散列的詳細信息,請參閱How to securely hash passwords? on security.SE。在.net中有Rfc2898DeriveBytes,它實現了PBKDF2-HMAC-SHA1。

+0

+1海報技術上要求如何遷移他現有的內置。網絡會員提供商通過改變設置它糟糕的單哈希版本,但我更喜歡你的答案。 – jbtule