Hash 为什么可以';md5不能进行反向工程吗?

Hash 为什么可以';md5不能进行反向工程吗?,hash,cryptography,md5,Hash,Cryptography,Md5,我对密码学了解不多,但我在很多场合都遇到过神奇的md5()黑匣子。现在,经过一些搜索,我已经能够找到许多问题,大致是“为什么md5不能被反转?”以及“因为输出是非唯一的”。考虑到密码(或任何值)是根据哈希值(而不是原始值)计算的,知道原始值其实并不重要,您真正需要的是访问用户帐户的任何输入,这些输入将给出该散列。所以,我的问题是: 为什么md5不能进行反向工程,从输出中生成输入(任何输入,不一定是原始输入)(毕竟,实际功能是公开的) 例如: 如果我有一个哈希函数,它接受一个字符串,为每个字符分配

我对密码学了解不多,但我在很多场合都遇到过神奇的md5()黑匣子。现在,经过一些搜索,我已经能够找到许多问题,大致是“为什么md5不能被反转?”以及“因为输出是非唯一的”。考虑到密码(或任何值)是根据哈希值(而不是原始值)计算的,知道原始值其实并不重要,您真正需要的是访问用户帐户的任何输入,这些输入将给出该散列。所以,我的问题是:

为什么md5不能进行反向工程,从输出中生成输入(任何输入,不一定是原始输入)(毕竟,实际功能是公开的)

例如:
如果我有一个哈希函数,它接受一个字符串,为每个字符分配一个数字值,然后添加值,那么我可以通过获取输出,分解它,并将因子重新组织为一个字符串(它不会是原始字符串,但会给出相同的哈希值)来轻松地反转该函数。那么为什么md5不能向后运行呢?

这是一个单向公式。在特定字符串上运行MD5或SHA1会产生一个始终相同的哈希值。无法反转函数以返回原始字符串

例如:

15模4=3

即使你知道公式是

x模块4

你不能推断x,因为它可能是3,7,11,15等等

显然,MD5和SHA1要复杂得多

在上面的例子中,输入15总是得到3的答案,但是没有人能够推断出原始的数字。这确实会导致冲突,多个输入字符串可能会产生相同的哈希:

Wikipedia提供了有关所用特定算法的信息:


这是一个单向公式。在特定字符串上运行MD5或SHA1会产生一个始终相同的哈希值。无法反转函数以返回原始字符串

例如:

15模4=3

即使你知道公式是

x模块4

你不能推断x,因为它可能是3,7,11,15等等

显然,MD5和SHA1要复杂得多

在上面的例子中,输入15总是得到3的答案,但是没有人能够推断出原始的数字。这确实会导致冲突,多个输入字符串可能会产生相同的哈希:

Wikipedia提供了有关所用特定算法的信息:


最主要的是,多个输入可以实现相同的输出。此外,由于操作是链接在一起的,并且操作的每个阶段都有相同的行为,因此每次尝试“向后”反转时,都会有多种可能的答案——其中很多。这是它“单向”的基本特征。主要的是多个输入可以实现相同的输出。此外,由于操作是链接在一起的,并且操作的每个阶段都有相同的行为,因此每次尝试“向后”反转时,都会有多种可能的答案——其中很多。这是使其成为“单向”的基本特征。

有双射单向函数和有损函数,其中查找前像是微不足道的。有效点,尽管不特别适用于md5。有双射单向函数和有损函数,其中查找前像是微不足道的。有效点,虽然不适用于md5。但这个问题似乎离题了,因为它不是一个编程问题。我无法反转哈希函数,这很难解释为什么它不可能。我不知道散列函数和编程有什么关系,但这是可能的。这是可能的,但很难,很难。您希望破坏的此属性称为映像前阻力。所以你的下一个问题可能是“为什么很难?”。答案很简单,Ron Rivest是个聪明人,所以像将字符映射到素数和乘法这样的东西在计算上是不可能逆转的,因为它需要素数分解?你说得对,我想我确实回答了我自己的问题。谢谢你的启发。这个问题似乎离题了,因为它不是一个编程问题。我无法反转哈希函数,这很难解释为什么它不可能。我不知道散列函数和编程有什么关系,但这是可能的。这是可能的,但很难,很难。您希望破坏的此属性称为映像前阻力。所以你的下一个问题可能是“为什么很难?”。答案很简单,Ron Rivest是个聪明人,所以像将字符映射到素数和乘法这样的东西在计算上是不可能逆转的,因为它需要素数分解?你说得对,我想我确实回答了我自己的问题。谢谢你的启发。如果散列用于密码保护,那么原始输入是不相关的。例如,假设散列映射为3,那么这些可能的输入中的任何一个都非常适合生成相同的散列。要使用已知哈希访问任何帐户,可以使用x=4+y生成有效密码。如果哈希用于密码保护,则原始输入不相关。例如,假设散列映射为3,那么这些可能的输入中的任何一个都非常适合生成相同的散列。要使用已知哈希访问任何帐户,可以使用x=4+y生成有效密码。