【问题标题】:Does Bcrypt require anything to make it secureBcrypt 是否需要任何东西来确保其安全
【发布时间】:2015-02-25 12:28:18
【问题描述】:

我已经研究了一段时间的加密方法,到目前为止我发现 Bcrypt 是目前最好的方法之一。我还没有得到 Bcrypt 的精确工作方式。我知道解决它需要更长的时间,这就是为什么它使暴力破解如此困难。

但我不明白它是否需要其他措施(例如随机盐)来确保其安全。尤其是在阅读了 md5 以及在哈希变得安全之前几乎必须使用随机盐之后。

我在 php.com 上找到的示例代码是这样的:

$options = [  'cost' => 12, ];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

我猜成本只是让它运行 12 次以加密单词“rasmuslerdorf”。并且“PASSWORD_BCRYPT”选择 Blowfish 算法。

PASSWORD_DEFAULT 和 PASSWORD_BCRYPT 之间有什么大的区别吗? 我在注册时使用默认功能加密密码是否足够。而不是将用户登录时输入的加密后的密码与数据库中的加密密码进行比较?

【问题讨论】:

  • BCrypt 不是加密
  • 每次运行 password_hash() 时都会生成一个随机盐(除非您使用 options 参数修复它)。
  • 没有。但要知道它会在 71 个字符后截断。

标签: php security encryption bcrypt


【解决方案1】:

我猜成本只是让它运行了 12 次函数来加密单词“rasmuslerdorf”

不,成本参数会影响要完成的工作量。

但我不明白它是否需要其他措施,例如随机盐来确保安全。

password_hash() 函数在您运行时自动生成随机盐;或者,可以通过选项传递自定义盐:

password_hash('bla', PASSWORD_BCRYPT, ['salt' => ...]);

通过传递自定义盐,您被假定知道自己在做什么。出于所有实际目的,您应该安全地坚持使用自动生成的盐。

PASSWORD_DEFAULT 和 PASSWORD_BCRYPT 之间有什么大的区别吗?

PASSWORD_DEFAULT 算法始终使用当时可用的最强算法(前提是您更新了 PHP),以确保您的代码不会过时。显着的区别在于存储要求;而 Bcrypt 总是使用 60 个字符,您需要为将来使用的任何内容提供更大的存储空间(例如 255 个字符)。

然后将用户登录时输入的加密后的密码与数据库中的加密密码进行比较?

请查看password_verify(),了解如何验证用户输入的密码的示例。

【讨论】:

    【解决方案2】:

    Bcrypt 算法是默认算法。所以,PASSWORD_DEFAULTPASSWORD_BCRYPT 是一样的。默认算法可以在您的php.ini 文件中配置,但如果您不知道,那么它很可能仍然是默认算法。

    cost 数字不是散列多少次。使用公式2^cost 计算它被散列的次数。因此,如果成本是 12,那么它将被哈希 2^12 次 (4096)。

    使用该函数时不必考虑盐。它自己创建盐并将其附加到输出哈希:

    $[algorithm]$[cost]$[salt 22 chars][rest is the hash]
    

    在使用密码散列函数时,您不应该接触散列。要验证密码,您应该使用password_verify()

    您使用的功能是为了让人们可以在不知道后台发生什么的情况下对密码进行哈希处理。这是一件好事,因为在哈希密码方面很容易出错,即使您认为自己知道自己在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2016-03-28
      • 1970-01-01
      • 2011-10-12
      • 2013-10-24
      • 1970-01-01
      相关资源
      最近更新 更多