HarmonyOS鸿蒙Next中如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题

HarmonyOS鸿蒙Next中如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题

【问题现象】

因安全需要,应用的关键信息需要在端侧进行加密,在云侧进行解密,以判断数据的合法性,端侧使用的是HMACSHA1算法,使用ArkTS实现得到的加密数据跟云侧Java侧加密不一致,导致云侧校验不通过。

HarmonyOS侧加密的数据为:75,199,73,191,89,193,243,73,224,228,50,209,32,40,108,126,240,52,137,165;

云侧Java加密的数据为:75,-57,73,-65, 89,-63,-13,73,-32,-28, 58, -47,32, 40, 108, 126,-16,52,-119,-91;

【背景知识】

HMAC(Hash-based Message Authentication Code)是一种基于哈希的消息认证码算法。

【定位思路】

  1. 使用HarmonyOS侧的实现加密数据,在HarmonyOS侧进行解密发现没有问题,证明HarmonyOS侧加密没有问题。
  2. 查看HarmonyOS加密的数据和云侧加密的数据,发现128以下的可以对应上,128以上的对应不上,并且HarmonyOS侧减去Java侧正好是256,怀疑是有字符格式问题。
  3. 发现Java侧使用的是byte,byte表示范围是-128到127,比如139已经超出了其表示范围,转换过程是由int类型转换为byte类型,有精度丢失,所以是-117。

点击放大

  1. HarmonyOS侧使用了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算法加密后云侧无法解密的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用ArkTS的HMACSHA1算法加密后,云侧无法解密的问题可能由以下原因导致:

  1. 密钥不一致:确保加密和解密时使用的密钥完全相同。密钥的生成、存储和传递过程中可能出现不一致。

  2. 数据编码问题:加密后的数据在传输或存储过程中可能被重新编码或转换,导致云侧无法正确解码。确保加密后的数据以原始格式传递。

  3. 算法实现差异:不同平台或库对HMACSHA1算法的实现可能存在细微差异,导致加密结果不一致。确保云侧使用的算法实现与ArkTS一致。

  4. 数据完整性:加密后的数据在传输过程中可能被篡改或损坏,导致云侧无法正确解密。检查数据传输的完整性和安全性。

  5. 时间戳或随机数:如果加密过程中使用了时间戳或随机数,确保云侧能够正确获取或生成相同的值。

  6. 环境配置:检查云侧的环境配置,确保支持HMACSHA1算法,并且相关库或模块已正确安装和配置。

  7. 日志和调试:启用详细的日志记录,检查加密和解密过程中的每一步,找出具体出错的位置。

通过以上步骤,可以逐步排查并解决HMACSHA1算法加密后云侧无法解密的问题。

回到顶部