我有一个现有的会员资格数据库,其中密码是用户名和唯一ID的哈希值。据我了解,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身份的实现似乎并不适合这样做,那么最佳选择是什么?
答案 0 :(得分:2)
现代盐的存储方式是它们只是添加到哈希密码值中(参见:http://brockallen.com/2012/10/19/password-management-made-easy-in-asp-net-with-the-crypto-api/)。因此,您可能必须修改( ahem hack up)UserManager以从单独的列加载salt并将其作为散列密码的一部分传递给密码hasher。
答案 1 :(得分:0)
我发现了this条;它有代码示例扩展UserManager并使用精心设计的PasswordHasher,它完全符合您的要求。