【问题标题】:SHA1Managed doesn't produce the expected SHA1 hashSHA1Managed 不会产生预期的 SHA1 哈希
【发布时间】:2013-12-20 17:10:05
【问题描述】:

我有一个 Excel 工作簿,目前用作预订日记。它的用户/密码存储在数据库中,密码使用 SHA1 进行哈希处理(目前没有盐以使这更容易)

当我使用密码 password 存储用户时,我在数据库中得到以下哈希:

5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

这是通过尝试字符串 herehere 来备份的,两者都给出与我的 VBA SHA1 函数相同的结果

所以现在我想将此应用程序移动到 C# 中(最终可能是 ASP.NET Web 应用程序),所以我使用以下内容来生成 SHA1 哈希:

// Convert plain text into a byte array
byte[] plainTextBytes = Encoding.Default.GetBytes("password");

// Define hash object
HashAlgorithm hash = new SHA1Managed();

// Compute hash value of our plain text
byte[] hashBytes = hash.ComputeHash(plainTextBytes);

// Convert result into a base64-encoded string
string hashValue = Convert.ToBase64String(hashBytes);

Console.WriteLine(hashValue);

但是这个输出

W6ph5Mm5Pz8GgiULbPgzG37mj9g=

我一定是做错了一些小事,但我不知道它是什么:(。我尝试了不同的编码类型(UTF8、ASCII、Unicode),但都没有产生正确的哈希

有人可以帮我解释一下吗?

【问题讨论】:

  • 你应该避免Encoding.Default。这是系统特定的,在不同的系统上可能会有所不同。在这种情况下,对于任何包含非 ASCII 字符的密码,它可能会产生不同的结果。 UTF-8 几乎总是您想要的,尽管您可能想检查旧系统中使用的是哪种编码。

标签: c# hash cryptography sha1


【解决方案1】:

您将字符串转换为 base64,尽管您似乎需要十六进制。改为十六进制。

【讨论】:

    【解决方案2】:

    您应该将 hashBytes 转换为 HexString,而不是 Base64。

    【讨论】:

      【解决方案3】:
       string hashValue = Convert.ToBase64String(hashBytes);
      

      这就是问题陈述,你引用的结果字符串不是base64编码的,它是用十六进制编码的。你会得到你正在寻找的价值:

       string hashValue = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
      

      产生:

      “5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8”

      【讨论】:

        猜你喜欢
        • 2018-05-23
        • 2012-02-05
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多