如何通过 OpenSSL 在 PHP 中使用 AES-256 算法实现数据的对称加密?
- 内容介绍
- 文章标签
- 相关推荐
本文共计968个文字,预计阅读时间需要4分钟。
直接使用`openssl_encrypt`和`openssl_decrypt`可以实现加密和解密,但密钥长度、IV生成方式和模式选择这三者如果不匹配,解密将失败。
为什么 AES-256-CBC 解密总返回 false
常见错误是密钥长度不对或 IV 长度错配。AES-256 要求密钥正好 32 字节,不是字符串长度 32,而是二进制长度 32 —— 如果你传入 'my-secret-key-256' 这种 ASCII 字符串,它只有 17 字节,openssl_encrypt 不报错但会静默截断或填充,导致解密失败。
- 用
strlen($key) === 32检查密钥字节长度,不是mb_strlen - CBC 模式下 IV 必须是 16 字节,可通过
openssl_cipher_iv_length('aes-256-cbc')动态获取,别硬写 16 - 加密和解密必须用完全相同的
$method字符串,大小写敏感:'AES-256-CBC'和'aes-256-cbc'在某些 OpenSSL 版本中不等价
如何安全生成和复用密钥与 IV
密钥绝不能写死,IV 绝不能复用。每次加密都该新生成 IV,并和密文一起存储/传输;密钥则应从环境变量或 KMS 获取,而不是拼接字符串或哈希固定值。
本文共计968个文字,预计阅读时间需要4分钟。
直接使用`openssl_encrypt`和`openssl_decrypt`可以实现加密和解密,但密钥长度、IV生成方式和模式选择这三者如果不匹配,解密将失败。
为什么 AES-256-CBC 解密总返回 false
常见错误是密钥长度不对或 IV 长度错配。AES-256 要求密钥正好 32 字节,不是字符串长度 32,而是二进制长度 32 —— 如果你传入 'my-secret-key-256' 这种 ASCII 字符串,它只有 17 字节,openssl_encrypt 不报错但会静默截断或填充,导致解密失败。
- 用
strlen($key) === 32检查密钥字节长度,不是mb_strlen - CBC 模式下 IV 必须是 16 字节,可通过
openssl_cipher_iv_length('aes-256-cbc')动态获取,别硬写 16 - 加密和解密必须用完全相同的
$method字符串,大小写敏感:'AES-256-CBC'和'aes-256-cbc'在某些 OpenSSL 版本中不等价
如何安全生成和复用密钥与 IV
密钥绝不能写死,IV 绝不能复用。每次加密都该新生成 IV,并和密文一起存储/传输;密钥则应从环境变量或 KMS 获取,而不是拼接字符串或哈希固定值。

