【问题标题】:Computehash method in .net core.net core 中的 Computehash 方法
【发布时间】:2020-12-27 15:24:59
【问题描述】:

我正在使用下面的代码来比较数据库中的密码。

using (var hmac = new HMACSHA512())
{
    var computedHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));                
    using (var hmac1 = new System.Security.Cryptography.HMACSHA512())
    {
        var computedHash1 = hmac1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
    }
    var computedSalt = hmac.Key;
    for (int i = 0; i < computedHash.Length; i++)
    {
        if (computedHash[i] != passwordHash[i])
        {
            return false;
        }
    }
    return true;
}

分析我发现,当我们创建一个HMACSHA512()的新对象时,它会创建一个新的计算哈希,因此来自数据库的密码无法匹配ComputedHash。 如上所示,“computedHash”和“computedHash1”对于同一个字符串是不同的。

【问题讨论】:

  • 您为什么要发明自己的身份验证系统?您使用 HMACSHA512 的事实意味着您不应该这样做,它不是适合这项工作的工具。这是一种消息签名算法,而不是安全的密码散列算法。只需使用 Identity 进行帐户管理。
  • 你永远不会给你的哈希器一个种子。这意味着它理论上永远不会以相同的方式对相同的字符串进行两次哈希处理。
  • @CodeCaster 是的,我同意,我只是在尝试。

标签: c# .net asp.net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

您正在调用无参数构造函数,即documented,其中:

使用此构造函数,使用 64 字节、随机生成的密钥。

基本上,您应该为散列提供一个键 - 如果您每次创建散列时都向构造函数提供相同的键,那么每次都会得到相同的结果。

您可以通过为hmac1 提供与hmac 相同的密钥来检查现有代码:

using (var hmac1 = new System.Security.Cryptography.HMACSHA512(hmac.Key))

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2012-10-15
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多