React Native中AES-256-CBC加密与PHP后端兼容问题排查
React Native 与 PHP AES-256-CBC 加密兼容问题解决思路
核心对齐点:PHP 加密逻辑拆解
先明确PHP代码的实际处理流程,这是对齐的关键:
- Key生成:对
secret_key做SHA256哈希,返回64字符的十六进制ASCII字符串,直接作为密钥传递给openssl_encrypt(AES-256会自动截取前32字节使用) - IV生成:对
secret_iv做SHA256哈希,返回64字符的十六进制ASCII字符串,取前16个字符作为IV(16字节,正好符合AES-CBC的IV长度要求) - 填充与输出:默认使用PKCS#7填充,输出Base64编码的密文
针对两个加密包的修复方案
1. react-native-aes-crypto 报错修复
你之前的错误是对IV做了不必要的编码转换,导致IV长度不符合要求。正确调用方式:
// 先确保用SHA256生成与PHP一致的hex字符串(可使用react-native-sha256库) const secret_key = "VALUE1"; const secret_iv = "VALUE2"; // 生成和PHP完全一致的key(64字符hex)和iv(16字符hex) const key = await sha256(secret_key); // sha256函数需返回hex字符串 const iv = (await sha256(secret_iv)).substring(0, 16); // 直接传递原始hex字符串作为key和iv Aes.encrypt('abc', key, iv, 'aes-256-cbc') .then(cipher => { console.log('cipher', cipher); // 应输出SNtvZ3Dpv1S88Ha6aVBdcg== }) .catch(error => { console.log('error', error); });
注意:必须确保生成的key和iv字符串与PHP端echo $key;、echo $iv;的输出完全一致。
2. react-native-crypto-aes-cbc 空结果修复
这个包的参数要求与前者不同,需注意三个关键点:
- 密钥长度需传
256而非128 - IV和Key需要转成ASCII字节的Base64编码
- 不要对hex字符串做解码操作(PHP传递的是hex字符串的ASCII字节)
正确调用方式:
const secret_key = "VALUE1"; const secret_iv = "VALUE2"; const key = await sha256(secret_key); const iv = (await sha256(secret_iv)).substring(0, 16); // 将hex字符串转成ASCII字节的Base64 const keyBytes = new TextEncoder().encode(key); const keyBase64 = btoa(String.fromCharCode(...keyBytes)); const ivBytes = new TextEncoder().encode(iv); const ivBase64 = btoa(String.fromCharCode(...ivBytes)); // 调用加密,密钥长度传256 CryptoAesCbc.encryptInBase64( ivBase64, keyBase64, 'abc', '256' ) .then(encryptString => { console.log('encryptString', encryptString); }) .catch(error => { console.log('error', error); });
通用排查技巧
- 校验key/iv一致性:在React Native中打印key和iv的字符串,与PHP端输出对比,必须完全匹配
- 在线工具验证:用在线AES加密工具模拟PHP逻辑:
- 密钥输入PHP的
$key字符串,选择「密钥为ASCII字符串」 - IV输入PHP的
$iv字符串,选择「IV为ASCII字符串」 - 模式选AES-256-CBC,填充选PKCS#7,明文输入abc,输出选Base64,确认结果是否与后端一致
- 密钥输入PHP的
- 检查填充方式:确保React Native库默认使用PKCS#7填充(多数加密库默认支持,若结果不符可手动指定)
内容的提问来源于stack exchange,提问作者suja
相关产品推荐
相关产品推荐

