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 使用
• 敏感数据操作后调用
• 永远验证解密/验签结果,避免时序攻击(libsodium 函数已内置恒定时间比较)。
• 所有密钥/nonce 使用
random_bytes() 生成;• 敏感数据操作后调用
sodium_memzero($var) 防内存泄露;• 永远验证解密/验签结果,避免时序攻击(libsodium 函数已内置恒定时间比较)。
libsodium 让加密从“高危艺术”回归为“可靠基础设施”。拥抱它,告别 DIY 加密和过时算法——安全,本该如此简单。
```