【问题标题】:is it safe to store crypt() salt in database for password comparison将 crypt() salt 存储在数据库中以进行密码比较是否安全
【发布时间】:2013-06-10 22:59:55
【问题描述】:

请原谅我,我对密码安全和加密完全陌生...

我在比较已使用 php 的 crypt() 函数(使用 blowfish hasing 方法)加密的存储密码与用户输入时遇到问题。我发现可以比较密码的一种方法是存储加密期间使用的盐,然后加密用户输入并将其与存储的密码进行比较。

这是一种安全的做事方式吗?还是有更好(更安全)的方法?

谢谢。

【问题讨论】:

  • 我认为关键是它是一种加密方式,而您比较的方式是唯一的方法。

标签: php encryption passwords blowfish crypt


【解决方案1】:

PHP 生成散列的函数会将盐包含在生成的散列值中。所以如果你存储这个哈希值,你已经存储了盐。验证功能可以只提取此盐并再次使用它进行验证。这种方法是安全的,盐不是秘密的。

PHP 5.5 版将内置对 BCrypt、函数 password_hash() 和 password_verify() 的支持。实际上,这些只是函数 crypt() 的包装,并且应该更容易正确使用它。它负责安全随机盐的生成,并提供良好的默认值。对于 PHP 5.3.7 及更高版本,存在compatibility pack

使用此功能的最简单方法是:

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

【讨论】:

    【解决方案2】:

    为每个用户使用独特的盐是一个非常好的主意。

    存储用于特定用户的唯一盐以及用户的散列密码是一种非常可接受的方法,可能没有得到应有的广泛使用。

    为了混淆可能直接访问数据库用户表的任何人,请考虑将盐和哈希存储在数据库的同一字段中。使用不会成为盐或哈希的一部分的字符,例如冒号 (:) 来分隔它们。这使得在运行时以编程方式将它们分开更容易。

    【讨论】:

    • @ranisalt - 谢谢。有几次我不得不实现自己的安全提供程序,发现这是一种有用的技术。
    • 只是为了增加死胡同的想法。您可以使用已存储在数据库中的任何内容作为盐。如果你有 10 条信息,为什么不选择其中之一作为盐呢?更复杂的是,您可以选择一条信息作为基于另一条信息的盐。例如,姓 A-L 的用户使用创建日期帐户作为盐,但用户 M-Z 使用出生日期作为盐。简单的想法,但你明白了。
    • @Phillip - 我了解到最好使用稍微长一点的随机盐,根据每个用户计算。我的盐通常和哈希一样长。
    • 我通常有 32 个字符长的盐,使用随机的、时间戳和带有 md5 的用户电子邮件,我觉得很安全。您还可以使用 2 个 md5 哈希(每个 20 个字符),这可以生成一个安全且非常随机的 40 个字符的盐。
    • @STLDeveloper,我真的不明白需要将盐放在散列密码的中间,因为就像 martinstoeckli 所说,盐已经在存储的密码的开头。另一件事是,我认为这会创建一个多值寄存器,这与某些数据库“规则”不一致。
    【解决方案3】:

    看看这篇文章:https://sheriframadan.com/2013/05/password-hashing/

    它包含目前被认为是密码加密的最佳做法。它涉及对每个密钥使用具有唯一盐的河豚加密。无需尝试将 hash 和 salt 存储为可解析字符串,因为 salt 和 has 都是一个字符串,可以按原样传递以进行比较操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2012-05-01
      相关资源
      最近更新 更多