我一直想知道的一个概念是加密哈希函数和值的使用。我知道这些函数可以生成一个唯一且几乎不可能逆转的哈希值,但这是我一直想知道的:

如果在我的服务器上,我用 PHP 生成:

md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"

当您通过 MD5 函数运行相同的字符串时,您在 PHP 安装中会得到相同的结果。一个过程被用来从某个起始值产生一些价值。

这是否意味着有某种方法可以解构正在发生的事情并反转哈希值?

这些函数是什么导致结果字符串无法回溯?

有帮助吗?

解决方案

在输入材料可以是无限长,其中输出始终是128位长。这意味着,输入字符串的无限数量将产生相同的输出。

如果你选择一个随机数,除以2,但只有写下来的剩余部分,你会得到无论是0或1 - 偶数或奇数,分别。是否有可能采取0或1,获得原始数?

其他提示

如果散列函数如MD5是可逆然后它会一直在数据压缩算法历史的分水岭!它很容易看出,如果MD5是任意大小的数据的可逆然后任意块可通过而不损失任何信息仅仅128个比特表示。因此,你就已经能够重建从128位的数目的原始消息而不管原始消息的大小的。

与这里最受支持的答案所强调的相反, 非注入性 (IE。由大(可能无限)输入大小和固定输出大小之间的差异引起的加密哈希函数的多个字符串哈希为相同值) 这不是重点 – 实际上,我们更喜欢哈希函数,因为冲突尽可能少发生。

考虑这个函数(用 PHP 表示法,作为问题):

function simple_hash($input) {
     return bin2hex(substr(str_pad($input, 16), 0, 16));
}

如果字符串太短,则会附加一些空格,然后获取字符串的前 16 个字节,然后将其编码为十六进制。它具有与 MD5 散列相同的输出大小(32 个十六进制字符,如果我们省略 bin2hex 部分,则为 16 个字节)。

print simple_hash("stackoverflow.com");

这将输出:

737461636b6f766572666c6f772e636f6d

该函数还具有与 Cody 对 MD5 的答案所强调的相同的非注入性属性:我们可以传入任何大小的字符串(只要它们适合我们的计​​算机),它只会输出 32 个十六进制数字。当然不能是内射的。

但在这种情况下,找到映射到相同哈希的字符串是微不足道的(只需应用 hex2bin 在你的哈希上,你就拥有了它)。如果您的原始字符串的长度为 16(如我们的示例),您甚至会得到这个原始字符串。对于 MD5 来说,这种情况是不可能发生的,即使您知道输入的长度非常短(除了尝试所有可能的输入,直到找到匹配的输入,例如暴力攻击)。

加密哈希函数的重要假设是:

  • 很难找到任何产生给定散列的字符串(原像抵抗)
  • 很难找到任何不同的字符串产生与给定字符串相同的哈希值(第二原像抵抗)
  • 很难找到任何一对具有相同哈希值的字符串(抗碰撞)

显然我的 simple_hash 函数不满足这两个条件。(实际上,如果我们将输入空间限制为“16 字节字符串”,那么我的函数就变成单射的,因此甚至可以证明具有第二原像抗性和抗碰撞性。)

现在存在针对 MD5 的碰撞攻击(例如即使具有相同的前缀(具有相同的哈希值),也可以生成一对字符串,这需要相当多的工作,但并非不可能完成很多工作),因此您不应该将 MD5 用于任何关键的事情。目前还没有原像攻击,但攻击会变得更好。

回答实际问题:

这些功能使结果字符串不可能回缩的是什么?

MD5(以及基于 Merkle-Damgard 构造的其他哈希函数)有效地执行的操作是应用加密算法,以消息作为密钥,将某个固定值作为“纯文本”,并使用生成的密文作为哈希值。(在此之前,输入被填充并分成块,每个块用于加密前一个块的输出,与其输入进行异或以防止反向计算。)

现代加密算法(包括散列函数中使用的算法)的设计方式使得即使同时给出明文和密文(或者即使对手选择其中之一)也很难恢复密钥。他们通常通过进行大量的位混洗操作来实现这一点,其中每个输出位由每个密钥位(多次)以及每个输入位确定。这样,如果您知道完整的密钥以及输入或输出,您就可以轻松地追溯内部发生的情况。

对于类似 MD5 的哈希函数和原像攻击(使用单块哈希字符串,使事情变得更容易),您只有加密函数的输入和输出,但没有密钥(这就是您正在寻找的)。

科迪·布罗克斯的答案是正确的。严格地说,因为许多字符串映射到相同的哈希你不能“倒置”的哈希函数。但是请注意,要么找到的一个的是被映射到给定的散列串,或发现的的是被映射到相同的哈希值(即碰撞串),将是一个密码分析的重大突破。的这两个问题的大困难就是为什么好的哈希函数密码学中有用的原因。

MD5不创建一个唯一哈希值; MD5的目标是迅速产生变化显著基于一个小的改动源值。

如,

"hello" -> "1ab53"
"Hello" -> "993LB"
"ZR#!RELSIEKF" -> "1ab53"

(显然,这不是实际MD5加密)

大多数哈希(如果不是全部)也非唯一;相反,他们是唯一的足够的,所以碰撞是非常不可能的,但还是可以的。

想一个散列算法的一个好方法是想调整在Photoshop图像的...说你有一个形象,是5000x5000像素,然后你把它调整为32×32只。你有什么仍然是原始图像的表示,但它是非常非常小,并有效地“扔掉”的图像数据的某些部分,使之适合在较小的大小。所以,如果你要调整的是32×32的图像备份到5000x5000所有你想要得到的是一个模糊混乱。然而,由于32×32的图像没有那么大这将是理论上可以设想,另一图像可能被缩小,以产生完全相同的像素!

这只是一个比喻,但它有助于了解什么是哈希在做什么。

一个哈希冲突比你会觉得更容易。看看在生日悖论来明白为什么这是一个更深入的了解。

由于可能的输入文件数量大于 128 位输出文件的数量,因此不可能为每个可能的文件唯一分配 MD5 哈希值。

加密哈希函数用于检查数据完整性或数字签名(为提高效率而对哈希进行签名)。因此,更改原始文档意味着原始哈希与更改后的文档不匹配。

有时使用这些标准:

  1. 原像抗性:对于给定的散列函数和给定的散列,应该很难找到具有该函数的给定散列的输入。
  2. 第二原像抗性:对于给定的哈希函数和输入,应该很难找到具有相同哈希值的第二个不同的输入。
  3. 抗碰撞性:对于给定的 has 函数,应该很难找到具有相同哈希值的两个不同输入。

选择这些标准是为了使找到与给定散列匹配的文档变得困难,否则就有可能通过用散列匹配的文档替换原始文档来伪造文档。(即使替换内容是乱码,仅仅替换原始内容也可能会造成中断。)

数字 3 意味着数字 2。

特别是对于 MD5,它已被证明是有缺陷的:如何破解 MD5 和其他哈希函数.

但是,这是彩虹表开始发挥作用。 基本上,它仅仅是一个大量separetely散列值,然后将结果保存到磁盘。然后倒车位是“只是”做了查找一个非常大的表。

显然,这只是针对所有可能的输入值的子集是可行的,但如果你知道的输入值的范围有可能计算它。

中国的科学家们发现了一个名为“选择前缀碰撞”的方式,使两个不同的字符串之间的冲突。

下面是一个例子: http://www.win .tue.nl / hashclash / fastcoll_v1.0.0.5.exe.zip 结果 源代码: http://www.win.tue.nl/hashclash /fastcoll_v1.0.0.5_source.zip

由于大多数已经说过的MD5是专为可变长度的数据流待哈希数据的固定长度块,所以一个单一的散列是由许多输入数据流共享。

但是如果你确实需要找出从校验原始数据,例如,如果您有密码的哈希,需要找出原始密码,它通常更快的只是谷歌(或任何你喜欢的搜索)哈希寻找答案,而不是蛮力它。我已经成功发现了使用这种方法的几个密码。

要了解所有最投票回答的意思,最好的办法就是实际尝试恢复MD5算法。我记得我试图恢复的 MD5crypt 算法几年前,不要恢复原始消息,因为这显然是不可能的,但只是为了产生会产生相同的哈希与原始哈希的消息。使用所生成的信息(密码)而不是使用原有一个在/ etc / passwd文件密码:此,至少在理论上,将提供我一个方式登录到存储用户Linux设备。由于两个消息将具有相同的结果散列,系统将识别我的密码(从原来的哈希生成)为有效。这并没有在所有的工作。几个星期后,如果我没有记错,在初始消息中使用的杀了我。我不得不产生不仅有效的初始消息,但腌有效的初始消息,这是我从来没有能够做到。但是,我从这个实验中得到的知识是好的。

根据定义哈希(加密散列)函数:不应该是可逆的;不应该有碰撞(最小可能的)

REGD你的问题:它是一个单向散列。输入(不论长度的)将产生一个固定大小的输出。(它将根据算法中为MD5(512位边界)被填充)。的信息被压缩(丢失),实际上不可能从反向变换生成。

在MD5附加信息:它是容易受到碰撞。通过这篇文章了最近, http://www.win.tue.nl/hashclash/Nostradamus/

打开用于加密散列实现(MD5和SHA)可以在Mozilla的代码中找到源代码。 (freebl库)。

现在是一个天MD5散列或任何其他散列对于这个问题是预先计算出的对于所有可能的字符串和存储以便于访问。虽然在理论上的MD5是不可逆的,但使用这样的数据库可能会找出文本导致特定的哈希值。

例如尝试以下散列码在 http://gdataonline.com/seekhash.php 找出我用什么文字来计算哈希值

aea23489ce3aa9b6406ebb28e0cda430

f(x) = 1 是不可逆的。哈希函数不是不可逆的。

这实际上是 必需的 让他们履行确定某人是否拥有哈希数据的未损坏副本的功能。这使得暴力攻击变得非常容易,这种攻击现在非常强大,尤其是针对 MD5。

在拥有数学知识但缺乏密码破译知识的人们中,这里和其他地方也存在着困惑。一些密码只是将数据与密钥流进行异或,因此您可以说密文对应于该长度的所有明文,因为您可以使用任何密钥流。

然而,这忽略了从种子产生的合理明文 password 比种子产生的另一种可能性要大得多 Wsg5Nm^bkI4EgxUOhpAjTmTjO0F!VkWvysS6EEMsIJiTZcvsh@WI$IH$TYqiWvK!%&Ue&nk55ak%BX%9!NnG%32ftud%YkBO$U6o 以至于任何声称第二种可能性的人都会被嘲笑。

同样,如果您尝试在两个潜在密码之间做出决定 passwordWsg5Nm^bkI4EgxUO, ,这并不像一些数学家让你相信的那么难。

我喜欢所有不同的论点。显然,哈希值的真正价值只是为密码等字符串提供人类无法读取的占位符。它没有特定的增强安全优势。假设攻击者获得了对带有哈希密码的表的访问权限,他/她可以:

  • 如果他/她有对该表的写入/编辑权限,则对他/她自己选择的密码进行哈希处理并将结果放入密码表中。
  • 生成常见密码的哈希值并测试密码表中是否存在相似的哈希值。

在这种情况下,弱密码不能仅通过哈希值来保护。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top