HarmonyOS 鸿蒙Next 如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题 鸿蒙场景化案例

发布于 1周前 作者 h691938207 最后一次编辑是 5天前 来自 鸿蒙OS

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类型,如果出现返回值溢出的问题时可参考本文进行转换。

1 回复

针对HarmonyOS鸿蒙Next使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题,可以尝试以下解决方案:

  1. 确认密钥一致性:确保加密和解密使用的HMAC密钥完全一致。任何微小的差异都可能导致解密失败。
  2. 数据格式检查:确认加密后的数据在传输过程中未被篡改或损坏,且格式正确。如果数据经过编码,解密前需要先进行相应的解码。
  3. 算法实现核对:检查HMACSHA1算法的实现是否正确,包括填充方式、初始化向量(如果适用)等。
  4. 环境兼容性:确认鸿蒙Next与云侧环境的兼容性,包括加密算法库的版本和API支持情况。

如果以上步骤均未能解决问题,建议检查相关的系统日志或错误报告,以获取更详细的错误信息。同时,也可以考虑使用其他加密算法或工具进行加密和解密,以确保数据的正确性和安全性。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部