PHP libsodium 现代加密库使用教程

```html PHP libsodium 现代加密库使用教程

PHP libsodium:现代加密库使用教程

libsodium 是 PHP 7.2+ 内置的现代加密扩展(基于 NaCl 库),提供经过严格审计、易用且安全的加密原语。它默认启用,无需额外安装(仅需确认 extension=sodium 在 php.ini 中启用)。

✅ 基础准备与检测

<?php
if (!extension_loaded('sodium')) {
    throw new RuntimeException('libsodium 扩展未启用');
}
echo 'libsodium 版本:' . SODIUM_LIBRARY_VERSION . "\n";
?>

🔒 对称加密:AES-like 安全(XChaCha20-Poly1305)

推荐使用 sodium_crypto_aead_xchacha20poly1305_ietf_encrypt() —— 抗侧信道、支持长 nonce、性能优异:

<?php
$key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen(); // 32 字节密钥
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES); // 24 字节
$message = 'Hello, secure world!';

$ciphertext = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(
    $message, 
    '', // 附加认证数据(AAD),可为空
    $nonce, 
    $key
);

// 解密
$plaintext = sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(
    $ciphertext, 
    '', 
    $nonce, 
    $key
);

var_dump($plaintext === $message); // bool(true)
?>

🔑 非对称加密:密钥封装(Sealed Boxes)

无需管理 nonce 或公钥验证,sodium_crypto_box_seal() 自动完成密钥协商:

<?php
// 接收方生成密钥对
$kp = sodium_crypto_box_keypair();
$public = sodium_crypto_box_publickey($kp);
$secret = sodium_crypto_box_secretkey($kp);

$message = 'Secret for Alice only';
$encrypted = sodium_crypto_box_seal($message, $public);
$decrypted = sodium_crypto_box_seal_open($encrypted, $kp);

var_dump($decrypted === $message); // true
?>

🛡️ 密码哈希:安全存储用户密码

永远不要用 md5()sha1()!使用 sodium_crypto_pwhash_str()(自动加盐 + 迭代):

<?php
$password = 'user_pass_123';
$hash = sodium_crypto_pwhash_str(
    $password,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

// 验证
if (sodium_crypto_pwhash_str_verify($hash, $password)) {
    echo "密码正确!";
}
sodium_memzero($password); // 清理内存敏感数据
?>
最佳实践提示:
• 所有密钥/nonce 使用 random_bytes() 生成;
• 敏感数据操作后调用 sodium_memzero($var) 防内存泄露;
• 永远验证解密/验签结果,避免时序攻击(libsodium 函数已内置恒定时间比较)。

libsodium 让加密从“高危艺术”回归为“可靠基础设施”。拥抱它,告别 DIY 加密和过时算法——安全,本该如此简单。

```