我理解哈希只是在生成的数字上使用数学就不可逆了,但我想知道是否有足够的信息可以成功地反转哈希并准确地重新获得我开始使用的信息。
例如,我有一个文件,我通过md5()
运行它,得到6513F99D206D8714EA9EAA4A1EEA8538
,然后我在文件底部添加了一些可预测的垃圾并再次运行以获得{{1} }}。
由于我在同一个文件中有两个不同的校验和,而且我确切地知道文件末尾的垃圾是什么,现在是否足以将可能的答案缩小到一个?
显然这对安全性来说并不实用,但我对这个具体情况非常好奇,是否有(或曾经有)足够的信息以数学方式反转哈希值。
答案 0 :(得分:2)
让我们从基础开始。如果文件比散列长,则它包含的信息多于散列,并且您无法从单个散列中恢复它。如果它更短,你知道这个事实,那么理论上你可以恢复它,例如通过尝试所有可能的文件到那个长度。很可能你只有一场比赛。
更确切地说,你不必谈论文件长度,而是谈论熵。如果您知道该文件只是可打印的字母,则会排除许多候选人。如果它是可读文本,那就更是如此。因此,一般规则是,如果文件的熵小于散列的熵,则可以希望恢复该文件。而你必须知道,实际情况确实如此,你不能真诚地排除导致相同散列的较长文件的可能性。
以上所有人都谈到了一个哈希问题。现在你追加垃圾并计算另一个哈希值。这最多会使哈希中包含的信息量翻倍。在那之后它是同一个游戏。您不能期望恢复比两个哈希中包含的信息更多的信息。通常不多。
答案 1 :(得分:1)
目前接受的答案并不完全正确。真正的答案是它取决于。
首先,回想一下,散列函数从所有二进制序列的集合映射到有限集合,通常是固定长度的序列集合,称为散列长度。因此,此函数不能是1对1 - 也就是说,必须有多个输入映射到的函数的某些输出。所以通常不会有一个算法将哈希映射到生成该哈希的输入,因为这个过程没有明确定义(没有明确的答案)。
幸运的是,你问的是为了反转特定输入的哈希函数,所以它实际上是可能的。虽然散列函数不是1比1,但可能只有一个输入映射到某个输出。如果你的输入是一个这样的输入,你很幸运,一个强力算法枚举所有二进制字符串,每个哈希值,并输出哈希值为正确值的第一个二进制字符串将返回正确的答案。您还可以获得有关输入的其他信息。例如,您可能知道它是语法英文文本或有效的HTML文档。即使有多个输入映射到给定的哈希值,也可能只有一个正确格式的输入和适合硬盘驱动器的大小的输入映射到该哈希值。在理想的情况下,你有一个候选文件的集合,你知道你的文件是 - 在这种情况下几乎肯定最多一个散列到给定的值并散列每个这样的文件,直到散列匹配正确的值将产生正确的答案
坏消息是,虽然可能可以在理论上反转哈希值,但加密哈希函数已经被设计为使这个过程非常低效。如果你无法将输入空间缩小到很小的范围,那么你可能不得不运行一个在宇宙热死之前无法完成的大规模暴力过程。