2012-02-23 140 views
21

我开始一个网站,我正在尝试决定如何加密用户密码以将它们存储在SQL数据库中。用随机盐改善密码哈希

我意识到使用简单的md5(密码)是非常不安全的。我正在考虑使用sha512(password.salt),我一直在研究生成有用盐的最佳方法。 我阅读了大量文章,指出盐应尽可能随机添加到散列熵,它看起来像个好主意。但是:

  • 需要一起存储在随机盐与哈希
  • 给攻击者以某种方式取得了您的哈希密码(并试图扭转哈希为纯文本),这意味着他可能倾销您的数据库,然后获得访问您的随机盐

是不是很明显,在数据库中散列旁边的怪异看起来的价值是盐?如果攻击者可以随同哈希值一起访问salt,那么更安全吗?

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

+0

不要忘记,毕竟这仍然需要好的密码。 – 2012-02-23 20:41:08

+2

@PeeHaa:攻击者不需要每个盐值的彩虹表吗? – 2012-02-23 21:01:19

+4

盐是有防止彩虹表攻击。现在攻击者不得不为每条记录创建一个彩虹表,而不是每个记录的一个。 – PeeHaa 2012-02-23 21:21:37

回答

40

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

盐是做什么的?

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

如果您想进一步加强安全
你可以计算哈希几次了(哈希散列等等) - 这不会花费你很多,但它使蛮力攻击/计算“彩虹表”,甚至更贵......请不发明自己 - 有可靠的标准方法来做到这一点,例如参见http://en.wikipedia.org/wiki/PBKDF2http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

注:

使用这样的机制这几天mandatrory因为“CPU时间”(可用于彩虹表/强力等攻击)正在得到越来越广泛的应用(例如,参见亚马逊的云服务是全球最快的超级计算机前50名,并且可以任何人使用相对较少的数量)!

+9

或甚至更好的GPU时间 – PeeHaa 2012-02-23 20:32:35

+0

真棒回答谢谢! – Tchoupi 2012-02-23 20:38:49

15

给攻击者以某种方式取得了您的散列密码 (并试图扭转哈希为纯文本),这意味着他 可能抛弃你的数据库,然后得到了您的随机盐接入 也

腌制的整点是打败 “彩虹表”:

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

见为什么足够长的盐击败“防御彩虹桌”下的任何彩虹桌。

这样更安全吗?

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

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

现在,您想使用像PBKDF2或scrypt之类的东西存储您的“密码”。

-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来生成盐

+2

可能因为这个问题是关于PHP的,而且你推荐使用Java库。 – 2012-02-23 21:46:04

+1

而且可能是因为你的答案容易受到linkrot的影响。您应该在答案中包含与问题相关的文章的确切部分。 – kba 2012-02-24 00:18:03

+1

啊,我以为当我点击这个时,我正在看Java标记的问题。这个问题本身从来没有提到PHP。尽管如此,一个非upvote可能已经足够了。我为无礼或积极无益的答案节省下来,但我想这只是我的风格... – 2012-02-24 14:45:13

0

您的散列的强度,盐渍密码依靠所有的下列因素:

  • 的哈希算法
  • 随机性的力量盐的
  • 密码的随机性

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

0

以下问题来自姊妹网站Security StackExchange。他们讨论哈希,盐,PBKDF2,bcrypt,scrypt和其他一些事情。

还有从这里StackOverflow的一些前面的讨论,以及:

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

在简短的回答你的问题,盐是一种保护措施这使得在发生危机时恢复密码需要很长时间,就像散列一样。如果攻击一个密码,盐不会有所作为。如果尝试使用预先计算的字典或同时测试多个密码,为每个条目添加不同的盐将大大增加所需的工作量,并且通常会使生成合适的彩虹表不可行。