【问题标题】:using sha256 as hashing and salting with user's ID使用 sha256 作为用户 ID 的散列和加盐
【发布时间】:2010-01-11 18:29:56
【问题描述】:

我将为我的网站使用 sha256,以保护我的用户密码,并且作为盐,我正在考虑使用用户 ID(int auto_increment)。这将是独一无二的,但不是很长和很难,并且是公开的(user.php?id=1),但它是否唯一很重要?

hash('sha256', $id . $password);

【问题讨论】:

    标签: php hash


    【解决方案1】:

    是的,盐的唯一性很重要(碰撞不太可能发生),但它也应该有足够的熵(随机且足够长)。用户 ID 不是随机的,可能太短,所以最好的办法是使用随机生成的字符串并将它们与哈希一起存储在数据库中。

    假设 UID 9 的用户选择了一个愚蠢的密码:password。然后,将被散列的结果字符串可能是9password。您可以想象,即使在这种情况下,完整的字符串也可能出现在rainbow tables(包含大量哈希及其原始字符串的表)中。

    如果这种情况下的盐是OTAzMzYzODQzMjk5NTM1NDc1N,则要散列的字符串是OTAzMzYzODQzMjk5NTM1NDc1Npassword,它不太可能出现在彩虹表中。此外,输入字符串更长,降低了暴力攻击的风险。

    【讨论】:

    • “另外,哈希字符串要长得多”。我很确定 sha256 会创建一个 32 字节的字符串,无论输入字符数如何。
    • @rick,抱歉不清楚。我的意思是输入字符串更长。
    • 盐的独特性并不重要。 salt的目的是保护简单的密码。即使系统中的所有密码都用相同的值加盐,也可以实现这一点。更重要的是盐是一个随机值并且有足够的字符。
    • @deamon,如果盐不是唯一的,你的密码散列会泄漏信息,因为具有相同密码(和相同盐)的不同用户也将具有相同的密码散列。不好。碰撞不是灾难,但使用系统范围的“盐”是有风险的。
    • @Rupert,散列不会增加熵。
    【解决方案2】:

    这可行,但使用盐的目的是区分散列密钥以加强加密算法。使用唯一的、随机生成的/时间加盐字符串作为盐会更好。另外最好不要在同一个表中包含盐和哈希键。

    【讨论】:

      【解决方案3】:

      你的盐应该不容易猜到。在其中一种更基本的形式中,您可以简单地使用基于当前 TIMESTAMP 的盐创建一个盐

         date('U')
      

      由于其长度、唯一性以及您将其存储在数据库中并且不公开提供这一事实,它更加安全。然后你会以这样的方式使用它:

      $hash = date('U');
      $pass = hash('sha256', $hash . $password);
      

      以及在登录时检查密码:

      // return query object based on matching email/username
      if ($userobj->pass === hash('sha256', $userobj->salt .$_POST['pass'])) {
          // correct pass
      }
      

      【讨论】:

      • 对你的数据库加盐并不是为了让密码更加保密,它应该阻止已经获得你的散列密码的黑客能够使用彩虹表来破解散列。即使他有盐和密码哈希,要得到密码仍然非常困难。
      • @Ian - 为了证明我自己的观点,用盐来掩盖密码散列不就可以做到吗?让密码更保密?
      • @Ian - 使用盐可以创建彩虹表,前提是攻击者猜测加密算法以及盐是如何附加到密码的。如果原始密码较弱,则会被揭开。
      • 此方法的另一个好处是在用户的 INSERT 之前提前知道日期(而不是自动递增的 id)。这样,您可以在创建用户的同时执行哈希服务器端。这很好,因为您通常不能在 sql 中执行 sha256,并且不想再次往返服务器,冒着没有任何密码的用户的风险!
      【解决方案4】:

      我认为这不是一个好的选择:我会使用更随机的盐将其保存到用户记录中。 也许在密码字段中保存这个字符串: sha256($password . $randomSalt) 。 '$' 。 $随机盐

      这样你就可以在登录时检索盐来检查密码。

      (无论如何你也可以单独使用另一个字段作为盐)

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 1970-01-01
        • 2011-07-30
        • 2011-07-27
        • 2011-02-27
        • 2014-10-13
        • 2015-08-06
        • 2015-02-17
        相关资源
        最近更新 更多