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

iOS RNCryptor加密base64串用Node.js jscryptor解密HMAC校验失败

问题原因

HMAC校验失败本质是Node.js侧传入解密函数的加密数据格式、或者使用的解密库参数和iOS端RNCryptor加密规则不匹配,结合VB.NET可正常解密的情况,具体可分为以下几点:

  • 入参格式错误:Node.js侧的jscryptor库Decrypt方法默认接收二进制Buffer类型的加密数据,你当前代码直接传入base64编码的字符串,会被库当成原始加密二进制计算HMAC,自然校验不通过;而VB.NET的解密库默认对入参的base64字符串做了自动转二进制处理,所以可以正常解密。
  • 错误被静默捕获:你当前代码的catch块没有打印异常信息,无法第一时间定位到具体的校验错误类型。
  • 解密结果编码错误:iOS端加密的原始数据是UTF8编码,你解密后转成ascii格式会出现乱码,就算校验通过也无法得到正确结果。
  • 库版本不匹配:部分旧版本的jscryptor包不支持RNCryptor V3格式(iOS端kRNCryptorAES256Settings默认使用V3格式),也会导致校验失败。
解决方案
  1. 修复解密函数逻辑,先将base64编码的加密数据转成Buffer再传入解密方法,同时放开错误打印、使用正确的UTF8编码解析解密结果:
function decryptString(data) {
    const RNCryptor = require('jscryptor');
    const password = '1234567890123456789012';
    try {
        // 统一转成加密二进制Buffer
        const encryptedBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'base64');
        const decryptedResult = RNCryptor.Decrypt(encryptedBuffer, password);
        // 用UTF8编码解析结果
        console.log(decryptedResult.toString('utf8'));
    } catch (e) {
        // 打印具体错误方便排查
        console.error('解密失败:', e.message);
    }
}
  1. 如果修改后还是提示HMAC校验失败,替换为支持RNCryptor V3格式的兼容包:
# 卸载旧的jscryptor
npm uninstall jscryptor
# 安装兼容V3格式的rncryptor包
npm install rncryptor

替换后代码不需要做其他修改,用法和jscryptor完全一致。
3. 可选校验:打印加密Buffer的第一个字节console.log(encryptedBuffer[0]),RNCryptor V3格式的第一个字节固定为0x03,如果数值不符说明传输过程中加密数据被篡改或者截断,需要排查传输链路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 14:45:00