【问题标题】:Asp.net Core PasswordHasher<T> issueAsp.net Core PasswordHasher<T> 问题
【发布时间】:2016-11-01 04:38:25
【问题描述】:

我需要在数据库中存储用户名和密码。密码显然应该加密。我们确实有一些旧代码,我们的一些其他网站使用这些代码来加密密码,但我不确定这是否安全。

我正在研究使用 Asp.net Core PasswordHasher 类。

我是这样使用的:

    PasswordHasher<string> pw = new PasswordHasher<string>();

    string s1 = pw.HashPassword("Bob", "Apple");
    string s2 = pw.HashPassword("Bob", "Apple");

    var v1 = pw.VerifyHashedPassword("Bob", s1, "Apple");
    var v2 = pw.VerifyHashedPassword("Bob", s2, "Apple");

v1 和 v2 都成功了,但由于某种原因 s1 和 s2 不相等(可能是随机盐?)。

PasswordHasher 是否以任何方式与机器绑定?应用程序将在网络场中运行,因此它应该独立于机器并在场中的所有机器上进行验证。

这是一种加密安全的密码存储方式吗?

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:
    • 每个哈希都有一个加密安全的盐。
    • 盐被预先添加到哈希中。
    • 它没有以任何方式链接到机器。

    在底层它使用 PBKDF2,具有 SHA256 和 10,000 次迭代,除非您使用 V2 兼容性(除非必须,否则不要使用 V2 兼容性)

    如果您不想引入 Identity,可以使用它调用的 raw function,但您应该坚持使用相同的算法和迭代次数。

    【讨论】:

    • 关于原始函数调用:我使用 ASP.NET Core 数据保护堆栈创建了一个独立(不依赖于身份)密码哈希:github.com/henkmollema/CryptoHelper
    • 那么,我说得对吗,使用OP中的示例,我们只需要存储哈希?我一直在阅读不同的博客,其中也有存储盐的示例。这不再是最佳实践了吗?谢谢。
    【解决方案2】:

    这是设计使然;每个散列密码都有一个随机盐。

    这可以防止攻击者查看用户是否拥有相同的密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2020-06-02
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多