PHP libsodium 现代加密库使用教程
自 PHP 7.2 起,libsodium 成为内置扩展(无需额外安装),提供经过严格审计、易用且安全的现代密码学原语。它替代了易出错的传统函数(如 mcrypt),是当前 PHP 加密实践的黄金标准。
✅ 基础准备
确保已启用扩展(PHP 7.2+ 默认启用):
var_dump(function_exists('sodium_crypto_secretbox')); // 应返回 true
🔐 对称加密:AES 级别安全(推荐)
使用 sodium_crypto_secretbox() 进行认证加密(AEAD),防止篡改:
<?php
$key = sodium_crypto_secretbox_keygen(); // 32 字节随机密钥
$nonce = sodium_crypto_secretbox_noncegen(); // 24 字节唯一 nonce
$message = "Hello, secure world!";
// 加密
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
// 解密(需相同 key + nonce)
$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext === false) {
throw new Exception("解密失败:密文被篡改或密钥错误");
}
echo $plaintext; // Hello, secure world!
?>
🔑 非对称加密:安全密钥交换
生成密钥对并加密敏感数据(如 API 密钥):
<?php
// 生成密钥对
$keypair = sodium_crypto_box_keypair();
$publicKey = sodium_crypto_box_publickey($keypair);
$secretKey = sodium_crypto_box_secretkey($keypair);
// 发送方:用接收方公钥加密
$recipientPublicKey = $publicKey; // 实际中由对方提供
$nonce = sodium_crypto_box_noncegen();
$message = "API_TOKEN=abc123";
$encrypted = sodium_crypto_box($message, $nonce, $recipientPublicKey, $secretKey);
// 接收方:用自己的私钥解密
$decrypted = sodium_crypto_box_open($encrypted, $nonce, $publicKey, $secretKey);
echo $decrypted; // API_TOKEN=abc123
?>
🧩 其他高频场景
- 密码哈希:用
sodium_crypto_pwhash_str()替代password_hash()(更抗暴力) - 随机数生成:始终用
sodium_random_bytes(32),而非rand()或mt_rand() - 消息认证码(MAC):用
sodium_crypto_generichash()校验完整性
重要提示:• 每次加密必须使用新生成的 nonce(不可复用);
• 密钥/nonce 需安全存储(如环境变量),切勿硬编码;
• libsodium 函数全部为恒定时间实现,天然防御时序攻击。
• 密钥/nonce 需安全存储(如环境变量),切勿硬编码;
• libsodium 函数全部为恒定时间实现,天然防御时序攻击。
告别过时的 mcrypt 和脆弱的自定义加密方案——libsodium 让安全成为默认选项。只需几行代码,即可获得工业级加密保障。