typisttech / wp-password-argon-two
使用 PHP 的原生函数,使用 Argon2i 散列和 SHA-512 HMAC 安全地存储 WordPress 用户密码到数据库中。
Requires
- php: ^7.2 || ^8.0
Suggests
- typisttech/wp-password-argon-two-env: Allows you configure WP Password Argon Two with environment variables
Conflicts
README
注意
WP Password Argon Two 已被 弃用。
如果您想维护 WP Password Argon Two 的分支,请阅读这篇 博客文章 (Wayback Machine 快照)。否则,请使用 roots/wp-password-bcrypt。
WP Password Argon Two
使用 PHP 的原生函数,使用 Argon2i 散列和 SHA-512 HMAC 安全地存储 WordPress 用户密码到数据库中。
目标
用 Argon2i 散列和 SHA-512 HMAC 替换 WordPress 的 phpass 散列器。
改编自 Mozilla 安全编码指南
- 数据库中存储的密码应使用 hmac+argon2i 函数。
HMAC 和 Argon2i 存储的目的如下
- Argon2i 提供了一种散列机制,可以通过配置使其消耗足够的时间来防止对散列值的暴力破解,即使有多个计算机
- Argon2i 可以在任何时候轻松调整以增加工作量,从而提供对更强大系统的保护
- HMAC值的nonce(盐)设计为存储在文件系统中,而不是存储密码散列的数据库中。如果在SQL注入的情况下散列值被泄露,由于它不会从文件系统中泄露,nonce(盐)仍然是一个未知值。这显著增加了考虑到Argon2i和大型未知nonce(盐)值的暴力破解泄露散列的复杂性。
- HMAC操作仅在Argon2i设计中存在设计弱点,可能泄露有关密码的信息或帮助攻击者时,用作次要防御。
神奇时刻
WP Password Argon Two仅在以下情况下工作:
-
从非常旧的WordPress版本升级
用户密码使用MD5散列
-
从最近的WordPress版本升级
用户密码使用phpass散列器
-
用户密码使用Bcrypt散列
-
更改Argon2i选项
-
在将旧盐值移动到
WP_PASSWORD_ARGON_TWO_FALLBACK_PEPPERS
的同时使用新的盐值
用户密码将在下一次登录时重新散列。
要求
做你的作业
不要盲目相信互联网上任何随机的安全指南/插件 - 包括这个!
做你的研究
PHP 7.2+ 和编译 --with-password-argon2
检查PHP是否编译了Argon2
# Good: Compiled with Argon2 ➜ php -r 'print_r(get_defined_constants());' | grep -i argon [PASSWORD_ARGON2I] => 2 [PASSWORD_ARGON2_DEFAULT_MEMORY_COST] => 1024 [PASSWORD_ARGON2_DEFAULT_TIME_COST] => 2 [PASSWORD_ARGON2_DEFAULT_THREADS] => 2 [SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13] => 1 [SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13] => 2 [SODIUM_CRYPTO_PWHASH_STRPREFIX] => $argon2id$
如果您没有得到上述输出,请重新编译PHP 7.2+并使用标志--with-password-argon2
或
- Ubuntu
➜ sudo add-apt-repository ppa:ondrej/php ➜ sudo apt-get update ➜ sudo apt-get install php7.2
- macOS
➜ brew update ➜ brew install php
安装
第 0 步
第 1 步
此插件不应作为正常WordPress插件安装。
选项 A:通过 Composer 自动加载(推荐)
➜ composer require typisttech/wp-password-argon-two
注意:在src
中的文件将由composer自动加载。WP Password Argon Two 不会出现在WP管理仪表板上。
选项 B:作为一个必须使用的插件(最后手段)
手动将wp-password-argon-two.php
和整个src
目录复制到mu-plugins
文件夹。
# Example
➜ tree ./wp-content/mu-plugins
./wp-content/mu-plugins
├── src
│ ├── Manager.php
│ ├── ManagerFactory.php
│ ├── PasswordLock.php
│ ├── Validator.php
│ ├── ValidatorInterface.php
│ ├── WordPressValidator.php
│ └── pluggable.php
└── wp-password-argon-two.php
第 2 步
选项 A - 使用常量
将这些常量添加到wp-config.php
define('WP_PASSWORD_ARGON_TWO_PEPPER', 'your-long-and-random-pepper'); define('WP_PASSWORD_ARGON_TWO_FALLBACK_PEPPERS', []); define('WP_PASSWORD_ARGON_TWO_OPTIONS', []);
选项 B - 使用环境变量
在应用程序代码中定义所需的常量违反了12因子原则。typisttech/wp-password-argon-two-env
包允许您使用环境变量进行配置。
推荐所有Trellis用户。
用法
胡椒迁移
在某些情况下,您想更改盐值而不更改所有用户的密码。
define('WP_PASSWORD_ARGON_TWO_PEPPER', 'new-pepper'); define('WP_PASSWORD_ARGON_TWO_FALLBACK_PEPPERS', [ 'old-pepper-2', 'old-pepper-1', ]);
在下次用户登录时,其密码将使用new-pepper
重新散列。
Argon2i 选项
由于PHP运行的平台多种多样,成本因素被故意设置得较低,以避免在使用默认成本参数时意外耗尽共享或低资源系统上的系统资源。因此,用户应调整成本因素以匹配他们正在工作的系统。然而,由于Argon2没有“坏”值,因此消耗更多资源被认为比消耗更少资源更好。鼓励用户为他们正在开发的平台调整成本因素。
— PHP RFC
您可以通过 WP_PASSWORD_ARGON_TWO_OPTIONS
调整选项。
// Example define('WP_PASSWORD_ARGON_TWO_OPTIONS', [ 'memory_cost' => 1<<17, // 128 Mb 'time_cost' => 4, 'threads' => 3, ]);
卸载
由于我们无法在没有知道明文密码的情况下重新散列,因此您必须在卸载后重新生成所有用户密码。
常见问题解答
你做了什么密码?
简而言之
password_hash( hash_hmac('sha512', $userPassword, WP_PASSWORD_ARGON_TWO_PEPPER), PASSWORD_ARGON2I, WP_PASSWORD_ARGON_TWO_OPTIONS );
不要只听我的话。阅读 源代码!
我已安装此插件。这是否意味着我的 WordPress 网站是 不可破解的?
没有任何网站是 不可被黑客攻击的。
要拥有一个安全的WordPress网站,您必须保持以下所有内容更新
- WordPress核心
- PHP
- 此插件
- 所有其他WordPress主题和插件
- 服务器上的所有内容
- 其他安全实践
- 您的思维方式
你是否重新发明了加密函数?
当然不是!此插件使用PHP的本地函数。
重复:阅读 源代码!
胡椒迁移看起来很棒。这意味着我可以保留尽可能多的胡椒密钥吗?
从某种意义上说,是的,您可以这样做。然而,每个盐都会使登录过程稍微慢一些。
要测试最坏的情况,请使用错误的密码登录。
如果我的胡椒被泄露怎么办?
- 从
WP_PASSWORD_ARGON_TWO_PEPPER
和WP_PASSWORD_ARGON_TWO_FALLBACK_PEPPERS
中移除该盐。 - 重新生成所有用户密码
胡椒-ing 是完美的吗?
不!阅读 paragonie的解释。
对于那些无法忍受缺点的人,请改用 替代方案 之一。
WordPress 的 phpass 散列器或 Bcrypt 是否不安全?
WordPress的 phpass 散列器和Bcrypt都是安全的。没有紧急的理由要升级。
了解更多关于不使用WordPress默认的 原因。
为什么使用 Argon2i 而不是其他?
基于Argon2的密码派生函数在2015年7月的 密码散列竞赛 中获胜,排名优于Bcrypt和PBKDF2。
Argon2包含3种不同的模式:Argon2d、Argon2i、Argon2id。Argon2i是用于密码散列的。参见: https://crypto.stackexchange.com/a/49969
这个插件有 72 个字符的限制,像 Bcrypt 一样吗?
不。阅读 测试。
这看起来很棒。我在哪里可以找到更多这样的好东西?
- Typist Tech博客上的文章
- wp.org上的 Tang Rufus的WordPress插件
- Typist Tech的GitHub个人资料上的更多项目
- 关注 Typist Tech的通讯
- 关注 Tang Rufus的Twitter账户
- 雇佣 Tang Rufus 来构建您的下一个精彩网站
这个插件不在 wp.org 上。我可以在哪里给 ⭐⭐⭐⭐⭐ 评分?
谢谢!
这个插件不在 wp.org 上。我可以在哪里提出投诉?
说实话,我不在乎。
如果您真的想分享您的1星级评论,请给我发电子邮件 - 在第一段中说明我告诉您阅读插件源代码的次数。
替代方案
支持!
捐赠
喜欢WP Password Argon Two吗?帮助我维护它,这里的 捐赠 可以帮助。
为什么你不雇用我?
准备好接取自由职业WordPress工作。通过以下联系表单与我联系 这里 或通过电子邮件 info@typist.tech
你想以其他方式帮忙吗?你想成为赞助商吗?
联系: Tang Rufus
开发
要设置一个开发者可用的版本,你应该运行以下命令
$ composer create-project --keep-vcs --no-install typisttech/wp-password-argon-two:dev-master
$ cd wp-password-argon-two
$ composer install
运行测试
$ composer test
反馈
请提供反馈!我们希望尽可能多地在项目中使用这个库。请提交一个 问题 并指出你喜欢和不喜欢的地方,或者fork该项目并提出建议。没有问题太小。
变更日志
请查看 变更日志 了解最近有哪些更改。
安全性
如果您发现任何与安全相关的问题,请通过电子邮件 wp-password-argon-two@typist.tech 联系,而不是使用问题跟踪器。
鸣谢
WP Password Argon Two 是一个 Typist Tech 项目,由 Tang Rufus 维护,他是 雇佣 的自由职业开发者。
贡献者完整列表可以在 这里 查找。
许可
MIT许可证(MIT)。请参阅 许可证文件 了解更多信息。