首页 > 后端开发 > php教程 > 如何使用 libsodium 安全地加密和解密 PHP 字符串?

如何使用 libsodium 安全地加密和解密 PHP 字符串?

Patricia Arquette
发布: 2024-12-18 03:00:10
原创
918 人浏览过

How to Securely Encrypt and Decrypt PHP Strings Using libsodium?

如何加密和解密 PHP 字符串

在讨论加密时,区分加密和身份验证非常重要。通常,首选将加密与消息验证码 (MAC) 相结合的验证加密。为了确保安全,强烈建议避免实现自己的加密技术,而是依赖由加密专家开发和审查的完善的库。

使用 libsodium 的加密步骤:

  1. 在 CTR 模式下使用 AES 加密消息或使用处理身份验证的 GCM
  2. 使用 HMAC-SHA-256 验证密文,确保 MAC 涵盖 IV 和密文。

使用 libsodium 的解密步骤:

  1. 根据收到的密文验证 MAC 苹果。如果验证失败,则中止,表明数据损坏。
  2. 使用经过身份验证的加密方法解密消息。

其他注意事项:

  • 避免在加密之前压缩任何内容。
  • 使用适当的字符串操作函数来处理扩展字符集。
  • 使用加密安全伪随机数生成器 (CSPRNG) 安全地生成 IV。
  • 始终在 MAC 之前执行加密以防止漏洞。
  • 了解潜在信息某些编码方法的泄漏问题。

示例代码钠:

<?php
declare(strict_types=1);

/**
 * Encrypt a message
 * 
 * @param string $message - message to encrypt
 * @param string $key - encryption key
 * @return string
 * @throws RangeException
 */
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
        )
    );
    sodium_memzero($message);
    sodium_memzero($key);
    return $cipher;
}

/**
 * Decrypt a message
 * 
 * @param string $encrypted - message encrypted with safeEncrypt()
 * @param string $key - encryption key
 * @return string
 * @throws Exception
 */
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
    );
    if (!is_string($plain)) {
        throw new Exception('Invalid MAC');
    }
    sodium_memzero($ciphertext);
    sodium_memzero($key);
    return $plain;
}
?>
登录后复制

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

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