2010-05-27 78 views
5

今天我读了关于MD5哈希值,并想知道这是否可能。 似乎是一个递归问题... 还是有解决方案吗?将文本文件的MD5哈希保存到同一个文本文件中?

+0

这是可能的... md5(废话+ x)== x ? 就像一个文档在其最后一页上有自己的MD5信息? – bakra 2010-05-27 11:34:48

+0

是的,正如我写的那样,理论上是可能的 - 但要做到这一点需要大量的尝试和运气......你不能一次构建这样的文档。 – tanascius 2010-05-27 11:52:49

回答

2

您必须从计算中排除哈希和。然后你已经使用了它,但是你不能添加散列朗姆直到文件的末尾,希望它是正确的,或者如果你计算新的yu的运行将始终以新的MD5散列结束。在一个永无止境的故事中结束:)

3

那么,只要你填写MD5总和文件将会改变,并得到一个新的MD5 - 所以:不,这是不可行的。从理论上讲,只有反复试验才能产生一个包含它自己散列的文档......但是文档可能非常乱码,并且不包含任何有意义的内容。

但是在计算过程中可以用零填充128位(例如)。这个地方将保存MD5总和,并且在稍后验证哈希值时必须再次为零。

+0

附录:我们知道**是不可行的。很有可能一些未来的数学supergenius会设法快速构建这样一个文件。 – 2010-05-27 16:28:40

+0

@BlueRaja:见[这里](http://www.mscs.dal.ca/~selinger/md5collision/)。 – sbi 2010-05-29 22:22:20

+0

@sbi:与这个问题无关...... – 2010-05-29 23:41:50

4

这是不可能的。

但是,您可以根据其内容的哈希来重命名该文件,该内容会在不更改哈希的情况下附加信息。

1

那么,向文本添加MD5哈希将更改文本,从而更改MD5哈希。 计算您的文本(包括将要计算的MD5哈希)的MD5哈希是不可能的。

4

考虑任何散列并想象添加一些随机文本。既然有可能文本你可以添加无限量,但只有可能哈希数量是有限的值,必须有可能的文本,其产生的哈希值。问题只是你可能没有足够的资源来找到它。

你也许可以尝试的是,是否有任何MD5哈希值,当散列,yield themselves as a result(感谢弗朗西斯该链接!):
对于MD5哈希的所有可能的排列,创建哈希和将结果与原始结果进行比较。

+1

也就是说,MD5哈希是否承认一个固定点?请参阅http://stackoverflow.com/questions/235785/is-there-an-md5-fixed-point-where-md5x-x – Francesco 2010-05-27 11:06:42

+0

@Francesco:感谢您的链接,我将它添加到答案。 – sbi 2010-05-27 11:09:52

+0

我在考虑更多这些条款: md5(crap + x)== x? 我的意思是一个.doc包含其他东西+最后的MD5哈希信息。 – bakra 2010-05-27 11:32:30

2

理论上有可能:可能的文件内容是无限的,可能的哈希不是。在实践中,能够实现它意味着你已经发现了算法中的一个漏洞,因此为了安全目的而使得哈希无用。

0

这里是另一个伎俩......

保存散列文件的起点,也计算MD5已排除该区域,只有重要的数据。

"HashMD5 = Md5.ComputeHash(bytes, 382, bytes.Length - 382)" 

所以它计算哈希仅用于数据区域(自定义数据结构开始后,在文件缓冲区偏移382)

------------------- ----实例数据结构跟随-----------

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Ansi)> 
<Serializable()> Structure MyData 
    Dim FileCheckSum() As Byte '16 bytes HASh for file 'Config.bin' 
    Dim Padding() As Byte  ' 0xFF x 20 bytes 
    Dim RemoteDevice As RmtDevice 

End Structure 

在begining写入这个STR到文件config.bin使用“xxxx.FileSystem。WriteAllBytes()”使用十六进制编辑器找到的填充元素开始的位置(在我的情况下,它是382)

然后打开配置文件

后来使用这种无作为偏移量,计算MD5,而在整个文件。这样一个有数据崩溃小安

注意!! - 只要没有结构元素/顺序/件号保持相同的填充起始位置保持相同

工作对我来说..

经测试,在。 .net