HarmonyOS 鸿蒙Next 如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题 鸿蒙场景化案例
HarmonyOS 鸿蒙Next 如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题 鸿蒙场景化案例
【问题现象】
因安全需要,应用的关键信息需要在端侧进行加密,在云侧进行解密,以判断数据的合法性,端侧使用的是HMACSHA1算法,使用ArkTS实现得到的加密数据跟云侧Java侧加密不一致,导致云侧校验不通过。
鸿蒙侧加密的数据为:75,199,73,*************,40,108,126,240,52,137,165;
云侧Java加密的数据为:75,-57,73,*****************,-16,52,-119,-91;
【背景知识】
HMAC(Hash-based Message Authentication Code)是一种基于哈希的消息认证码算法。
【定位思路】
(1)使用鸿蒙侧的实现加密数据,在鸿蒙侧进行解密发现没有问题,证明鸿蒙侧加密没有问题。
(2)查看鸿蒙加密的数据和云侧加密的数据,发现128以下的可以对应上,128以上的对应不上,并且鸿蒙侧减去Java侧正好是256,怀疑是有字符格式问题。
如上可以发现第一个是75,鸿蒙侧和Java侧都是75,第二个鸿蒙侧为199,Java侧为-57,区间相差256,同理第三个正常,第四个区间又是相差256。
(3)发现Java侧使用的是byte,byte表示范围是-128到127,比如139已经超出了其表示范围,转换过程是由int类型转换为byte类型,有精度丢失,所以是-117。
(4)鸿蒙侧使用了Uint8Array,是一个无符号8位整数数组,它的取值范围是0到255,139在其表示范围内,所以是139。
【解决方案】
ArkTS中Int8Array类型数组表示一个二进制位有符号整数数组。它的取值范围是-128到127。需要将doFinal返回的数组转换为Int8Array的类型。
代码示例如下:
convertUint8ToInt8Array(u8: Uint8Array): Int8Array{
const init8Array = new Int8Array(u8.length)
for (let i = 0; i < u8.length; i++) {
const value = u8[i];
init8Array[i] = value > 127 ? value - 256 : value
return init8Array
}
}
【总结】
(1)Mac类是常用的加解密类,其方法的参数或返回值一般是Unity8Array组成的数组DataBlob,使用该类的方法时可能会存在类似的问题,需要根据本文所述方案进行转换。
(2)Unity8Array类型是ArkTS的常用类型,ArkTS中其他类也有一些方法的返回值是Unity8Array类型,如果出现返回值溢出的问题时可参考本文进行转换。
针对HarmonyOS鸿蒙Next使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题,可以尝试以下解决方案:
- 确认密钥一致性:确保加密和解密使用的HMAC密钥完全一致。任何微小的差异都可能导致解密失败。
- 数据格式检查:确认加密后的数据在传输过程中未被篡改或损坏,且格式正确。如果数据经过编码,解密前需要先进行相应的解码。
- 算法实现核对:检查HMACSHA1算法的实现是否正确,包括填充方式、初始化向量(如果适用)等。
- 环境兼容性:确认鸿蒙Next与云侧环境的兼容性,包括加密算法库的版本和API支持情况。
如果以上步骤均未能解决问题,建议检查相关的系统日志或错误报告,以获取更详细的错误信息。同时,也可以考虑使用其他加密算法或工具进行加密和解密,以确保数据的正确性和安全性。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html