密码哈希身份框架和盐

Posted

技术标签:

【中文标题】密码哈希身份框架和盐【英文标题】:Password hash Identity framework and salt 【发布时间】:2017-06-19 23:15:02 【问题描述】:

我的任务是确保用户在更改密码时不能使用以前的密码。为此,当身份框架对密码进行哈希处理时,我会存储他们密码的哈希值。

我的问题是如何比较用户新选择的密码的哈希和我保存的他们以前使用的密码的哈希?我需要考虑 Identity 框架使用的盐。

更新:我使用appUserManager.PasswordHasher.HashPassword(passwordToHash) 对密码进行哈希处理,但每次都会创建一个新哈希(我认为这是因为身份框架在内部使用了盐)。

【问题讨论】:

这个 aspnetcore 身份还是更早的版本? ASP.NET Identity v2.2 我会说覆盖 UserManager<TUser, TKey>.UpdateAsync(TUser user) 并使用后端历史记录表。如果用户正在更改他们的密码并且它是历史记录中的 N 个密码之一,请使用 IdentityResult.Failed("Cannot reuse password.") 拒绝他们。 我明白你所说的布拉德,但我想创建一个单独的类来执行检查以前的密码是否未使用以及其他验证。我的问题是当我使用appUserManager.PasswordHasher.HashPassword(passwordToHash) 时。我每次都会得到不同的哈希结果。 【参考方案1】:

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

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

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

hashedPassword 是您的历史哈希表中的一个值,providedPassword 是一个新的建议密码。

【讨论】:

这是有道理的。因此,我将无法对建议的密码进行哈希处理,然后查看哈希是否存在于包含先前哈希密码的表中。看起来我必须遍历所有现有的散列密码并比较每个密码。 正确!这是加盐和散列的重点。因为盐每次都不一样,所以你得到的哈希每次都会不同。将相同的密码哈希 10 次,您将获得 10 个不同的哈希值。所以是的,您必须遍历每个以前的密码并通过VerifyHashedPassword 比较它们。随着时间的推移,这可能会成为一个耗时的过程,因此我将存储的旧哈希数限制为 10-20。

以上是关于密码哈希身份框架和盐的主要内容,如果未能解决你的问题,请参考以下文章

密码哈希和盐如何存储在 Symfony 数据库中?

如何在 Python 中使用 scrypt 生成密码和盐的哈希值

针对 Scrypt 组合哈希验证 python 密码:(设置+盐+哈希)

C ++和PHP通用密码哈希标准

是否可以将 40 个字符的 SHA1 哈希转换为 20 个字符的 SHA1 哈希?

什么是Drupal的默认密码加密方法?