密码哈希、身份验证框架和盐值

6
我被委托确保用户在更改密码时不能使用以前的密码。为此,当身份验证框架对密码进行哈希处理时,我存储其哈希。我的问题是如何比较用户新选择的密码的哈希和之前保存的密码的哈希?我需要考虑到身份验证框架正在使用的盐。更新:我使用appUserManager.PasswordHasher.HashPassword(passwordToHash)来哈希密码,但每次都会创建一个新的哈希(我认为这是因为Identity框架在内部使用盐)。

这是Asp.Net Core Identity还是早期版本? - Brad Christie
ASP.NET Identity v2.2 - webworm
我建议重写 UserManager<TUser, TKey>.UpdateAsync(TUser user) 方法,并使用后端历史记录表。如果用户正在更改密码,并且这是历史记录中的 N 个密码之一,则使用 IdentityResult.Failed("Cannot reuse password.") 拒绝他们。 - Brad Christie
我明白你的意思,Brad,但我想创建一个单独的类来执行检查以确保之前使用过的密码以及其他验证。我的问题是,当我使用 appUserManager.PasswordHasher.HashPassword(passwordToHash) 时,每次都会得到不同的哈希结果。 - webworm
1个回答

4

用户的当前密码哈希值存储在表/列 AspNetUsers.PasswordHash 中。这也可以通过 EF 获得:ApplicationDbContext.Users.PasswordHash

因此,您需要创建自己的表,引用用户表并在每次更改密码时将先前的哈希复制到您的表中。

下一步是验证新密码与旧哈希值中的任何一个都不匹配。为此,您需要使用 Microsoft.AspNet.Identity.PasswordHasher.VerifyHashedPassword(string hashedPassword, string providedPassword)

其中hashedPassword是来自历史哈希值表的值,providedPassword是新的建议密码。


那很有道理。所以我将无法对建议的密码进行哈希,然后查看哈希是否存在于保存先前哈希密码的表中。看起来我将不得不循环遍历所有现有的哈希密码并逐个比较。 - webworm
1
正确!这就是加盐和哈希的目的。因为每次盐的值都不同,所以生成的哈希值也会每次都不同。对同一个密码进行10次哈希,你将得到10个不同的哈希值。因此,是的,你将需要通过VerifyHashedPassword循环比较每个先前的密码。随着时间的推移,这可能变成一项耗时的过程,因此我建议将旧哈希值存储的数量限制在10-20个左右。 - trailmax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接