单向函数,散列算法

单向函数,散列算法

问题描述:

基本上单向函数具有两个属性: 1.不可逆 2.碰撞通电阻(这意味着没有两个相同的话具有相同的哈希值,如果指正即时错误)单向函数,散列算法

另一方面,我看到盐渍哈希密码用于为密码的哈希值提供更多的安全性,并为具有相同明文值的密码提供避免碰撞。

那么,为什么会发生这种情况,而不是散列函数应该具有碰撞阻力,为什么当哈希函数已经具有该属性时,Salt必须提供这个功能?

预先感谢您。

+1

想象一下,我知道你使用'SHA256'哈希函数。一些用户选择了非常弱的'123'密码。如果你不放* salt *,我可以使用* brute force *(或* rainbow tables *)来分解它:我将在所有短字符串(包括'123')上运行'SHA256'并找到密码。 –

+2

Salting密码哈希与碰撞没有任何关系。每用户salt保证如果两个(或更多)用户具有相同的密码'“foo”',他们的密码散列将完全不同。因此,攻击者在猜测其中一个用户的密码后,并不会自动获得使用相同密码的所有其他用户的访问权限。 –

如果单向散列函数真的是单向函数,那将是美好的。

如果两个用户选择相同的密码会发生什么?没有盐,他们得到相同的散列。

猜猜是什么?人们不擅长选择密码。这些记忆力有限且缺乏自然内部密码随机性的生物通常会选择短密码,低熵密码和强力密码。

如果你想破解一个不涉及盐的密码的散列,那么只需Google it

盐有助于解决问题,但它不是万能药。对于盐,两个选择相同密码的人不会得到相同的密码哈希值,假定两个用户的盐值不同。盐也有助于防止rainbow table attacks,这是一个时间内存折衷破解密码。

但是,这并不能解决所有问题。如果你的数据库变得公开,那么salt + cryptographic hash是不够的,因为攻击者仍然可以使用brute force-passwords using low cost GPUs

那么解决方案是什么?你不仅需要盐,而且还需要暴力强迫才能成为一个缓慢的过程。这就是为什么我们不使用散列函数的密码,而是我们使用password hashing functions。不要怪我愚蠢的术语,我完全同意。底线:从bcrypt,scrypt,argon2,pbkdf2中选择。我个人推荐bcrypt。

只是想添加一个细节到@TheGreatContini的答案。

  1. 对于密码哈希没有盐,你可能会发现一个 已经预建的彩虹表。
  2. 如果您对所有密码使用单盐,攻击者必须使用此盐建立1个彩虹表,即 以获取所有密码。
  3. 如果每个密码都有其独特的盐分,攻击者将不得不为每个密码创建一个彩虹表。建立一个完整的彩虹表只能得到1个密码没有意义,这就是为什么我们可以说独特的盐防止彩虹表攻击。