2014-03-19 54 views
4

我們正在將我們的用戶驗證從提供的.NET實現遷移到我們自己的系統。重現SqlMembershipProvider密碼哈希

我們希望能夠支持aspNet_Membership表中存在的舊密碼。

Password和Salt駐留在該表中,因此理論上我們可以重新計算SqlMembershipProivder正在使用的散列。

但是,我似乎無法找到任何描述正在使用的算法。接受會員提供商告訴我它正在使用HMACSHA256來計算哈希值。

但是,存儲的密碼散列長度爲20個字節,告訴我他們必須做的不僅僅是計算密碼和salt的sha256散列。

會員供應商能說謊嗎?它是在封面下使用SHA1還是RIPEMD?或者,如果我只能訪問他們正在使用的加密提供程序,那麼我只需將舊密碼和鹽傳遞給它即可......我不一定需要重新發明輪子。

+0

謝謝你注意到的哈希長度!我一直在努力重現哈希整天。 SHA1哈希值是20個字節。你的觀察導致我只是嘗試使用SHA1來進行手動散列。果然,它匹配我的MembershipProvider,它聲稱它使用HMACSHA256('Membership.HashAlgorithmType' =「HMACSHA256」),生成!進展。現在唯一的問題是,「WTF?」 – xr280xr

回答

-2

如果密碼格式爲1,那麼你不能重新計算哈希 - 它是一個不可逆的算法。

您可以隨時更改每個用戶的密碼格式並設置新密碼。

+1

重新計算散列並不是逆轉它。如果你不能重新計算散列值,散列值就沒用了。 – xr280xr

1

是的,會員類可能會說謊。看起來SqlMembershipProvider必須具有passwordCompatMode=Framework40屬性才能實際使用ASP.NET 4中添加的散列和加密選項。如果沒有,它將使用忽略成員身份散列算法並默認爲SHA1的舊式兼容模式。創建SqlMembershipProvider的一個實例,並查看調試器中的_LegacyPasswordCompatibilityMode屬性以及私有s_HashAlgorithm成員(只在獲取密碼後才設置)。他們可能會分別向你展示「Framework20」和「SHA1」。感謝你的問題,它幫助我找到答案。

這裏是我的問題,並與更多的細節回答:https://stackoverflow.com/a/34280119/263832