我正在创建一个用户登录功能,但我看到了最佳方法的混合视图。
这就是我在想的事情......
这是否过度,错误,甚至不够安全?
答案 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?)。