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格式),也会导致校验失败。
解决方案
- 修复解密函数逻辑,先将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); } }
- 如果修改后还是提示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
相关产品推荐
相关产品推荐

