【问题标题】:Will the MD5 cryptographic hash function output be same in all programming languages?MD5 加密哈希函数输出在所有编程语言中是否相同?
【发布时间】:2010-08-11 13:00:00
【问题描述】:

我基本上是在 php 中创建一个 API,它接受的参数之一是 md5 加密值。我对不同的编程语言以及 MD5 了解不多。所以我的基本问题是,如果我接受 md5 加密值,该值是否会保持不变,由 .NET、Java、Perl、Ruby 等任何编程语言生成。

否则会有一些限制或验证。

【问题讨论】:

  • 你应该使用 SHA512。
  • 您使用的是 md5 哈希而不是加密值。加密和散列不是一回事。
  • @Chris 虽然该方法的优点值得商榷,但您可以使用散列算法进行单向加密。
  • @glowcoder 虽然使用 hasing 算法作为加密算法值得商榷,但该方法的优点是特定于上下文的
  • 请记住,根据最近的研究,“MD5 应该被认为是密码损坏且不适合进一步使用”。 en.wikipedia.org/wiki/MD5

标签: md5


【解决方案1】:

是的,正确执行 md5 将产生相同的结果,否则 md5 将无法用作校验和。不同之处可能在于编码和byte order。您必须确保将文本编码为完全相同相同的字节序列。

【讨论】:

  • 应该提到的是,让事物具有完全相同的字节是一个不平凡的问题。文本编码,字节顺序,不胜枚举。
  • 还有换行符——我曾经遇到过一个非常烦人的错误,即 md5sum 在多个系统中不匹配,结果发现某些系统正在从输入文本中删除尾随换行符,而其他系统则没有.
  • 您的回答暗示本末倒置。 MD5 应该给你一种方法来保证你得到完全相同的字节。特拉维斯是对的,这是一个不平凡的问题。这就是存在这些校验和的原因,是为了确保您获得完全相同的字节。
  • @glowcoder 你对我的理解有点不正确。马在它的位置上,别担心。我说过,为了正确实现 md5 将为相同的输入字节产生相同的字节。重要的是将相同的文本转换为相同的字节。
【解决方案2】:

会的,但是有一个但是

这将是因为它被指定在给定重复的一系列字节的情况下可靠地产生相同的结果 - 关键是我们可以比较结果以检查字节没有改变,或者可能只是对 MD5 结果进行数字签名而不是签署整个源代码。

但是是错误的常见来源是对字符串的编码方式做出假设。 MD5 作用于字节,而不是字符,所以如果我们对字符串进行散列,我们实际上是在散列该字符串的特定编码。一些语言(尤其是一些运行时)偏爱特定的编码,而一些程序员习惯于对这种编码做出假设。更糟糕的是,一些规范可以对编码做出假设。这可能是导致两个不同实现将为同一字符串生成不同 MD5 哈希的错误的原因。在字符超出 U+0020 到 U+007F 范围的情况下尤其如此(并且由于 U+007F 是一个控件,因此它有其自身的问题)。

所有这些都适用于其他加密哈希,例如 SHA- 系列哈希。

【讨论】:

  • 感谢您的解释,据我所知,就您的观点而言,只要字符串的编码相同,无论编程语言如何,它都会产生相同的 md5 哈希。谢谢
  • 是的,换行符也必须相同。 MD5 保证使用相同的字节集得到正确的结果,错误是因为没有将正确的字节输入其中。
  • 为了让它变得有趣,当使用其中一种 Unicode 编码方案对文本进行编码时,某些编程语言可能会添加字节顺序标记。我什至看到 UTF-8 BOM 被广泛使用。显然这会导致不同的 MD5 散列。此外,一些实现将输出散列的 编码 版本,例如默认情况下,PHP 会愉快地生成一个 32 位的十六进制字符串,而不是 16 字节。
  • @owlstead UTF-8 BOM 在野外甚至都不是一件疯狂的事情,但是在比较哈希值时,您显然需要同时拥有它们,或者两者都没有。规范化形式是另一回事。 Canonical XML 规范的有趣之处在于他们必须考虑多少事情才能确保应该被视为相同的两条数据实际上是逐字节相同的。即使这样,它仍然会为大多数 XML 解析器认为等效的某些输入产生不同的输出。
  • @JonHanna 是的,幸运的是 Java XML digsig 和 XML enc 实现工作相对正常,但与一些专有应用程序通信有点麻烦。您不必在生成签名之前或之后格式化 XML :(
【解决方案3】:

是的。 MD5 不是加密函数,它是使用特定算法的hash function

【讨论】:

    【解决方案4】:

    是的,无论其来源如何,md5 哈希值始终是相同的 - 只要正确实施了底层算法。

    【讨论】:

      【解决方案5】:

      安全散列函数(如 MD5)的一个关键点是它们总是为相同的输入产生相同的值。

      但是,它确实需要您以相同的方式将输入数据编码为字节(或位)序列。例如,有很多方法可以对字符串进行编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2012-04-15
        • 2010-12-01
        相关资源
        最近更新 更多