zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

请提防哈希重置攻击

攻击哈希 重置
2023-09-14 09:10:45 时间

使用哈希值判断内容变更

真实世界中存在很多种不同的哈希算法,例如我们比较熟悉的MD5。这些算法的共同点是,它们会接收一份原文消息,然后产生一组基于消息原文的哈希值(散列),即使原文发生任何一丁点变化,则会引发哈希值的巨大变化,这样你就可以很容易地判断文件的哈希值来知道一个文件是否发生了变化,这种功能的实现是基于这样一个事实:现实中很难在不修改哈希值的情况下,实现对一个文件的修改。

但是

看起来这个理论完美无缺,但是,有一点你需要注意的是,除了记录文件的哈希值之外,你还需要记录下文件的大小。

并不是说碰撞很容易造成错误(我听到过的一个传言,说是开发团队曾经碰到过一个MD5碰撞,但也只是一个传言罢了,我并没有任何证据。真见鬼,也许实际发生的是,只是有人开着丰田MR2出了车祸而已(MD5碰撞 vs. MR2车祸)。

不管怎样,使用重置攻击法,确实很有可能实现哈希值的碰撞。

哈希值生成器通常会在一个流式数据上工作。哈希值引擎会在内部维护一些状态值。被用来计算哈希值的文件会被分为一些小的数据块,每个数据块会被引擎的内部状态以一种复杂的方式组合在一起。当你向引擎传入所有的数据时,你点击一个[立即生成]的按钮,引擎会计算哈希值并显示它,这个哈希值就包含了引擎内部的一些变量,状态等。

现在,我们假设有人想到了一个所谓的”重置引擎”的方法,那就是,将生成引擎重置为它的初始状态。这样攻击者就可以伪造一个有着相同哈希值的文件。

首先,创建一个伪造原文信息,然后发送给哈希值生成引擎。
然后,生成一些定制的字节流用来重置引擎。
最后,追加原始信息到伪造的文件。

换句话说,这个伪造的文件看起来像如下这个样子:
[alternate message][garbage][original message]

上述的[garbage]就是用来重置引擎的字节流。
这个伪造的文件有着和[original message]相同的哈希值,因为[garbage]将会在原文消息重新生成哈希值的时候,重置哈希引擎到初始状态。

结果就是:一个文件和原版文件有着相同的哈希值,但是这两个文件的内容完全不一样。

在真实世界的攻击案例中,这里的[alternate message]会被进行特殊构造,使得[garbage]和[original message]会被哈希引擎所忽略掉。你可能会实现一个休止符号,用来表达”请从这里开始忽略后面的所有内容”的意思,类似于在HTML中,noframes标签用来向浏览器表达”从这里开始,所有后面的内容全部忽略”。许多其他的文件类型会将预期的文件长度编码到它的头部中,这样你就可以在文件尾部追加任何内容,而不会产生任何影响。

但是如果你同时保存文件的长度和哈希值,则上面所说的重置攻击就会失效。因为一个重置攻击操作总是会产生一个比源文件更大一些的文件。为了创建一个碰撞,攻击者不得不创建一个比原文更加短的[alternate message],然后加上一些特制的字节来获取目标哈希值。这种手法相对于重置攻击法来说,更加难以实现。

总结

目前我还不知道有任何人能成功重置MD5,我只是想提醒你:如果真有这么一天或者真有这么一位NB人物(晓芸,是你吗?),则你可以尝试使用上面的小技巧来给对方施加一些小难度,让他/她体验下Hard模式,也挺好的。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Beware the hash reset attack》