【问题标题】:Hashing (with salts) Username and Password in php在php中散列(带盐)用户名和密码
【发布时间】:2012-07-06 00:43:59
【问题描述】:

我正在创建一个用户登录功能,但我看到了对最佳方式的不同看法。

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

  • 使用 2 个基于子字符串的散列盐对用户名进行散列 用户名。
  • 使用 2 个随机生成的散列盐对密码进行散列,这些盐保存在 包含密码和用户名的表格。

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

【问题讨论】:

标签: php security hash salt saltedhash


【解决方案1】:

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

密码越长,使用暴力破解就越难,所以更长的密码会比加盐更好。

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

理想情况下使用BCrypt 之类的东西,随着moore's law 的继续,加密散列函数可以随着时间的推移自适应地减慢。这将减少暴力攻击的机会。

【讨论】:

    【解决方案2】:

    我会说散列用户名是多余的,密码的两个盐也是如此。一种盐就足够了。

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

    【讨论】:

    • 好的,所以我想我已经发现每个人都说这有点矫枉过正,但我​​认为这并没有错或不安全。
    • 确实如此。这更像是一种开销,不会增加不安全感。
    • 推荐使用像bcrypt这样的慢哈希函数,其他的哈希,即使在技术上是安全的,也可能被暴力破解太快。
    【解决方案3】:

    就像其他人所说,散列用户名是多余的,一个盐就足够了。使用数学上很慢的算法 - 破解者也会很慢。

    【讨论】:

      【解决方案4】:

      将密码加盐一次就足够了。拥有两种盐基本上相当于生成更长的盐。

      散列用户名会让您更难管理您的用户,而不是让登录更安全。考虑列出您当前的用户,但您所拥有的只是散列版本?请记住,散列的目的是对您的数据进行不可逆的“加密”。

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

      【讨论】:

        【解决方案5】:

        我刚刚回答了another SO question,详细介绍了如何处理登录名和密码安全性。它可能值得一读。 (一些花絮:用户名不需要加盐。密码肯定应该加盐,但你只需要一次。我使用SHA-256。)

        【讨论】:

        • 您的长篇文章没有提到密钥派生函数及其相对于加密哈希的好处。
        • 感谢您指出 KDF。这对我来说很新鲜。欢迎发表更多评论!
        【解决方案6】:

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

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

        另外,非常重要:

        确保使用强哈希函数

        确保您使用安全的哈希函数。 whirlpool、sha256 及更高版本、tiger 或任何其他您可以使用的东西(检查hash_algos())。另外,看看实现 bcrypt,它非常慢(How do you use bcrypt for hashing passwords in PHP?)。

        【讨论】:

          猜你喜欢
          • 2015-02-17
          • 1970-01-01
          • 1970-01-01
          • 2012-03-24
          • 2013-04-06
          • 2015-08-20
          • 1970-01-01
          • 2015-10-15
          • 2011-07-27
          相关资源
          最近更新 更多