PHP使用openssl扩展实现AES-256-CBC加密解密
介绍了在PHP中使用openssl扩展实现AES-256-CBC加密与解密的完整代码示例,涵盖密钥管理、数据序列化、加密操作及结果还原的具体步骤。
AES-256-CBC加密方法
在PHP中实现加密功能时,通常需要结合 openssl_encrypt 函数。以下示例展示了如何将数据序列化后,使用指定的密钥($key)和初始化向量($iv)进行加密,并最终将结果编码为Base64格式字符串,便于存储或传输。
- 准备数据: 使用
serialize()将原始数据(如数组或对象)转换为字符串。 - 生成 IV: AES-256-CBC 模式需要一个16字节的初始化向量。示例中从固定字符串截取前16位并转为 Base64 保存,以便解密时使用相同的 IV。
- 执行加密: 调用
openssl_encrypt(),算法指定为'AES-256-CBC',选项设为 0(纯文本模式)。 - 封装结果: 将 IV 和加密后的密文组合成 JSON 对象,并对整个对象进行 Base64 编码。
function encrypt($id){
// 1. 序列化数据
$id = serialize($id);
// 2. 定义密钥 (需为32字节用于AES-256)
$key = "1112121212121212121212";
// 3. 设置IV并获取其base64形式,用于后续解密
// 注意:实际生产中建议随机生成IV并存储在密文中
$data['iv'] = base64_encode(substr('fdakinel;injajdji', 0, 16));
// 4. 使用openssl_encrypt进行加密
$data['value'] = openssl_encrypt(
$id,
'AES-256-CBC',
$key,
0,
base64_decode($data['iv'])
);
// 5. 将iv和密文转为json,再转base64返回
$encrypt = base64_encode(json_encode($data));
return $encrypt;
}
AES-256-CBC解密方法
解密是加密过程的逆向操作。需要提取存储的 IV 和密文,使用相同的密钥和解密算法恢复原始数据,最后反序列化还原结构。
- 解码输入: 先 Base64 解码外层字符串,再转为 JSON 对象,分离出
iv和value。 - 还原 IV: 将保存的 Base64 IV 解码回原始二进制字符串。
- 执行解密: 调用
openssl_decrypt(),传入密文、算法、密钥及解码后的 IV。 - 反序列化: 使用
unserialize()还原原始数据结构。若解析失败,通常返回默认值或 false。
function decrypt($encrypt) {
// 1. 定义与加密时相同的密钥
$key = '1112121212121212121212';
// 2. 解码输入数据
// 先base64_decode去除外层编码,再json_decode获取内部结构
$encrypt_data = json_decode(base64_decode($encrypt), true);
if (!$encrypt_data) {
return 0; // 无效数据
}
// 3. 还原IV
$iv = base64_decode($encrypt_data['iv']);
// 4. 执行解密
$decrypt = openssl_decrypt(
$encrypt_data['value'],
'AES-256-CBC',
$key,
0,
$iv
);
// 5. 反序列化
$id = unserialize($decrypt);
// 6. 验证结果有效性
if ($id !== false) {
return $id;
} else {
return 0;
}
}
注意事项与安全建议
- 密钥安全: 示例中的密钥为简单字符串,生产环境中应使用更复杂的随机密钥,并确保密钥不硬编码在源代码中,最好通过环境变量或密钥管理服务获取。
- IV 的唯一性: AES-CBC 模式下,每次加密建议使用随机生成的 IV。示例中将 IV 随密文一起存储(Base64化),这是正确的做法,保证了相同明文在不同时间加密会产生不同密文。
- 错误处理:
openssl_encrypt/decrypt在失败时会返回 false,建议在代码中加入对返回值的判断,防止异常数据进入后续逻辑。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













