使用随机盐改进密码哈希

2022-08-30 19:38:11

我正在创建一个网站,并且我正在尝试决定如何加密用户密码以将其存储在SQL数据库中。

我意识到使用简单的md5(密码)是非常不安全的。我正在考虑使用sha512(password.salt),我一直在研究生成有用盐的最佳方法。我读过许多文章,指出盐应该尽可能随机,以向哈希添加熵,这看起来是一个好主意。但:

  • 您需要将随机盐与哈希一起存储
  • 鉴于攻击者以某种方式访问了您的散列密码(并试图将散列反转为纯文本),这意味着他可能转储了您的数据库,然后也获得了对您的随机盐的访问权限

难道不是很明显,数据库中哈希值旁边的奇怪值是盐吗?如果攻击者可以访问盐和哈希值,那么如何更安全?

有人在这方面有任何专业知识吗?谢谢!


答案 1

攻击者被“允许”知道盐 - 您的安全性必须以一种即使知道盐的方式设计,它仍然是安全的。

盐有什么作用?

Salt有助于使用预先计算的“彩虹表”防御暴力攻击。
Salt使攻击者的蛮力更加昂贵(在时间/内存方面)。
计算这样的表是昂贵的,通常只有当它可以用于多个攻击/密码时才能完成。
如果您对所有密码使用相同的盐,攻击者可以预先计算这样的表,然后将密码暴力破解为明文...
只要您为要存储哈希的每个密码生成一个新的(最好的加密很强)随机盐就没有问题。

如果你想进一步
加强安全性,你可以计算哈希值几次(哈希哈希等) - 这不会花费你太多,但它使暴力攻击/计算“彩虹表”更加昂贵...请不要自己发明 - 有经过验证的标准方法可以做到这一点,例如,请参阅 http://en.wikipedia.org/wiki/PBKDF2http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

注意:

使用这种机制是当今的mandatrory,因为“CPU时间”(可用于彩虹表/蛮力等攻击)变得越来越广泛(例如,请参阅亚马逊的云服务是全球最快的50台超级计算机之一,任何人都可以使用相对较少的数量)!


答案 2

鉴于攻击者以某种方式访问了您的散列密码(并试图将散列反转为纯文本),这意味着他可能转储了您的数据库,然后也获得了对您的随机盐的访问权限

腌制的全部意义在于击败“彩虹表”:

http://en.wikipedia.org/wiki/Rainbow_table

看看为什么足够长的盐会打败“防御彩虹表”一节下的任何彩虹表

如何更安全?

它曾经更安全,因为它迫使攻击者尝试一种非常昂贵的暴力破解方法,而不是在预先计算的彩虹表中立即查看。如果你有一个64位的盐,攻击者需要有2 ^ 64个预先计算的彩虹表,而不是一个......换句话说:它使彩虹表变得毫无用处。

但请注意,现代GPU每秒可以破解数十亿个密码,这使得攻击者存储巨大的彩虹表几乎毫无意义(而不是存储数十亿个哈希值,只需在几秒钟内计算它们)。

如今,您希望使用PBKDF2或scrypt之类的东西来存储“密码”。


推荐