PHP 5.3 推荐使用哪种 bcrypt 实现?

Posted

技术标签:

【中文标题】PHP 5.3 推荐使用哪种 bcrypt 实现?【英文标题】:Which implementation of bcrypt is recommended for PHP 5.3? 【发布时间】:2013-03-17 19:56:05 【问题描述】:

好的,我终于了解了 bcrypt,它是如何工作的,以及如何将它存储在数据库中,所以我几乎可以开始了。现在的问题是选择与 php 5.3 一起使用的 bcrypt 实现。

看到所有不同的解决方案我都快疯了,我不确定哪一个是最推荐和最安全的,所以我再次求助于你们。

这是我找到的:

1) https://gist.github.com/marcoarment/1053158

2)http://www.openwall.com/phpass/

3)https://***.com/a/6337021/869849

4) ...其他的?

这些是可互换的,还是产生不同的哈希?我想认为,由于它们都是“bcrypt”,它们会产生相同的结果,但我不确定(我在上面测试了1)2),它们似乎可以互换,因为@产生的哈希值987654329@ 在2) 上签出)。

那么 PHP 5.3 推荐的解决方案是什么?

【问题讨论】:

Are these interchangeable, or do they produce different hashes? 为什么不加载它们并尝试一下? 最佳解决方案:您应该使用 PHP 5.5 内置的密码库。他们发布了 PHP 5.3 和 5.4 的向后兼容版本。见here。但是请注意,您需要 5.3.7 或更高版本。 5.3.7 之前的 bcrypt 存在安全问题,这意味着新库将无法工作。 @nickb:我的意思更笼统,因为我实际上尝试过1)2),它们似乎可以互换,正如我在上面的帖子中提到的那样。 @Spudley:不幸的是,我的 PHP 在 5.3.7 之下,否则那将是理想的。您认为下一个最佳选择是什么? @Programmer - 理想情况下你应该立即升级(注意:我确实提到旧版本的 bcrypt 存在安全问题)。如果您因任何其他原因无法升级或无法使用 Password_compat 库,我建议的下一个最佳选择是同一作者的 PasswordLib。 【参考方案1】:

最佳解决方案:您应该使用 PHP 5.5 内置的密码库。他们发布了一个向后兼容的 PHP 5.3 和 5.4 版本,称为password_compat。但是请注意,您需要 5.3.7 或更高版本。 5.3.7 之前的 bcrypt 存在安全问题,这意味着新库将无法工作。

如果您使用的是 5.3.7 之前的版本,那么下一个最佳选择是同一作者的 Password Lib。但我建议升级 PHP 会是更好的选择。

正在安装

这两个库都可以安装,只需下载它们,将它们复制到您的站点文件夹,并将它们的主文件包含在您的代码中 - 即require('password.php');

如果您正在使用它,也可以选择通过 Composer 安装。

用法(假设您使用 password_compat):

创建密码:

$hash = password_hash($password, PASSWORD_BCRYPT);

验证密码:

if (password_verify($password, $hash)) 
    /* Valid */
 else 
    /* Invalid */

这基本上就是您需要知道的全部内容。该库会为您处理所有其他细节,例如加盐密码等。

[编辑] 如果您需要根据您的评论更改算法“成本”,请在 password_hash() 调用中添加一个附加参数以指定它,如下所示:

password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));

我在上面链接的下载页面上提供了完整的文档。

使用 password_compat 库的真正好处在于,它经过专门设计,具有与 PHP 5.5 中的标准一样内置于 PHP 中的相同 API 和功能。因此,如果您在使用 PHP 5.3 或 5.4 时使用 password_compat,那么当您迁移到 PHP 5.5 时,您的系统中已经有了正确的代码来使用新的内置密码函数。唯一的区别是您不需要include 图书馆。

【讨论】:

谢谢斯普德利!当我最终升级到 PHP 5.5 时,我需要做什么/改变? @Programmer - 它是兼容性库的名称。如果您以后切换到 PHP 5.5,您只需删除 require('password.php') 就可以了,PHP 5.5 中的函数将具有相同的名称和相同的参数。 @Programmer - 我已经修改了答案以使其更清晰。 :-) @Programmer - 已经有一个很好的默认值 10,所以你可以简单地忽略它。如果你想使用另一个成本因素,你可以这样写password_hash($password, PASSWORD_BCRYPT, ["cost" => 11]) @Programmer - 编辑答案以包含其他示例,指定成本参数(即您询问的“回合”功能)。【参考方案2】:

如果您尝试更新到 PHP 5.5,请在迁移之前查看此内容,本手册有一些非常有趣的要点,应该在升级之前阅读

从 5.3 到 5.4 的更改以及发行说明的向后不兼容页面

http://php.net/manual/en/migration54.incompatible.php

【讨论】:

我在链接页面上找不到任何与password_hash() 的使用有关的内容。 @martinstoeckli 不,这与password_hash() 无关,它用于从 PHP 5.3.x 升级到 5.5 我有同样的问题,我得到了升级到 PHP 5.5 的解决方案,所以我读到了关于升级的信息页面。 好的,但是这和这个问题有什么关系呢? 我正在阅读有关此“最佳解决方案:您应该使用 PHP 5.5 内置的密码库的答案。他们已经发布了 PHP 5.3 和 5.4 的向后兼容版本称为 password_compat。但请注意,您需要 5.3.7 或更高版本。5.3.7 之前的 bcrypt 存在安全问题,这意味着新库将无法工作。所以我为任何计划升级的人写了“如果您尝试更新到 PHP 5.5,请在迁移之前查看此内容”。就是这样。 嗯,这个安全问题是用2y 算法而不是2a 解决的,两者都产生BCrypt 哈希。即使您使用 2a 创建了哈希,您也可以使用 PHP 5.5 验证它们,因此它向后兼容的。只有使用一些非常奇怪和无效的 unicode 密码,您才会遇到任何麻烦,但即便如此,2a 的使用仍然是最好的可用算法。

以上是关于PHP 5.3 推荐使用哪种 bcrypt 实现?的主要内容,如果未能解决你的问题,请参考以下文章

用 bcrypt (PHP) 比较两个哈希值

PHP的BCrypt无法验证密码

如何在 vba 中使用 Bcrypt.Net 对 PHP 中 crypt 函数存储的密码进行身份验证

PHP:Mcrypt - 哪种模式?

[将Bcrypt与phpto哈希密码结合使用不起作用

npm install bcrypt报错