【问题标题】:Is there a way to test if a string is an MD5 hash?有没有办法测试字符串是否是 MD5 哈希?
【发布时间】:2009-11-11 14:17:56
【问题描述】:

我正在尝试将包含 MD5 哈希和关键字(每行一个)的文本文件输入到 C# 应用程序中。有没有办法检查字符串是否是 MD5 哈希?我在 MSDN 上查看,在 MD5 类中找不到任何内容。

【问题讨论】:

  • 您可以发布文件内容的示例吗?数据有什么规律吗?
  • 不幸的是,我不能。我没有用于测试我的应用的真实文件。

标签: c# md5


【解决方案1】:

像这样使用正则表达式:

public static bool IsMD5(string input)
{
    if (String.IsNullOrEmpty(input))
    {
        return false;
    }

    return Regex.IsMatch(input, "^[0-9a-fA-F]{32}$", RegexOptions.Compiled);
}

【讨论】:

  • 这个 94476226E1DD479C8E1FAB7A8FDEFFFA 不起作用,正确的正则表达式是 [0-9a-fA-F]{32}
  • 实际上,如果您不能设置不区分大小写的标志,正则表达式应该是^[0-9a-f]{32}$(带有不区分大小写的/i 标志)或@EduardFlorinescu 建议的^[0-9a-fA-F]{32}$。因为[0-9a-f]{32} 也匹配更长的字符串,这可能会发生,但这不会是某个东西的 MD5,而只是任何随机的十六进制编码数据。
  • 这对于像“CBHc/dgtzBCG/xGe8wGBJA==”这样的 MD5 不起作用,顺便说一下,这是一个数字
【解决方案2】:

嗯,MD5 哈希实际上只是二进制数据——如果你有一个字符串,那么它可能是以某种方式编码的,例如base64 或十六进制。您可以测试字符串是否正确编码为正确长度的二进制(16 个字节)。仅此而已 - 虽然 可能 存在永远不是散列任何数据的结果的二进制值,但我非常怀疑您能否识别这些值。理想情况下,当然不应该有这样的值......

【讨论】:

    【解决方案3】:

    MD5 哈希是一个 128 位的值。它通常表示为长度为 16 的byte[],或表示为string,其中每个字节由两个十六进制数字表示。 MD5 哈希没有内部结构或任何类型的“签名”,可让您检测 128 位值是否为 MD5 哈希。

    【讨论】:

      【解决方案4】:

      如果它的 32 字节长和 0-9 a-f 它可能是 md5,但不是 100%

      【讨论】:

        【解决方案5】:

        首先要做的是检查文件以找出 MD5 哈希是如何编码的,然后根据它设计匹配。

        【讨论】:

          【解决方案6】:

          我认为正确的是这个,它还包括大写字母,有时哈希也出现在大写字母中,所以为什么会错过。

          [0-9a-fA-F]{32}
          

          [0-9a-f]{32}(?i)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-09
            • 2012-02-27
            • 2019-08-08
            • 2014-11-26
            相关资源
            最近更新 更多