我正在考虑使用 JS MD5 implementation .
但我注意到只有几个测试。有没有好的方法来验证实现是否正确?
我知道我可以尝试使用几个不同的值,看看它是否有效,但这仅意味着它对于某些输入是正确的。我想看看它是否对所有输入都正确。
最佳答案
对应RFC对算法有很好的描述,有一个用 C 语言实现的示例,最后还有一些测试值。这三者结合起来可以让您对所检查的实现的质量做出一个很好的猜测,这就是您所能得到的:一个好的猜测。
测试具有无限或至少非常大的输入集作为黑盒的应用程序是很困难的,即使在大多数情况下也是不可能的。所以你必须检查代码是否正确实现了算法。 RFC-3121(链接至上文)中描述了该算法。该描述足以实现。该算法本身是众所周知的(在科学意义上,即:已经写了很多关于它的论文,并且已经发现了许多缺陷)并且足够简单,可以跳过正式部分,只需检查实现即可。
JavaScript中MD5的预期问题:一个或多个零字节的输入(您可以彻底检查一字节和两个字节长的输入)、字节顺序(应该没问题但很容易检查)以及无符号整数的问题用于 JavaScript 中的位操作(“>>”与“">>>”,但也易于检查)。我还将使用所有位设置的少量数据进行测试。 该算法也需要填充,您可以用所有可能的长度小于限制的输入来检查它。
哦,对于所有忽略 MD5 哈希的人来说:它仍然具有作为快速非加密哈希的用途,具有低冲突率和良好的混合(有些人将混合的效果称为“雪崩”,输入中的一位变化会改变输出中的许多位)。我仍然将它用于更大的、非加密的布隆过滤器。是的,我们应该使用适合预期输入的特殊散列,但构造这样的散列函数对于大自然赋予我们的 body 部分来说是一种痛苦。
关于javascript - 如何测试 MD5 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33271214/