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
图书馆。
【讨论】:
谢谢斯普德利!当我最终升级到 PHP5.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 实现?的主要内容,如果未能解决你的问题,请参考以下文章