You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
});

通用排查技巧

  1. 校验key/iv一致性:在React Native中打印key和iv的字符串,与PHP端输出对比,必须完全匹配
  2. 在线工具验证:用在线AES加密工具模拟PHP逻辑:
    • 密钥输入PHP的$key字符串,选择「密钥为ASCII字符串」
    • IV输入PHP的$iv字符串,选择「IV为ASCII字符串」
    • 模式选AES-256-CBC,填充选PKCS#7,明文输入abc,输出选Base64,确认结果是否与后端一致
  3. 检查填充方式:确保React Native库默认使用PKCS#7填充(多数加密库默认支持,若结果不符可手动指定)

内容的提问来源于stack exchange,提问作者suja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:45:33