我对密码学了解不多,但是当然在很多场合都遇到了神奇的md5()黑匣子。现在,经过一番搜索,我已经找到了许多类似“为什么md5无法逆转?”的问题。带有“因为输出不唯一”的答案。假设密码(或其他值)是根据哈希值(不是原始值)进行评估的,那么知道原始值甚至不是很重要,您真正需要获得对用户帐户的访问权限的任何输入就是会产生该哈希值的任何输入。所以,我的问题:
为什么不能对md5进行反向工程以从输出(毕竟实际功能是公开可用的)中生成输入(任何输入,不一定是原始输入)?
示例:如果我有一个采用字符串的哈希函数,为每个字符分配一个数字值,然后将这些值相加,则可以轻松地通过获取输出,将其分解为因子并将因子重新组织为字符串来反转该函数(它不会是原始字符串,但会给出相同的哈希值)。那么为什么md5不能向后运行?
这是一种单向公式。在特定字符串上运行MD5或SHA1会得到始终相同的哈希值。无法反转该函数以返回到原始字符串。
例如:
15 Mod 4 = 3
即使您知道公式是
x Mod 4
您无法推论x,因为它可能是3、7、11、15等...
显然,MD5和SHA1复杂得多!
在上面的示例中,输入15总是会得到3的答案,但是没有人能够推断出原始数字。这确实很好地导致了多个输入字符串可能给出相同哈希值的冲突:
http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities
维基百科上有关于所用特定算法的信息:
主要是多个输入可以达到相同的输出。另外,由于操作是链接在一起的,并且操作的每个阶段都具有相同的行为,因此每次您尝试反向“向后”时,都会有多个可能的答案-其中许多。这是使其成为“单向”的基本特征。