我正在创建一个用户登录功能,但我看到了关于最佳方式的不同看法。
这就是我想做的事情......
- 使用基于用户名子字符串的 2 个散列盐对用户名进行散列。
- 使用 2 个随机生成的散列盐对密码进行散列,这些盐与密码和用户名一起保存在一个表中。
这是矫枉过正,错误,甚至不够安全吗?
我正在创建一个用户登录功能,但我看到了关于最佳方式的不同看法。
这就是我想做的事情......
这是矫枉过正,错误,甚至不够安全吗?
加盐可防止彩虹表,因此拥有 2 个盐不会比 1 个更好。黑客需要知道盐才能使用彩虹表破解您的密码,他们能做到这一点的唯一方法是如果他们有访问数据库表。如果他们有,无论如何他们都有两种盐。
密码越长,使用蛮力就越难,因此更长的密码将比额外的盐更好。
每次从数据库中读取用户名时,对用户名进行加盐和散列处理都会增加不必要的开销。使用密码,您只需要在登录时加盐和散列。
理想情况下使用BCrypt之类的东西,随着摩尔定律的继续,加密散列函数可以随着时间的推移自适应地减慢。这将减少暴力攻击的机会。
我会说散列用户名是多余的,密码的两个盐也是如此。一种盐就足够了。
请务必使用安全散列算法,例如 SHA-512。
就像其他人说的,散列用户名是多余的,一个盐就足够了。使用数学上很慢的算法- 对饼干来说也很慢。
给你的密码加盐一次就足够了。拥有两种盐基本上相当于生成更长的盐。
散列用户名将使您更难管理用户,而不是使登录更安全。考虑列出您当前的用户,但您所拥有的只是散列版本?请记住,散列的目的是对您的数据进行不可逆的“加密”。
考虑使用crypt()对您的密码进行哈希处理。特别注意 Blowfish 方法,因为这被认为是目前最安全的散列方法。
我刚刚回答了另一个关于如何处理登录名和密码安全的详细信息的SO 问题。它可能值得一读。(一些花絮:用户名不需要加盐。密码肯定应该加盐,但你只需要一次。我使用SHA-256。)
确实没有必要对您的用户名字段进行哈希处理,这应该是您愿意在网页上显示的内容,同时保证您的系统安全。话虽如此,虽然它是不必要的,但如果你愿意忍受它就不会受到伤害。
如果它们都来自并存储在同一个地方,那么添加两种盐是毫无意义的。我不会这样做,而是使用用户名的排列作为盐,以及随机生成并存储在数据库中的长随机字符串。如果您仍然偏执,(我猜您是整个“散列用户名”的事情)我会考虑添加您在整个应用程序中使用的第三种盐。
另外,非常重要:
确保使用强哈希函数
确保使用安全的散列函数。whirlpool、sha256 及以上、tiger 或任何其他您可以使用的东西(检查hash_algos())。另外,看看实现 bcrypt,它非常慢(如何在 PHP 中使用 bcrypt 对密码进行哈希处理?)。