如何进行单向散列?

时间:2013-08-10 07:06:55

标签: algorithm hash encode

我想知道,单向散列怎么可能?你怎么能只在一个方向而不是另一个方向编码一个字符串?如果你反转算法,你不能解码像md5这样的东西吗?在我之前,唯一可行的方法是让它生成随机答案,而不是使用算法。但它每次都以同样的方式散列。请向我解释一下。

4 个答案:

答案 0 :(得分:5)

如果您“反转”算法,则无法返回原始字符串,因为可能的字符串多于可能的哈希码。

考虑一个具有64位整数结果的算法。这些数字有2 ^ 64 =(2 ^ 8)^ 8 = 256 ^ 8。

但这意味着,如果有超过256 ^ 8个可能的字符串,那么必须有两个字符串散列到相同的值(这称为the pigeonhole principle)。由于长度上有更多的字符串9(256 ^ 9个这样的字符串),你可以得到一个哈希值的事实并不能保证你可以“回去”。

答案 1 :(得分:2)

一方面,MD5摘要(通常)比消息短得多,因此许多消息可能生成相同的摘要。另一方面,对消息的任何微小改变都将产生完全不同的摘要。因此,很快就可以说摘要是否与消息相对应并且给出了消息,但没有反向算法将摘要转化为合理的消息。

答案 2 :(得分:2)

在散列的情况下,正如其他人所指出的那样,不可逆转性仅仅来自于数十亿和数十亿的输入全部散列到同一输出的事实,因此即使在原则上也无法逆转。

但是你的问题似乎意味着你想知道即使在1比1的情况下也有可能实现确定性但不可逆转的转换过程,这确实是可能的。例如,标准块加密。明文从一组比特变换成同等大小的不同比特组(密文)。这是完全可逆的,但同时进行加密和解密需要额外的信息 - 发送者和收件人共享的“关键”值,但不是其他人。因此,转换是不可逆转的,因为密钥是秘密的 - 如果攻击者获得密钥,他也会得到消息。

公钥加密是另一个完整的蜡球。在这种情况下,“陷门”来自这样的事实,即某些操作虽然原则上是可逆的,但在一个方向上比另一个方向更难。例如,如果您有两个非常大的素数,则可以在几毫秒内将它们相乘;但如果只给你产品,那么发现主要因素需要几个世纪。因此,如果您知道这两个因素,您可以基于它们计算两个单独的“键”,使得一个是另一个的倒数。如果您只向发件人提供一个密钥,那么无法计算另一个密钥而不知道这些因素,但他可以使用您只给他的密钥加密邮件你可以解密。这使得它更安全 - 你可以通过简单地在你的网页上发布它来给他钥匙,只要你保密你的反私钥对你自己,没有人可以解密消息。

答案 3 :(得分:1)

并非逆转是不可能的,只是不切实际

Hashing从输入中删除信息:有无限多个字符串但只有有限数量的哈希值。许多哈希对应于无限数量的字符串,因此通常不可能进行1到1的反转。但这并不意味着你不能产生一组匹配的输入。

如果你试图反转像md5这样的散列算法,你很快就会发现算法的每一步都有一个以上的中间值对应于该步骤产生的输出,或者你不可能产生输出所以错误的转弯在某个时刻,不得不回溯。检查每个组合将花费很长时间。