Laravel 8中openssl加密设置IV为null返回null如何解决
问题根因
- AES-256-CBC 属于CBC模式的对称加密,标准规则要求必须传入长度为16字节(AES块大小固定为128位)的IV参数,你传入
NULL或空字符串''都不符合参数校验要求,所以openssl_encrypt会直接返回null。 - 第三方接口要求的「IV设置为null」属于行业内约定俗成的表述,实际指使用全0填充的16字节IV,而非真的不传IV或传空值。
可行实现代码
$json = json_encode($params); $method = 'AES-256-CBC'; $key = env('ENCRYPTION_KEY'); // 构造全0填充的16字节IV,匹配第三方要求 $iv = str_repeat("\0", 16); // 提前校验密钥长度:AES-256要求密钥必须为32字节,避免长度错误导致加密失败 if (strlen($key) !== 32) { throw new \Exception('加密密钥长度错误,AES-256要求密钥为32字节'); } return openssl_encrypt($json, $method, $key, 0, $iv);
补充方案
如果使用上述全0IV加密后的结果不符合第三方要求,可确认第三方是否实际要求使用无需IV的ECB模式,对应修改代码即可:
$json = json_encode($params); // 更换为无需IV的ECB加密模式 $method = 'AES-256-ECB'; $key = env('ENCRYPTION_KEY'); if (strlen($key) !== 32) { throw new \Exception('加密密钥长度错误,AES-256要求密钥为32字节'); } // ECB模式下IV参数可直接传null return openssl_encrypt($json, $method, $key, 0, null);
结果校验
加密完成后可先用第三方提供的测试参数、测试密钥运行代码,将加密结果和第三方给出的示例结果做对比,确认匹配即可正常对接。如果结果不匹配,可检查json_encode的参数是否符合第三方要求,比如是否需要设置JSON_UNESCAPED_UNICODE、是否要移除多余转义符等。
内容的提问来源于stack exchange,提问作者Nagesh Katke
相关产品推荐
相关产品推荐

