【问题标题】:How to test an MD5 implementation?如何测试 MD5 实现?
【发布时间】:2015-10-21 23:53:07
【问题描述】:

我正在考虑使用JS MD5 implementation

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

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

【问题讨论】:

  • these Test Cases MD5 应该提供对工作实现的充分覆盖。但是,您根本不应该使用 MD5,因为它不安全。
  • 无法测试任何应用程序并确保它适用于所有输入。你只需要尝试足够多的不同输入来说服自己。如果您使用几 MB 的随机数据测试您的代码,那么错误的实现就不太可能成功。
  • @BSeven 是否要求生成包含 32 个字母数字字符且不重复的唯一字符串?
  • 您正在寻找formal verification,这比测试要复杂得多。而且我不知道有什么框架可以和 Js 一起工作。
  • 从一个众所周知的实现中生成一堆原始值和散列值,然后验证是否生成了相同的东西。或者,只是将他们的测试移植到他们的实施中,看看你的表现如何。

标签: javascript md5 digest


【解决方案1】:

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

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

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

哦,对于所有忽略 MD5 哈希的人:它仍然可以用作具有低冲突率和良好混合的快速非加密哈希(有些人称混合的效果为“雪崩”,输入中的一位更改会更改输出中的许多位)。我仍然将它用于更大的非加密布隆过滤器。是的,应该使用适合预期输入的特殊散列,但构造这样的散列函数是大自然给我们坐的身体部位的痛苦。

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2011-07-14
    • 2015-04-25
    • 2014-12-29
    相关资源
    最近更新 更多