散列(与盐)的用户名和密码在PHP

问题描述:

我创建一个用户登录的功能,但我已经看到了这样做的最佳方式看法不一。散列(与盐)的用户名和密码在PHP

这里就是我想这样做的......

  • 使用哈希是基于对 用户名子2种散列盐的用户名。
  • 使用2个随机生成的散列盐进行密码散列,这些散列盐通过密码和用户名保存在 表中。

这是矫枉过正,错误,甚至不够安全?

+1

重塑车轮或重新使用其他代码http://www.openwall.com/phpass/ – 2012-07-05 15:22:25

+0

请接受@ImreL的建议。使用像phppass或[PasswordLib](https://github.com/ircmaxell/PHP-PasswordLib)这样的库来生成** strong **散列。 – Leigh 2012-07-05 15:39:59

+0

重新发明*或重新发布其他代码#2 http://php-login.net – Sliq 2012-07-09 12:54:50

盐渍防止彩虹桌,所以有2盐不会比1更好。黑客需要知道盐,以便用彩虹桌破解你的密码,他们可以做到这一点的唯一方法是否他们有权访问数据库表。如果他们有,他们无论如何都有盐。

密码越长,用强力操作就越困难,所以密码长度要比额外的盐好。

每次从数据库中读取用户名时,对用户名进行腌制和哈希处理会增加不必要的开销。使用密码只需登录即可使用密码和散列。

理想情况下使用类似BCrypt的东西,其中随着时间的推移,密码散列函数可以自适应地减慢,因为moore's law继续。这将减少暴力攻击的可能性。

我想说的是哈希的用户名是矫枉过正,因为是密码两种盐。一盐就足够了。

确保使用安全散列算法,如SHA-512。

+0

好的,所以我认为我已经制定出每个人都说它过度杀伤,但我认为它没有错或不太安全。 – Tom 2012-07-05 15:25:58

+0

确实。这更多的是开销,没有增加不安全感。 – Rawkode 2012-07-05 15:27:22

+0

建议使用像bcrypt这样的慢哈希函数,即使它们在技术上是安全的,也可以使用其他哈希函数来强制方式太快。 – martinstoeckli 2012-07-05 16:02:03

与其他人一样说,散列的用户名是矫枉过正和一个盐就足够了。使用算法运算速度慢 - 对于黑客来说也会很慢。

我刚刚回答了another SO question详细介绍了如何处理登录和密码安全性。这可能值得一读。 (一些小技巧:用户名不需要被盐渍,密码绝对应该是盐渍的,但是一次就是你所需要的,我使用SHA-256。)

+0

您的长篇帖子并未提及密钥衍生函数及其对密码哈希的好处。 – Leigh 2012-07-05 15:37:08

+0

感谢您指出KDF的。这对我来说是新的。随意评论更多! – curtisdf 2012-07-05 18:50:04

腌制你的密码一次就足够了。具有两种盐基本上相当于产生较长的盐。

散列用户名会让你更难管理你的用户,而不是使登录更安全。考虑制作一个你当前用户的列表,但你拥有的是散列版本?请记住,散列的重点是对数据进行不可逆的“加密”。

考虑使用crypt()来散列您的密码。尤其要注意Blowfish方法,因为这被认为是目前最安全的哈希方法。

确实没有必要散列您的用户名字段,这应该是您愿意在网页上显示的内容,同时保持系统安全。这就是说,虽然没有必要,但如果你愿意忍受它,它也不会受到伤害。

添加两种盐是相当无意义的,如果它们都来自并存储在同一个地方。而不是这样做,我会使用用户名作为盐的排列,以及随机生成并存储在数据库中的随机长字符串。如果你仍然偏执狂,(我猜想你是整个“散列用户名”的东西),我会考虑添加你在整个应用程序中使用的第三个盐。

另外,非常重要的:

确保您使用一个强大的Hash函数

确保您使用的是安全散列函数。漩涡,sha256及以上,老虎,或其他任何你可以使用的东西(检查hash_algos())。另外,看看实施bcrypt,这是非常缓慢的(How do you use bcrypt for hashing passwords in PHP?)。