paragonie/password_lock

将Bcrypt-SHA2封装在认证加密中

v3.2.0 2024-05-08 17:07 UTC

This package is auto-updated.

Last update: 2024-09-08 18:07:47 UTC


README

Build Status Static Analysis Latest Stable Version Latest Unstable Version License Downloads

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购买支持协议感兴趣。