对于您问题的SHA-1哈希冲突部分,一些答案已解决了这一问题。
但是,其中很大一部分取决于我们正在处理的文件类型:
维护文件的整体内容和操作(但现在当然包括最初没有更改内容的恶意内容)
这意味着在检测更改方面有很大不同:
- 如果它是经过签名的可执行文件,则不是(合理的)机会:您将不得不以某种方式遇到两次哈希冲突:文件的SHA-1和内部.exe签名。
- 如果它是未签名的可执行文件,.com,.unsigned .dll或类似文件,则可以以不会改变其操作的方式添加其资源派生,因此(最终)您可能会(最终)获得“正常”无法检测到的哈希冲突操作。
- 如果是源代码文件或类似的结构(.cs,.c,.h,.cpp,.rb,.yml,.config,.xml,.pl,.bat,.ini),则添加,修改或删除可以限制为有效的注释语法,以使大多数使用(编译或运行它,而不用文本编辑器打开它)无法识别更改。
- 如果是.iso或.zip或其他容器格式,则也不太可能,因为大多数随机更改都会破坏容器。可以这样做:添加一个伪造的文件条目或更改容器中的内容并重新检查它,但是这增加了一层复杂性,并增加了额外的时间来检查结果,并且相对自由度有限如何更改内容以及如何更改。
- 如果是文本或类似文本的格式,则尽管它们的内容可能会很明显,但它们仍然可以是“有效”文件,几乎可以按照您喜欢的任何方式进行更改。
- 对于许多格式,例如.rtf,.doc,.html,.xslx和其他类似标记的格式,可以以解析器无法检测到的方式添加或修改它们,而不是使用长度(甚至限制长度) (自由度较小)文件可以更改为(最终)发生哈希冲突,同时仍然不仅是有效文件,而且以与使用它们的典型应用程序可见的任何方式进行显着更改。
因此,剩下的就是如何在不损坏且可能无法检测到的任何结构中发生碰撞:
- 进行所需的任何功能更改(可能插入恶意内容),并进行任何其他更改以保留特定于文件格式的有效性
- 添加一个将不起作用的部分(在注释块之间,在文本文件的末尾,其上方有3k回车符,隔离当前注释块)
- 添加或选择一个字符/代码点/字节进行修改,然后尝试所有可能的有效组合(例如,并非每个字节组合都适用于不同的编码)。
- 重新计算哈希,看看冲突是否匹配。
- 如果不是,请转到3。
假设您有一台超级快速的计算机和一个较小的文件,因此使用有效字节序列进行修改并重新计算哈希值需要1毫秒(可能需要一些专用硬件)。如果哈希分布是完全随机的并且分布在整个范围内,则每次2^160
尝试都会与SHA-1发生冲突(强行强制使用它)。
2^160/1000/60/60/24/365.24
= 4.63x10^37 years
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years
= 46 undecillion years.
但是,让我们尝试使用2^60
和2^52
版本,并假设它们允许我们以我们喜欢的方式修改文件(他们不喜欢),并且每次也可以在1毫秒内完成修改:
2^52 yields 142,714 years
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years
/*machines will probably have taken over anyway*/
但是,嘿,您可能会很幸运。真的,真的,比任何人称呼奇迹更幸运的是奇迹。