【问题标题】:Storing and comparing multiple passwords with ServiceStack使用 ServiceStack 存储和比较多个密码
【发布时间】:2019-09-05 13:50:34
【问题描述】:

我正在尝试在我的应用程序中创建密码过期功能。已经设置了密码以及身份验证和更改密码。现在我想在 x 时间后提示用户更改密码。

当用户去更改他们的密码并且我的 Angular 前端发出该请求时,我希望我的 C# 服务堆栈 API 将给定的新密码与当前密码和之前的密码进行比较以检查是否重复。

我不担心细微的变化。例如,如果用户提交相同的密码但多了一个字符,那很好。我想做一个尽可能简单的开始。

密码存储在 MS SQL Server 中的两列 Salt varchar(8000)PasswordHash varchar(8000) 中。我已经完成了所有设置,我对如何将散列密码与用户提供的字符串进行比较感到非常困惑。然后将旧密码保存在新的散列列中。我已经在网络和 SOF 上搜索了三天,但我没有找到任何东西。任何指导将不胜感激。

【问题讨论】:

  • 使用新行,而不是新列。您可以像验证它们一样比较它们:根据您的算法对用户条目进行哈希处理并比较哈希值。如果它们不同,则密码不同。

标签: c# authentication passwords servicestack password-hash


【解决方案1】:

根据@Fildor 评论,您需要创建包含现有密码哈希值的密码更改审核历史记录。从 ServiceStack v5+ ServiceStack 切换到使用相同的 PBKDF2 密码散列算法 ASP.NET Identity v3 使用该算法将密码散列 + 盐 + 迭代 + 算法版本存储在 UserAuth 表上的单个 PasswordHash 字段中,所以你的密码审计历史表只需要一列来存储现有的密码哈希。

密码哈希算法可从IPasswordHasher 依赖项中获得,您可以在服务实现中使用它,例如:

public IPasswordHasher PasswordHasher { get; set; }

public object Any(AllowPassword request)
{
    var passwordHashes = MyRepo.GetExistingUserPasswords(GetSession().UserAuthId);
    foreach (var passwordHash in passwordHashes)
    {
        if (PasswordHasher.VerifyPassword(passwordHash, request.Password, out var neeedsRehash)
            throw new ArgumentException("Can't use existing password", nameof(request.Password));
    }

    return new AllowPasswordResponse();
}

【讨论】:

  • 好的,太棒了。在您回答之前,我试图使用SaltedHash.GetHashAndSaltString()。但是您的解决方案看起来更干净。
  • @marcusshep IHashProvider.GetHashAndSaltString() 是旧的哈希算法,将密码哈希、盐分存储在 2 个字段中。自 v5 以来的所有密码都使用较新的 IPasswordHasher 算法进行哈希处理。
  • 很遗憾,我们使用的是 ServiceStack v4。就像我在问题中提到的那样,盐和哈希存储在两个单独的字段中。所以,我的密码历史表必须有 UserId、Hash、Salt。 @mythz
猜你喜欢
  • 2012-05-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多