首页 > 后端开发 > php教程 > 如何使用 Libsodium 或 defuse/php-encryption 安全地加密和解密 PHP 字符串?

如何使用 Libsodium 或 defuse/php-encryption 安全地加密和解密 PHP 字符串?

Mary-Kate Olsen
发布: 2024-12-18 00:26:10
原创
119 人浏览过

How to Securely Encrypt and Decrypt PHP Strings Using Libsodium or defuse/php-encryption?

加密和解密 PHP 字符串

问题:
我们如何加密和解密 PHP 字符串,需要原始字符串和盐或密钥

答案:
在继续之前了解加密和身份验证之间的区别至关重要。为了实现强大的安全性,我们建议使用加密身份验证,这需要先加密然后进行身份验证。

避免创建自己的加密技术;相反,使用由密码学专家开发的可靠库。我们强烈建议使用 libsodium 或 defuse/php-encryption,因为它们易于使用且内置经过身份验证的加密。

加密步骤:

  1. 使用 AES在 CTR 模式下进行加密。
  2. 使用以下方式验证密文HMAC-SHA-256(或Poly1305)。

解密步骤:

  1. 重新计算密文的MAC并与原始MAC进行比较。如果不匹配则中止。
  2. 继续解密。

设计注意事项:

  1. 避免压缩密文。
  2. 使用 mb_strlen() 和mb_substr() 具有“8 位”字符集模式。
  3. 利用 CSPRNG 生成 IV。避免使用 MCRYPT_RAND。
  4. 在身份验证之前始终进行加密(除非使用 AEAD)。
  5. 注意缓存计时漏洞。

何时不使用加密:

  • 密码存储(请改用 Argon2 等密码哈希算法)
  • URL 参数加密(不适当的工具)

Libsodium PHP 示例:

function safeEncrypt(string $message, string $key): string
{
    if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
        throw new RangeException('Key is not the correct size (must be 32 bytes).');
    }
    $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
    $cipher = base64_encode(
        $nonce.
        sodium_crypto_secretbox(
            $message,
            $nonce,
            $key
        )
    );
    return $cipher;
}
登录后复制

利钠解密:

function safeDecrypt(string $encrypted, string $key): string
{
    $decoded = base64_decode($encrypted);
    $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
    $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
    $plain = sodium_crypto_secretbox_open(
        $ciphertext,
        $nonce,
        $key
    );
    return $plain;
}
登录后复制

defuse/php-加密 示例:

use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;

$message = 'We are all living in a yellow submarine';
$key = Key::createNewRandomKey();
$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);
登录后复制

以上是如何使用 Libsodium 或 defuse/php-encryption 安全地加密和解密 PHP 字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板