我应该将哪种哈希算法用于安全文件校验和?

信息安全 密码学 哈希 md5 校验和
2021-08-27 05:27:10

对于我的工作,我需要为我的客户提供一个特定的文件,这将是我为他们所做的工作的结果。

为了保护我所做工作的完整性并保证它从未被修改过,我打算在我的文档中添加一个校验和,它将与文件一起提供。

由于 MD5 和 SHA-1 很长时间以来都不安全,我想知道我们是否仍在为此目的使用它们,或者是否有更好的算法可以做同样的工作但更安全。

我正在寻找最可靠的解决方案。我知道 100% 的证明永远不可能,但我想知道 MD5 是否仍然为此目的被评为“好”,或者是否真的有新的和更安全的工具。

2个回答

哈希算法的选择

使用 SHA-256 或 SHA-512: SHA-2系列的两个“主要”成员之一。SHA-2 是 SHA-1 的继承者,被认为是安全的。除非您有充分的理由选择其他方式,否则这是要选择的哈希值。在您的情况下,SHA-256 和 SHA-512 之间的选择无关紧要。有一个 SHA-3,但它还没有得到广泛的支持,它并不比 SHA-2 更安全(或更不安全),它只是一种不同的设计。

不要使用 MD5 或 SHA-1。它们显然不适合您的场景,但可以通过一些额外的工作来利用它们。此外,这些算法已经部分损坏的事实使它们更有可能随着时间的推移变得更加损坏。

更准确地说,对于这两种散列,可以找到冲突:可以找到两个文档 D1 和 D2,使得 MD5(D1) = MD5(D2)(或 SHA-1(D1) = SHA-1( D2)),并且使得 D1 和 D2 每个都以需要计算的小位和可选的公共选择后缀结尾。需要计算的位看起来像垃圾,但它可以隐藏在评论中、移出页面的图像中等。在 MD5 的 PC 上产生这样的冲突是微不足道的,对于 SHA- 来说是可行的但代价高昂- 1(除非您希望它用于两个 PDF 文件,在这种情况下,研究人员已经花费了金钱来计算找到一个并发布它)。

在您的场景中,您通常不关心碰撞,因为您将产生 D1。你不会在中间制作这个位。但是,有人可能会欺骗您注入此位,例如通过提供要包含在文档中的图像。以这种方式实现碰撞将非常棘手,但原则上是可行的。

由于使用 MD5 存在风险,并且与使用 SHA-256 相比收益为零,因此请使用 SHA-256。

如何处理哈希

使用像 SHA-256 这样的完整加密哈希,您所知道的是,如果两个文件具有相同的哈希,那么它们是相同的。相反,这意味着如果两个文件具有不同的哈希值,那么它们就是不同的。这意味着,如果您保留哈希的受信任副本(例如,您将其打印出来并存储,或对其进行公证),那么您可以稍后告诉我“是的,您向我展示的这个文件是同一个文件”或“不,你给我看的这个文件是不同的”。

知道文件的哈希值并不能证明您编写了它。没有密码学方法可以证明作者身份。您能做的最好的事情就是证明您比其他任何可以证明它的人都更早地拥有该文件。你可以在不泄露文件的情况下做到这一点,方法是将散列传达给每个人都信任的第三方,让他们正确记住你向他们展示散列的日期;如果您将哈希放在它索引的网页上,该第三方可能是公证人,或者是 Wayback Machine。(如果您发布哈希,那么理论上有人可以从中找出文件,但没有比尝试所有可能的文件直到找到正确的文件更好的方法了。如果您对此感到担心,请使用签名文件而不是哈希,

哈希适用的示例:您的客户需要支持,但您只准备支持您的原始产品而不是修改后的产品。因此,您让他们计算他们希望您支持的内容的哈希值。如果哈希值不是您提供的,您拒绝提供支持。请注意,您需要信任客户来计算产品的哈希值,而不是计算原始副本的哈希值或从交货单上读取它。

哈希不适合的示例:其他人声称他们是文档的作者。你说“不,看,我知道它的哈希值,它是 1234……”。这无济于事:任何人都可以计算哈希。

如果使用得当,哈希是有好处的示例:其他人声称他们刚刚编写了文档。你说“不,看,我去年公证了哈希 6,所以你不可能在上周写它”。

哈希不适合的示例:有人对文档进行了轻微修改。然后它将具有不同的哈希值。您只能说文档现在不同了,但这并没有传达任何关于它们有多么不同的信息。完全不同的文档的哈希值与带有错字修复的版本的哈希值或编码不同的版本的哈希值一样不同。

为了保证工作产品不变,即使是MD5也是合理的。

例如,当攻击者可能生成可执行文件时,攻击者设计碰撞的能力是危险的。该可执行文件可能需要 500 Kb 来做坏事,并花费另外 50,000 Kb 旋转出未使用的位来获得冲突。如果这些位未被使用,那也没关系;你只是看到一个带有正确哈希的可执行文件,你就被愚弄了。

设计一个既匹配 MD5 散列又代表可信不正确文档的冲突是不可行的。您更有可能最终得到这样的文档:“拔掉插头并将其插入 $#WG%ga 940[2aj2'rj09[3j59g;qa1j;socke t”——任何看过该文档的人都会意识到文档有被篡改。即使是莎士比亚猴子的相控阵也无法旋转看起来仍然像文档的 MD5 碰撞。

仔细观察,我发现这不是您要保护的文档;您将包括“特定文件的哈希值,这将是我为他们所做的工作的结果”。同样,不知道该文件是可执行的?源代码?- 在计算上不可行,他们可以修改它以可信地声称它是你给他们的,同时设计一个哈希冲突。

另请参阅Crypto.SE 上的此答案,其中总结了:

MD5 目前被认为太弱而不能用作加密哈希。然而,对于所有传统的(即非加密的)哈希使用,MD5 通常非常好。

您不是在查看哈希的加密使用,因此 MD5 适合您。它将防止替换您提供的工作产品的修改或可信伪造的替代品。