paragonie / password_lock
将Bcrypt-SHA2封装在认证加密中
v3.2.0
2024-05-08 17:07 UTC
Requires
- php: ^7.3|^8
- defuse/php-encryption: ^2
- paragonie/constant_time_encoding: ^2|^3
Requires (Dev)
- phpunit/phpunit: ^6|^7|^8|^9
- vimeo/psalm: ^1|^2|^3|^4
README
MIT授权 - 欢迎使用以增强您的PHP项目的安全性
将Bcrypt-SHA384封装在认证加密中。由Paragon Initiative Enterprises发布。也请查看我们的其他开源项目。
依赖于defuse/php-encryption进行认证对称密钥加密。
这与“盐”有什么不同?
“盐”策略通常通过密钥哈希函数(例如HMAC-SHA256)实现,并应用于传递给盐化哈希API(即bcrypt)之前的密码。如果您的盐/ HMAC密钥遭到泄露,您必须重置每个用户的密码,这会成为头疼的问题。
哈希然后加密策略提供了灵活性;如果您的密钥泄露(但,奇迹般地,哈希没有泄露),您可以解密所有用户的哈希,然后使用新密钥重新加密它们,他们永远不会因非计划中的密码重置而感到不便。
这比仅使用bcrypt更安全吗?
- 您不必担心bcrypt的72个字符限制
- 您不必担心意外创建空字节截断漏洞
- 如果您的数据库遭到黑客攻击,并且您的数据库位于与您的web服务器不同的机器上,攻击者必须首先解密哈希,然后才能尝试破解其中的任何一个。
这是前两个点的概念证明。
但现实情况下,这个库与bcrypt一样安全。
用法示例
哈希密码,加密哈希,验证密文
use \ParagonIE\PasswordLock\PasswordLock; use \Defuse\Crypto\Key; $key = Key::createNewRandomKey(); if (isset($_POST['password'])) { if (!is_string($_POST['password'])) { die("Password must be a string"); } $storeMe = PasswordLock::hashAndEncrypt($_POST['password'], $key); }
验证MAC,解密密文,验证密码
if (isset($_POST['password'])) { if (!is_string($_POST['password'])) { die("Password must be a string"); } if (PasswordLock::decryptAndVerify($_POST['password'], $storeMe, $key)) { // Success! } }
确定是否需要重新哈希
use ParagonIE\PasswordLock\PasswordLock; /** * @var string $encryptedPwhash * @var Defuse\Crypto\Key $key */ if (PasswordLock::needsRehash($encryptedPwhash, $key)) { // Recalculate PasswordLock::hashAndEncrypt() }
使用不同的加密密钥重新加密哈希
$newKey = \Defuse\Crypto\Key::createNewRandomKey(); $newHash = PasswordLock::rotateKey($storeMe, $key, $newKey);
从库的版本1迁移
$newHash = PasswordLock::upgradeFromVersion1( $_POST['password'], $oldHash, $oldKey, $newKey );
支持协议
如果您的公司在其产品或服务中使用此库,您可能对从Paragon Initiative Enterprises购买支持协议感兴趣。