在php中哈希(用盐)用户名和密码

时间:2012-07-05 15:10:53

标签: php security hash salt saltedhash

我正在创建一个用户登录功能,但我看到了最佳方法的混合视图。

这就是我在想的事情......

  • 使用基于子串的2个散列盐来散列用户名 用户名。
  • 使用随机生成的2个哈希盐来哈希密码 表格,包含密码和用户名。

这是否过度,错误,甚至不够安全?

6 个答案:

答案 0 :(得分:4)

Salting可以防止彩虹表,因此使用2种盐不会比1更好。黑客需要知道盐才能用彩虹表破解你的密码,他们能做到的唯一方法是如果他们有权访问数据库表。如果他们有,他们无论如何都有盐。

密码越长,用蛮力做的就越难,所以更长的密码会比额外的盐更好。

每次从数据库中读取用户名时,对您的用户名进行Salting和哈希都会增加不必要的开销。使用密码,您只需在登录时加盐和哈希。

理想情况下使用类似BCrypt的内容,随着moore's law的继续,加密散列函数可以随着时间的推移自适应地减慢速度。这将减少蛮力攻击的可能性。

答案 1 :(得分:2)

我会说哈希用户名是过度的,密码的两个盐也是如此。一盐就足够了。

请务必使用安全哈希算法,例如SHA-512。

答案 2 :(得分:1)

像其他人所说的那样,哈希用户名是矫枉过正的,一个盐就足够了。使用数学上缓慢的算法 - 对于破解者来说也会很慢。

答案 3 :(得分:1)

只需输入密码即可。含有两种盐基本上相当于产生更长的盐。

散列用户名会使管理用户变得比使登录更安全更困难。考虑制作当前用户的列表,但您拥有的是散列版本?请记住,散列的要点是对数据进行不可逆转的“加密”。

考虑使用crypt()对您的密码进行哈希处理。特别注意Blowfish方法,因为这被认为是目前最安全的散列方法。

答案 4 :(得分:0)

我刚刚回答another SO question详细介绍了如何处理登录和密码安全问题。值得一读。 (一些花絮:用户名不需要被腌制。密码肯定应该是盐腌,但一旦你需要的话。我使用SHA-256。)

答案 5 :(得分:0)

确实没有必要对用户名字段进行哈希处理,这应该是您愿意在网页上显示的内容,同时保证您的系统安全。话虽如此,虽然没有必要,但如果你愿意忍受它,它会受到伤害。

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

另外,非常重要:

确保您使用强大的哈希函数

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