geminilabs / wp-password-bcrypt
WordPress 插件,用 PHP 5.5 的 password_hash 和 password_verify 函数替换 wp_hash_password 和 wp_check_password 的 phpass 混淆器。
Requires
- php: >=5.5.0
- composer/installers: ~1.0
Requires (Dev)
- brain/monkey: ^1.3.1
- mockery/mockery: ^0.9.4
- phpunit/phpunit: ^4.8.23|^5.2.9
- squizlabs/php_codesniffer: ^2.5.1
This package is auto-updated.
Last update: 2019-11-02 14:18:46 UTC
README
重要:wp-password-bcrypt 的官方版本与此版本唯一不同的是,此版本允许您使用 composer 安装为“必须使用”插件。(见下面的文档 以下)
wp-password-bcrypt 是一个 WordPress 插件,用于用现代且安全的 bcrypt 替换 WP 过时且不安全的基于 MD5 的密码散列。
此插件需要 PHP >= 5.5.0,它引入了内置的 password_hash
和 password_verify
函数。
查看 提高 WordPress 密码安全性 了解此插件和密码散列问题的更多背景。
要求
- PHP >= 5.5.0
- WordPress >= 4.4(见 https://core.trac.wordpress.org/ticket/33904)
安装
此插件是一个 Composer 库,因此可以通过几种方式安装
Composer 自动加载
composer require roots/wp-password-bcrypt
wp-password-bcrypt.php
文件将自动由 Composer 自动加载,并且 不会 出现在您的插件中。
作为使用 Composer 的“必须使用”插件
以下是一个使用 composer-installers 将此插件作为 mu-plugin 安装的 composer.json 示例
{ "require": { "php": ">=5.6", "composer/installers": "^1.5.0", "geminilabs/wp-password-bcrypt": "^1.0.0" }, "extra": { "installer-paths": { "public/wp-content/mu-plugins/{$name}/": [ "type:wordpress-muplugin", "geminilabs/wp-password-bcrypt" ] }, "wordpress-install-dir": "public" } }
手动作为“必须使用”插件
如果您不使用 Composer,您可以将 wp-password-bcrypt.php
手动复制到您的 mu-plugins
文件夹中。
我们不推荐将其用作正常(非 mu)插件。这使得禁用或删除插件变得过于简单。
问题
WordPress 仍然使用基于 MD5 的密码散列方案。他们实际上使 25% 的网站变得更不安全,因为他们拒绝提高其最低 PHP 要求。通过继续允许 EOL PHP 版本回退到 5.2,他们无法使用像 password_hash
这样的新功能。
这是一个 已知 问题,WordPress 已经忽视了超过 4 年。WordPress 不仅将不安全的默认值设置为 MD5,而且不执行以下任何一项:
- 记录此问题
- 提供有关如何修复它并使其更安全的说明
- 通知用户关于较新 PHP 版本他们 可能 更加安全
MD5有什么问题?简单来说:它生成密码学安全的哈希值既便宜又快速。
解决方案
WordPress至少做了一件好事:它们将wp_check_password
和wp_hash_password
设置为可插拔函数。这意味着我们可以在插件中定义这些函数,并“覆盖”默认的函数。
此插件插入了3个函数
wp_check_password
wp_hash_password
wp_set_password
wp_hash_password
这个函数很简单。此插件只是调用password_hash
而不是WP的默认密码哈希器。可以使用wp_hash_password_options
过滤器来设置password_hash
可以接受选项。
wp_check_password
从核心来看,这个函数只是调用password_verify
而不是默认的。然而,它还会检查用户的密码是否曾经用旧的基于MD5的哈希器进行过哈希处理,并使用bcrypt重新进行哈希处理。这意味着您仍然可以在现有网站上安装此插件,一切都将无缝运行。
与默认的WP函数一样,提供了check_password
过滤器。
wp_set_password
此函数直接包含在此处,但添加了返回哈希值。默认的WP函数不返回任何内容,这意味着您会无端地对其哈希两次。
常见问题解答
安装插件后,现有密码会发生什么?
一开始没有任何事情。现有密码只有在用户登录时才会用bcrypt重新进行哈希处理。如果用户从未登录,则其密码将永远使用MD5哈希存储在您的数据库中。
为什么此插件不重新哈希数据库中的所有现有密码?
目前这超出了插件的范围。我们希望保持简单直接。这可能是留给个别开发者或未来可能的一个单独插件的最佳做法。有关更多详细信息,请参阅https://github.com/roots/wp-password-bcrypt/issues/6。
如果我删除/停用插件会发生什么?
神奇的是,一切仍然正常。有关更多详细信息,请参阅此评论。
现有bcrypt哈希密码将保持原样。任何新用户或重置密码的用户将获得新的MD5哈希密码。
为什么您不使用password_compat库,以便在PHP 5.3.7之前也能正常工作?
如果真的需要,password_compact库很棒。但Roots团队提倡使用受支持的PHP版本,目前(截至2016年3月)是5.5及以上。安全性的一部分是使用仍然获得安全补丁的PHP版本,因此我们不会积极支持旧的不受支持的PHP版本。
为什么此插件不在管理界面中显示?
如果您使用Composer,则wp-password-bcrypt.php
文件将自动自动加载。由于包类型未设置为wordpress-muplugin
,因此它不会显示在插件列表中。
为什么不用作必须使用的插件而不是插件?
如上所述,您一旦启用此插件,就不希望禁用它。将其安装在 plugins
中(作为“正常”插件)而不是在 mu-plugins
中(作为必用插件),会使管理员用户意外禁用它成为可能。
这与已存在的其他插件有何不同?
有一些插件已经存在,可以启用bcrypt。此插件不同之处在于我们绕过了WordPress核心使用的PasswordHash
类和phpass
库。此插件直接使用PHP的内置password_hash
和password_verify
函数,仅支持PHP 5.5及以上版本。
我已经使用了双因素认证和/或防止暴力破解登录尝试。此插件仍然有帮助吗?
比bcrypt更安全的散列函数与双因素认证、暴力破解尝试保护或任何在登录阶段起作用的机制具有不同的目的。如果攻击者能够访问您的数据库,强大的散列函数非常重要。这将使得从散列值中确定明文密码变得更加困难/实际上不可能。而MD5则是 trivial。用于保护登录的工具/插件仍然很重要,应与此插件一起使用。
进一步阅读
password_hash
RFC- PHP中的安全密码存储
- 如何安全地存储密码
贡献者
它已被Roots团队修改并打包。Jan Pingel (@Einkoro) 已授权我们将其原始BSD许可代码重新发布为MIT许可。
贡献
欢迎每个人贡献。我们提供了贡献指南,以帮助您开始。
社区
跟踪开发和社区新闻。
- 在Roots Discourse上参与。
- 关注@rootswp在Twitter上的动态。
- 阅读并订阅Roots博客。
- 订阅Roots通讯。
- 收听Roots播客。