如何测试 MD5 实现?

How to test an MD5 implementation?

我正在考虑使用 JS MD5 implementation

但是我注意到只有几个测试。有没有好的方法验证实现是否正确?

我知道我可以尝试使用几个不同的值,看看它是否有效,但这仅意味着它对某些输入是正确的。我想看看它是否对所有输入都正确。

相应的RFC对算法有很好的描述,用C语言实现的例子,最后还有一些测试值。这三者一起让您对所检查的实现的质量做出一个很好的猜测,这就是您所能得到的:一个很好的猜测。

即使在大多数情况下,测试具有无限或至少非常大的输入集作为黑盒的应用程序是困难的,甚至是不可能的。所以你必须检查代码是否正确地实现了算法。 RFC-3121(链接到上面)中描述了该算法。此描述足以实现。该算法本身是众所周知的(在科学意义上,即:关于它的许多论文已被撰写并发现了许多缺陷)并且足够简单,可以跳过正式部分,只需检查实现即可。

JavaScript 中 MD5 的预期问题:输入一个或多个零字节(您可以彻底检查一字节和两个字节长的输入),字节顺序(应该没问题但易于检查)和JavaScript 中 bit-manipulation 所使用的无符号整数的问题(“>>”与“>>>”的对比,但也很容易检查)。我还将使用少量设置了所有位的数据进行测试。 该算法也需要填充,您可以检查所有可能的长度小于限制的输入。

哦,对于所有拒绝 MD5 哈希的人来说:它仍然可以用作具有低 collision-rate 和良好混合的快速 non-cryptographic 哈希(有些人称效果为混合“雪崩”,输入中的一位变化会改变输出中的许多位)。我仍然将它用于更大的 non-cryptographic Bloom-filters。是的,应该使用适合预期输入的特殊散列,但是构建这样的散列函数在 body 大自然给我们的部分中是一件痛苦的事。