我有一個現有的會員數據庫,其中密碼是用戶名和唯一ID的哈希。據我所知,ASP.NET身份將負責爲您提供密碼。使用ASP.NET身份對傳統鹽漬密碼進行哈希處理
但是,我需要我的舊哈希密碼才能工作,直到他們更新(即他們需要在第一次登錄時工作,我將更新它)。
該IPasswordHasher
有方法:VerifyHashedPassword(string hashedPassword, string providedPassword)
。這種方法不允許我傳入任何種類的鹽。我意識到我不需要爲任何新的哈希密碼提供值,但對於我現有的密碼,我需要執行傳統檢查。
public class CoolGuyPasswordHasher : PasswordHasher {
public IdentityContext DbContext { get; set; }
// Custom hashing used before migrating to Identity
public static string GetSHA1Hash(string password, string guid) {
string passWithSalt = String.Concat(password, guid);
return FormsAuthentication.HashPasswordForStoringInConfigFile(passWithSalt, "SHA1");
}
// Verify if the password is hashed using SHA1. If yes, rehash using ASP.NET Identity Crypto which is more secure
public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword) {
//I can't pass in my salt!
if (String.Equals(hashedPassword, GetSHA1Hash(providedPassword, wheresTheSalt), StringComparison.InvariantCultureIgnoreCase)) {
ReHashPassword(hashedPassword, providedPassword);
return PasswordVerificationResult.Success;
}
return base.VerifyHashedPassword(hashedPassword, providedPassword);
}
}
在上面的代碼段,通知在調用GetSHA1Hash
,我沒有在通過第二個參數。
我怎麼能去這樣做我的遺產鹹密碼檢查?在新系統中,我想我可以使用散列式密碼作爲用戶名+ id的結果。但是,由於ASP.NET身份的實現似乎並沒有迎合這一點,我最好的選擇是什麼?
感謝您的回覆。由於我需要知道何時連接(舊密碼)和何時不連接,使用現有散列的長度作爲以前是否用SHA1散列的指示器是否安全?根據文檔(http://msdn.microsoft.com/en-us/library/system.web.helpers.crypto.sha1(v=vs.111).aspx)SHA1哈希將是40個十六進制字符。我知道ASP.NET Identity使用「Crypto.HashPassword」(http://msdn.microsoft.com/en-us/library/system.web.helpers.crypto.hashpassword(v = vs.111))。 ASPX)。那個哈希值可以是40個字符嗎? –
是的,聽起來像一個合理的方法。哈希大小是恆定的。 –