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