【问题标题】:MD5 Hash From String来自字符串的 MD5 哈希
【发布时间】:2012-10-10 08:39:49
【问题描述】:

需要从字符串中获取 MD5 哈希值。
得到错误 MD5 为空。
我想从字符串中获取 32 个字符的 MD5 哈希。

using (System.Security.Cryptography.MD5 md5 = 
       System.Security.Cryptography.MD5.Create("TextToHash"))
{
    byte[] retVal = md5.Hash;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < retVal.Length; i++)
    {
        sb.Append(retVal[i].ToString("x2"));
    }
}

【问题讨论】:

    标签: .net md5


    【解决方案1】:

    您获得null 返回的原因是Create 方法的string 参数指定了算法,而不是被散列的文本。没有 TextToHash 算法,因此您得到 null 作为回报。

    【讨论】:

      【解决方案2】:

      传递给Create 的字符串不是“要散列的文本”,而是要使用的算法。我怀疑你想要:

      using (System.Security.Cryptography.MD5 md5 = 
         System.Security.Cryptography.MD5.Create())
      {
          byte[] retVal = md5.ComputeHash(Encoding.Unicode.GetBytes("TextToHash"));
          StringBuilder sb = new StringBuilder();
          for (int i = 0; i < retVal.Length; i++)
          {
              sb.Append(retVal[i].ToString("x2"));
          }
      }
      

      【讨论】:

      • 嗨 Reed:我有一个问题:我怎么知道要使用哪种编码?就我而言,我需要计算一个作为查询字符串收到的哈希值。 (所以当它发布 http 时,它可能是 UTF-8),但是,一旦它存储在一个 .Net 字符串中,它现在会是 Unicode(UTF-16)吗,因为那是本机编码?这种转变发生在我身上吗?
      • @JMarsch 是的 - 如果您使用 Encoding.Unicode,如果它最初是 UTF-8,它可能会“正常工作”。
      • 请记住,如果您的“源”MD5 是根据字符串的 utf-8 表示形式计算的,那么如果您现在使用 utf-16 代替,您将获得不同的 MD5。即使字符串中只有 ASCII 字符也是如此。
      • 使用 Encoding.Unicode 而不是 UTF 8 将导致与大多数 Javascript 库在客户端生成的哈希值不同 - 大多数转换为 utf8。这不会使答案出错,但如果有人在客户端和服务器上获得不同的 MD5 哈希值,我仅将其写为警告 - 字符串的初步编码可能会受到关注并让人认为存在错误。
      【解决方案3】:

      需要从字符串中获取 MD5 哈希。

      那么首先你需要将你的字符串转换成某种形式的二进制数据。你如何做到这一点取决于你的要求,但对于某些编码,它可能是Encoding.GetBytes...你需要弄清楚 which 编码。例如,此哈希是否需要与在其他地方创建的哈希相匹配?

      得到一个错误 MD5 为空。

      那是因为您错误地使用了MD5.Create。参数是一个算法名称。您几乎可以肯定只使用parameterless overload

      我怀疑你想要类似的东西:

      byte[] hash;
      using (MD5 md5 = MD5.Create())
      {
          hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
      }
      // Now convert the binary hash into text if you must...
      

      【讨论】:

      • 如果它来自 SQL vachar(max),UTF8 会是最好的选择吗?
      • re:无参数重载 - 默认算法是否存在从一个 .Net 版本更改为下一个版本的风险?如果是这样,那么从一个版本到下一个版本的相同字符串的哈希值将不匹配?
      • @xanadont:不。MD5 是一种标准化算法。结果变化基本上是一个错误。
      • 优秀。谢谢@JonSkeet
      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      相关资源
      最近更新 更多