使用ASP.NET标识散列旧的盐渍密码

时间:2014-03-25 22:06:36

标签: asp.net asp.net-identity

我有一个现有的会员资格数据库,其中密码是用户名和唯一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身份的实现似乎并不适合这样做,那么最佳选择是什么?

2 个答案:

答案 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,它完全符合您的要求。