Hash 加密散列函数的要点是什么?
我在读MD5散列值,被接受的答案让我困惑。据我所知,cryptopgraphic哈希函数的一个主要特性是,不可能找到具有相同哈希值的两个不同消息(输入) 然而,对于为什么MD5散列值不可逆这一问题的一致答案是什么?是因为无限多的输入字符串将生成相同的输出。这对我来说似乎完全矛盾 另外,让我有些困惑的是,算法是公开的,但散列值仍然是不可逆的。这是因为哈希函数中总是有数据丢失,所以无法判断哪些数据被丢弃了 当输入数据大小小于固定输出数据大小(例如,散列密码“abc”)时会发生什么情况 编辑: 好的,让我看看我是否有直截了当的回答:Hash 加密散列函数的要点是什么?,hash,cryptography,hash-function,Hash,Cryptography,Hash Function,我在读MD5散列值,被接受的答案让我困惑。据我所知,cryptopgraphic哈希函数的一个主要特性是,不可能找到具有相同哈希值的两个不同消息(输入) 然而,对于为什么MD5散列值不可逆这一问题的一致答案是什么?是因为无限多的输入字符串将生成相同的输出。这对我来说似乎完全矛盾 另外,让我有些困惑的是,算法是公开的,但散列值仍然是不可逆的。这是因为哈希函数中总是有数据丢失,所以无法判断哪些数据被丢弃了 当输入数据大小小于固定输出数据大小(例如,散列密码“abc”)时会发生什么情况 编辑: 好的,
1:散列的主要目的是将一个非常非常大的空间映射到一个更小但仍然非常大的空间(例如,MD5,它将接受'anything',并将其转换为一个大小为2^128的空间——大,但没有aleph-0那么大。) 除了其他特性外,良好的哈希均匀地填充目标空间。错误的散列以一种笨拙的方式填充空间,对许多常见输入产生相同的散列 想象一下愚蠢的散列函数sum(),它只是将输入数字的所有数字相加:它成功地向下映射,但在输出空间的低端存在一系列冲突(输入具有相同的输出,如3、12和21),而空间的上端几乎为空。其结果是空间利用率很低,容易开裂等 因此,即使使用了目的地空间,一个好的散列也很难找到具有相同输出的两个输入,只是可能性很小:如果MD5是完美的,那么两个输入具有相同输出的可能性将是2^-128。这是相当不错的机会:在不使用更大的输出空间的情况下,您可以做到最好。(事实上,MD5并不完美,这也是它易受攻击的原因之一。) 但是大量的输入会映射到任何给定的散列,这仍然是事实,因为输入空间是“无限的”,将无限除以2^128仍然会得到无穷大 2:是的,散列总是导致数据丢失,除非输出空间与输入空间相同或大于输入空间——在这种情况下,您可能不需要散列 3:对于较小的输入,最佳做法是在输入中加盐。实际上,这对于任何加密散列都是很好的做法,因为否则攻击者可以向您提供特定的输入,并试图找出您正在使用的散列“Salt”只是一组附加信息,您可以将其附加(或前置)到您的输入中;然后散列结果 编辑:在密码学中,哈希函数抵抗前像攻击也很重要,直觉上,即使知道许多其他输入/输出对,也很难猜测给定输出的输入。“sum”函数可能很容易猜测(但由于它破坏数据,因此可能不容易反转) 然而,对于“为什么MD5散列值不可逆?”这一问题的一致答案是因为“无限多的输入字符串将生成相同的输出。” 这对于任何哈希函数都是正确的,但它不是加密哈希函数的本质 对于短输入字符串(如密码),理论上可以反转加密哈希函数,但在计算上不可行。也就是说,你的计算时间太长,没有用处 这种不可行的原因是,输入在散列值中是如此彻底地“混合在一起”,以至于与计算所有输入的散列值的暴力攻击相比,不可能用更少的努力将其分离 “为什么MD5哈希值不可逆?”是因为“无限多个输入字符串>将生成相同的输出” 这就是无法反转哈希函数(获取相同的输入)的原因。 加密散列函数是抗冲突的,这意味着很难找到另一个映射到相同输出的输入值(如果散列函数是mod 2:134 mod 2=0;现在无法从结果中获取134,但我们仍然可以找到具有相同输出值(134和2碰撞)的数字2)
当输入小于块大小时,用于使其适合块大小。这些通常是哈希函数的属性 不过,值得注意的是,MD5不应该再使用了,因为它中存在漏洞。查看“漏洞”部分和详细说明这些攻击的外部链接。您可以通过仅更改消息中的128位来进行MD5冲突 SHA-1对于简单的散列是安全的,尽管有一些攻击会使它对资金雄厚的实体(政府、大公司)更弱 SHA-256是未来二十年科技发展的安全起点。警告:答案很长 我认为所有这些答案都缺少加密散列函数的一个非常重要的属性:不仅不可能计算散列得到给定散列的原始消息,也不可能计算将散列到给定散列值的任何消息。这被称为预映像阻力 (作者"im")