使用随机盐改进密码哈希

时间:2012-02-23 20:28:03

标签: php mysql security hash sha

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

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

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

数据库中散列旁边的怪异外观值是不是很明显?如果攻击者可以使用哈希值访问salt,那么它更安全吗?

任何人都有该领域的专业知识吗?谢谢!

5 个答案:

答案 0 :(得分:40)

攻击者“允许”知道盐 - 您的安全性必须设计为即使知道盐仍然是安全的。

盐有什么作用?

Salt使用预先计算的“彩虹表”帮助抵御暴力攻击 对于攻击者来说,盐使蛮力更加昂贵(在时间/记忆方面) 计算这样一个表是很昂贵的,通常只有当它可以用于多个攻击/密码时才会这样做 如果您对所有密码使用相同的盐,则攻击者可以预先计算此类表格,然后将您的密码暴力强制为明文...
只要你为每个密码生成一个新的(最好的cryptogrpahically强)随机盐你想存储哈希就没有问题。

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

注意:

现在使用这样的机制是 mandatrory ,因为“CPU时间”(可用于彩虹表/蛮力等攻击)正变得越来越广泛(参见例如亚马逊的云服务是全球速度最快的超级用户中的前50名之一,任何人都可以使用相对较少的数量)!

答案 1 :(得分:15)

  鉴于攻击者以某种方式访问​​了您的哈希密码   (并试图将哈希值反转为纯文本),这意味着他   可能会丢弃您的数据库,然后可以访问您的随机盐   还

腌制的全部意义在于打败“彩虹桌”:

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

了解为什么足够长的盐会在“防御彩虹表”部分下击败任何彩虹表。

  

怎么更安全?

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

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

现在你想使用像PBKDF2或scrypt这样的东西存储你的“密码”。

答案 2 :(得分:0)

散列密码密码的强度取决于以下所有因素:

  • 散列算法的强度
  • 盐的随机性
  • 密码的随机性

您的系统与上述最弱的系统一样强大。

答案 3 :(得分:0)

以下问题来自姐妹网站Security StackExchange。他们讨论散列,盐,PBKDF2,bcrypt,scrypt等一些事情。

此处还有一些关于StackOverflow的讨论:

Is BCrypt a good hashing algorithm to use in C#? Where can I find it?

简而言之,对于一个问题,盐是一种安全措施,使得在发生危害时恢复密码需要很长时间,就像哈希一样。如果攻击一个密码,盐就不会有所作为。如果尝试使用预先计算的字典或同时测试多个密码,每个条目使用不同的盐将大大增加所需的工作量,并且通常会使生成合适的彩虹表不可行。

答案 4 :(得分:-1)

这是一篇关于密码学的好文章:http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html

有关盐的讨论,请参阅哈希算法的实际使用情况,方案1 一节。

我强烈建议您使用http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html生成盐