org_heigl / password
密码对象 - 阻止密码意外泄露到日志或堆栈跟踪!
Requires
- php: ^7.2
- ext-sodium: *
Requires (Dev)
- phpunit/phpunit: ^7.1
- tm/tooly-composer-script: ^1.2
This package is auto-updated.
Last update: 2024-08-26 15:57:25 UTC
README
密码对象 - 阻止密码意外泄露到日志或堆栈跟踪!
范围
此包包含一个对象,可以像使用纯文本密码一样使用和传递。唯一的区别是纯文本密码不会意外泄露到日志文件或堆栈跟踪或 var_dump
输出。
范围不是提供密码或值对象,您可以直接将其传递到持久层进行存储。相反,您绝不应存储此对象。
这只是一个对密码字符串的薄包装,试图防止您意外地将密码字符串泄露到您不希望看到的地方。
该对象使用 sodium_crypto_secretbox
对密码进行加密。因此,如果有人找到一种方法将私有属性公开,那里将只有一个加密的二进制代码。用于加密和解密的nonce和密钥存储在常量中,并将随每个请求替换。因此,当您在单个请求中创建两个Password对象时,它们将使用相同的nonce和密钥。由于这些值作为常量存储,它们不会意外泄露。您必须主动处理它们。防止这一点超出了此包的范围!
由于此对象的目标不是以安全的方式存储密码(您将使用哈希算法来做这件事,不是吗?),而是防止它意外地以明文形式泄露,这是我可以接受的妥协。
为什么?
围绕推特将密码泄露到日志文件的讨论让我深思。
实际上,当您将堆栈跟踪放入日志时,密码意外出现在日志文件中的情况相当容易发生。这让我想到了如何避免这种情况。对我来说,答案是带有一些逻辑的值对象,它处理密码但不会意外泄露它。
就在今天(2019年3月21日),又宣布了一起明文密码泄露事件。这次是Facebook的数亿个账户在多年的时间里泄露了。更多详情请查看 Krebs on Security 或直接在 Facebook 上阅读。
安装
最好使用composer安装,如下所示
composer require org_heigl/password
用法
不要传递密码字符串,而是创建一个Password对象并传递它。
$password = Password::createFromPlainText($request->getParam('password')); // Do not forget to remove the password from your request-object!! $request->setParam('password', '*****');
您还可以直接使用PHP的密码哈希API
$password->matchesHash($hashFromPhpPasswordHashingApi);
此外,您可以通过以下方式为密码获取一个新的哈希值
$hash = $password->getNewHash();
为了总结PHP密码哈希API的API,还有一个方法可以检查密码是否应该重新哈希
$password->shouldBeRehashed();
为了能够在数据库中安全地存储密码,您可以使用以下方法检索已哈希的密码
$password->hash($algorithm, $options);
其中 $argument
和 $options
是 password_hash 的相应参数
如果您确实需要获取初始化密码对象时使用的纯文本密码(例如,用于 ldap_bind
),您也可以这样做
$plaintextPassword = $password->getPlainTextPasswordAndYesIKnowWhatIAmDoingHere();