首先,我知道哈希是1种方法。有无限数量的输入可以导致相同的哈希输出。为什么我们不能进行哈希处理并将其转换为等效的字符串,该字符串可以被哈希化回原始哈希输出?例如,

br /> ...

评论

简短而又令人难以置信的准确答案是,我们无法将散列值转换回它们的输入字符串,因为一大批数学家付出了巨大的努力,很难使用已知的方法来做到这一点。

我们为什么不能呢?我们可以。该算法很简单:尝试每个可能的字符串,按长度排序,然后按字母顺序排序,直到得到一个哈希值达到所需值的字符串。使该算法在不到一万亿年的时间内运行是困难的部分。有一个很大的干草堆,可以寻找一根很小的针。

评论不作进一步讨论;此对话已移至聊天。请使用聊天室进行进一步讨论,以避免在此处删除您的消息。谢谢...

我在主站点上回答了有关哈希函数如何工作的问题。我的答案集中在存在不可逆的数学运算上。我会将其发布为答案,但是这里没有代表。

@forest:甚至问题都没有将它们混为一谈。它非常具体地询问“为什么我们不能提取哈希并将其转换为可以哈希回原始哈希输出的等效字符串?”。标题写得并不明确,这就是为什么问题不只是标题。

#1 楼

进行简单的数学运算,例如加法。加法运算取2个输入并产生1个输出(两个输入之和)。如果您知道2个输入,则输出很容易计算-并且只有一个答案。 >
928 = 119 + 809
928 = 680 + 248
928 = 1 + 927
...

现在您可能会认为这没关系-如果两个输入的总和为正确的值,则它们必须正确。但是不。
真正的散列函数中发生的事情是顺序执行数百个单向操作,而较早操作的结果将用于后续操作。因此,当您尝试将其取反(并在以后的阶段中猜测两个输入)时,判断您猜测的数字是否正确的唯一方法是一直使用哈希算法。开始猜测数字(在后面的阶段)是错误的,您最终会在前面的阶段出现不一致的情况(例如2 + 2 = 53)。而且您无法通过反复试验来解决它,因为存在太多无法猜测的组合(超过了已知宇宙中的原子等)
总而言之,哈希算法是专门为执行许多“
更新
由于这个问题似乎引起了人们的注意,所以我想我会列出更多的哈希算法功能br />使用方法以及它们如何帮助使其不可逆转。 (如上所述,这些是基本的解释,如果您真的想了解,Wikipedia是您的朋友)。


位相关性:哈希算法旨在确保输出的每一位取决于输入中的每一位。这样可以防止任何人拆分算法并尝试从输出哈希的每一位分别反向计算输入。
为了只解决一个输出位,您必须知道整个输入。换句话说,当反转哈希值时,它是全部或全部。反之亦然)旨在
导致算法内部状态和最终哈希值的巨大变化。由于输出随着每个输入位的变化而急剧变化,因此这使人们无法建立输入和输出(或其部分)之间的关系。 -线性运算-防止人们使用线性代数技术
从给定输出中“求解”输入。注意,我上面使用的加法示例是线性运算。使用
加法运算符构建哈希算法是一个非常糟糕的主意!实际上,哈希算法会使用线性和非线性运算的许多组合。所有这些加起来就是这样一种情况,找到匹配哈希的最简单方法就是猜测不同的输入,对它进行哈希处理,看看是否匹配。
最后,如果您真的想知道反转哈希的难度,没有比独自尝试更好的替代方法了。
所有好的哈希算法已公开发布,您可以找到大量的代码示例。以一个为例,尝试编写一个可以逆转每个步骤的版本;您会很快发现为什么这么难。

评论


$ \ begingroup $
我喜欢这个答案,因为它实际上指向用于“单向”的哈希属性,这就是我认为OP试图达到的目的。
$ \ endgroup $
–Cort Ammon
17年4月6日在23:16

$ \ begingroup $
我认为这个问题的目的是“为什么我们不能为给定的哈希创建冲突”-不管我们猜对与否(这可能是等效的字符串-等效关系为“具有相同的哈希”)
$ \ endgroup $
– tylo
17年4月7日在8:05

$ \ begingroup $
“您不能通过反复试验来解决它”->“您不能通过反复试验来现实地解决它”,“无法向后猜测”->“无法从现实中被猜测来解决”这些给定的当前技术。这并不是说从理论上不可能向后猜测(我的意思是,即使您尝试每一次输入,您也会发现一个碰撞,周期,即使您花费了48万亿年的时间才能完成),这是当前实际不可能的, ,理想的情况是到将来。
$ \ endgroup $
–杰森C
17-4-7在8:22



$ \ begingroup $
@JasonC鉴于问题的严重性,我试图用简单的英语和一个简单的例子来解释这个概念-确实没有必要阐明理论和现实结果之间的传统差异。
$ \ endgroup $
–adelphus
17年4月7日在8:56

$ \ begingroup $
评论不用于扩展讨论;此对话已移至聊天。
$ \ endgroup $
– e-sushi
17年4月8日在10:04

#2 楼

专门设计了加密安全的哈希(以解决其他问题)!

现在,您可以尝试创建所有哈希的适当字典,希望找到合适的配对...但是它需要的存储空间比我们星球上当前可用的总存储空间还要多,而计算能力却比您在此宇宙中(至少在撰写本文时)能够访问的能力还要多-这就是为什么我们称其为“不可行”。在您的理论示例中,冲突将是字符串“ Hello World”和“ rtjwwm689phrw96kvo48rm64 ...”,它们都产生相同的哈希值a591a6d40bf420404a011733...

对于SHA-2和SHA-3,直到今天才知道这样的对。如果这样,那么(一次加密安全的)哈希必须由于冲突而被视为破坏了。

评论


$ \ begingroup $
我不认为已知的冲突会导致SHA-2或SHA-3过时。如果这种碰撞是“偶然”发生的,那将毫无意义。但是,如果有人可以有意生成这样的对,那么是的,它将被破坏。
$ \ endgroup $
– Hauleth
17-4-6在22:46



$ \ begingroup $
@ŁukaszNiemier我没有说它“过时”了一个哈希。我写的那本书必须被认为是破损的(如“理论上的突破”)。看,如果您碰巧碰到了这样的碰撞,则称为“理论中断”,如果您有意产生此类对,则称为“实际中断”。第一个是警告标志,而我在回答中指出的内容,第二个实际上是一个死刑判决。 (即使实际上已损坏,也应注意在有限的情况下以及仍然可以使用此类哈希的非常特定的方式……但是其初始功能不安全。
$ \ endgroup $
– e-sushi
17-4-6在22:58



$ \ begingroup $
评论不用于扩展讨论;此对话已移至聊天。
$ \ endgroup $
– e-sushi
17年4月13日在1:28

#3 楼

严格来说,您可以做到,而且这是您可以做到的理由。

SHA-1哈希具有$ 2 ^ {160} $可能的值。如果仅考虑$ 100 $字节的二进制明文,那么可能有$ 2 ^ {800} $个。因此,有理由认为,对于任何SHA-1哈希,都可能有大约$ 2 ^ {640} $ $ 100 $个字节的二进制明文与之匹配。*

当两个输入具有相同的哈希,这称为哈希冲突。对于非安全的哈希,找到碰撞并不是特别困难。这甚至不是设计目标。例如,Java类通常具有hashCode()方法,该方法生成用于促进数据结构(如HashMap)的哈希。但是这些算法使用的算法被设计为廉价运行,几乎不会产生意外碰撞。如果您想用相同的哈希码故意制作两个对象,通常很容易。

密码散列的设计目的不是使碰撞不可能发生,而是使它们极难发现。也就是说,如果您的目标是查找生成给定哈希值的输入,则没有办法比蛮力更快-依次尝试每个输入,直到一个可行为止。

背后的数学有据可查-如果您愿意,可以找一本书;这不是解释它的地方(我也不能)。

...并不是每一次碰撞都是有用的。考虑一个签名的电子邮件。可能会有很多数据块产生相同的哈希值。但是其中只有一小部分看起来像文本。而且其中只有一小部分看起来像英文文本。可能只有其中一个看起来像是声称的发件人可能写的英文文本。您安全。最好的密码安全性设计为,在我们最快的计算机上,暴力破解所花费的时间将比地球的寿命更长(可能是宇宙!)。

例如,由于存在$ 2 ^ {256} $个可能的SHA256哈希,因此,如果尝试了$ 2 ^ {255} $个不同的输入,则有$ 1/2 $的概率找到一个冲突。每次尝试花费一微秒的时间,大约需要花费$ 10 ^ {63} $年。同时有两个目标哈希值-但是数量仍然很大,随着计算机功能的增强,我们将继续使用更长的哈希值。)

如果有人发现密码学哈希在理论上被认为是无效的

但是,即使是较弱的算法也可以提供安全性-如果有人掌握了我的密码哈希,那么花了5年的时间才能找到冲突,嗯,永远不会介意,那时我已经更改了密码。数字出来。但是请注意,哈希码的短短并不是SHA-1唯一的问题。它有一些缺陷,以至于暴力破解并不是发现碰撞的唯一方法。

评论


$ \ begingroup $
如果您不对纯文本进行散列(或签名),例如一个PDF文件,其中有足够的空间隐藏碰撞产生的“随机噪声”。因此,将有许多具有类似散列的“看似合理”的PDF文件,而不仅仅是一个。 (当然,要找到一个以上的对象仍然很困难,除非哈希被打乱了。)
$ \ endgroup $
–PaŭloEbermann
17年4月8日在8:59



$ \ begingroup $
@PaŭloEbermann,实际上,很难找到一个,除非哈希被破坏。
$ \ endgroup $
–通配符
18-10-23在19:52

$ \ begingroup $
@Wildcard我的意思是很难找到多个具有相同散列的(彼此)。当然,每个文件都具有与其自身相同的哈希值。
$ \ endgroup $
–PaŭloEbermann
18-10-23在20:05

$ \ begingroup $
我将注意到SHA-1已足够损坏,可以生成具有相同散列但内容不同的成对“看起来合理”的PDF文件。 CWI + Google通过实际生成一对具有相同SHA-1散列但内容不同的PDF文件证明了这一点。他们更改了文档的颜色,但是更改文本也同样容易。
$ \ endgroup $
–布赖恩
19年4月17日在17:06



#4 楼

我正在猜测您的困惑源于何处。

哈希函数的单向性与成为非内射函数的数学性质无关。

对于所有$ x \ neq y $,具有内射功能的函数$ f $具有不同的值$ f(x),f(y)$。实际上,散列函数通常是非内射的(这可以很容易地从其域大于其共域的事实中得出)。但这不是单向的含义。

而是说哈希函数是单向的,这特别排除了您要执行的操作,即找到一个值$ x $使得$如果您已经有$ y $,则H(x)= y $。换句话说,给定$ x $,您可以计算$ H(x)$,但无法倒退。因此,“单向”。

当然,如e-sushi所给出的简单答案是:因为它们是构造而成的,所以不可能。 :)

评论


$ \ begingroup $
很好。这很好地解释了为什么模除(%)并不是真正的哈希函数。如果您知道x%3为0,那么想出无数个与x哈希相同的值就很简单了。
$ \ endgroup $
–亚历山大
19年3月3日在23:15

#5 楼

我们实际上不知道是否不能逆转哈希值。没有数学证据证明反向哈希很难。反向散列存在于FNP中,因此,任何这样的证明都是关于NP硬度的有力结果(FNP和NP的硬度是微不足道的)。源于旨在消除已知(以及假设的)弱点的算法,这些弱点将使其易于逆转。

评论


$ \ begingroup $
尽管信鸽原则在许多情况下会胜过NP问题,但通常我们会散列比块宽更宽的内容。因此,信息将不可避免地丢失。
$ \ endgroup $
–Paul Uszak
19年4月16日在10:55

$ \ begingroup $
@PaulUszak这是事实。尽管如此,该问题仍然特别要求散列为相同值的任何字符串。
$ \ endgroup $
–拉法·道吉德(RafałDowgird)
19年4月17日在13:26

$ \ begingroup $
尽我所能,我找不到能从数学上证明SHA哈希函数家族是FNP的参考。该Wiki页面en.wikipedia.org/wiki/Security_of_cryptographic_hash_functions声称,此类哈希函数属于“ ad hoc”类别,该类别虽然很难,但是没有形式数学将它们与形式化的计算复杂性问题的层次联系起来。拥有一个支持此类主张的链接将非常高兴。
$ \ endgroup $
–车轮
19/12/15在19:34



$ \ begingroup $
@Wheezil我只声称反向哈希在FNP中,而不是完全FNP或FNP硬。
$ \ endgroup $
–拉法·道吉德(RafałDowgird)
19/12/16在11:39

$ \ begingroup $
当然可以。感谢您的澄清。您的答案似乎暗示着一个更牢固的联系,即,如果一个人能够逆转哈希,那么一个人也将能够解决NP中的问题。但这种情况并非如此。那么,发现弱点并逆转哈希值对FNP或NP中更广泛的问题没有任何意义吗?换一种方式...如果要显示P = NP,也可以反转哈希吗?
$ \ endgroup $
–车轮
19/12/17在15:27



#6 楼



澄清:这个问题有一个错误的假设。尽管我错误地解决了该缺陷的细节,但我的答案却很明显。只是要明确地说:

您可以逆转某些哈希!!!单向不是散列函数的要求或关注!!!甚至对于加密哈希的子集也不是100%保证不可逆!

根据情况,您的里程数会有所不同,但是在适当的情况下,您可以相对轻松地反转任何哈希(加密技术正在拒绝试图反转您的哈希值的人有足够的信息来这样做。)


澄清-这个问题可能是关于加密哈希值的问题,但没有这么说。就像所有狗都是动物一样,但并非所有动物都是狗一样,加密哈希是哈希的子集,并且有许多常规用途的哈希不适合用作加密哈希。

我可以在我的脑海中,想出了制作有用的哈希函数的许多方法,这些方法很难逆转。您还可以使用私钥/公钥ssh密钥对进行散列,如果您拥有其他密钥,则该散列是可逆的,但其他情况则不能。


原始答案继续说明“哈希函数”的真正含义(并且一种方法/不可逆不是哈希函数的要求):

计算机科学中的散列最初用于“散列”表,并涉及将非均匀分布的输入集分布在有限的输出集上以进行有效索引。对于快速执行,它们通常过于简单,并且通常不具有强大的密码功能。

(中等笨拙的哈希函数可以像将输入作为数字并使用质数获取其模数一样简单。 -这意味着所有输入位都会影响输出结果,但是一个可能的输入值就是哈希(作为一个字符串,在左边到字节边界留有零填充)。
维基百科上有一篇有用的简短文章:https://en.wikipedia.org/wiki/Cryptographic_hash_function


密码哈希函数是一类特殊的哈希函数,具有使其适合用于密码学。


有用的阅读-它详细介绍了难以反转的哈希函数的可逆性。 (如果有足够的时间和处理能力,任何事情都是不可逆的-您可以遍历所有可能性-您可以尝试付出更大的努力,然后再进行相应的努力)。 com / questions / 63052 / reversible-hash-function“是否有任何可逆的哈希函数?”

评论


$ \ begingroup $
问题不是问什么是密码哈希函数。它是在问什么使加密哈希函数不可逆,您没有回答这个问题。
$ \ endgroup $
–卡巴斯德
17年4月9日在12:32

$ \ begingroup $
希望现在已经清楚了,我正在解决问题中明显的缺陷和扩展的细节。
$ \ endgroup $
– iheggie
17年4月10日在17:41

$ \ begingroup $
“这个问题可能是在谈论密码散列,但没有这么说。”这个问题不需要这么说,就在该网站的标题中。
$ \ endgroup $
– CodesInChaos
17年4月10日在18:46

$ \ begingroup $
密码学的关键是否认试图扭转您的哈希值的人有足够的信息这样做-是不正确的。事实是,加密哈希服从Kerckhoffs的原理,就像加密安全密码一样。作为一个实际的例子:每个人都知道SHA-3的内部和工作原理。什么都没有隐藏。但是,即使算法是众所周知的,也没有人能够将哈希结果返回到其输入,因为这样做是完全不可行的。
$ \ endgroup $
– e-sushi
17年6月19日在19:08



$ \ begingroup $
“您还可以使用私钥/公钥ssh密钥对来创建一个哈希,如果您拥有另一个密钥,则该哈希是可逆的,但否则不能。这就是所谓的“加密”,它与哈希运算完全不同。我不想堆砌这个答案,但这确实是不正确的,不仅是一点不正确,而且听起来似乎很合理,足以使任何刚开始使用密码学的人感到困惑。因此,我的-1。
$ \ endgroup $
–通配符
18-10-23在19:56