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)是一种基于哈希的消息认证码算法。
【定位思路】
- 使用HarmonyOS侧的实现加密数据,在HarmonyOS侧进行解密发现没有问题,证明HarmonyOS侧加密没有问题。
- 查看HarmonyOS加密的数据和云侧加密的数据,发现128以下的可以对应上,128以上的对应不上,并且HarmonyOS侧减去Java侧正好是256,怀疑是有字符格式问题。
- 发现Java侧使用的是byte,byte表示范围是-128到127,比如139已经超出了其表示范围,转换过程是由int类型转换为byte类型,有精度丢失,所以是-117。
- 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
}
}
【总结】
- Mac类是常用的加解密类,其方法的参数或返回值一般是Unity8Array组成的数组DataBlob,使用该类的方法时可能会存在类似的问题,需要根据本文所述方案进行转换。
- Unity8Array类型是ArkTS的常用类型,ArkTS中其他类也有一些方法的返回值是Unity8Array类型,如果出现返回值溢出的问题时可参考本文进行转换。
更多关于HarmonyOS鸿蒙Next中如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中如何解决使用ArkTS的HMACSHA1算法加密后云侧无法解密的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中使用ArkTS的HMACSHA1算法加密后,云侧无法解密的问题可能由以下原因导致:
-
密钥不一致:确保加密和解密时使用的密钥完全相同。密钥的生成、存储和传递过程中可能出现不一致。
-
数据编码问题:加密后的数据在传输或存储过程中可能被重新编码或转换,导致云侧无法正确解码。确保加密后的数据以原始格式传递。
-
算法实现差异:不同平台或库对HMACSHA1算法的实现可能存在细微差异,导致加密结果不一致。确保云侧使用的算法实现与ArkTS一致。
-
数据完整性:加密后的数据在传输过程中可能被篡改或损坏,导致云侧无法正确解密。检查数据传输的完整性和安全性。
-
时间戳或随机数:如果加密过程中使用了时间戳或随机数,确保云侧能够正确获取或生成相同的值。
-
环境配置:检查云侧的环境配置,确保支持HMACSHA1算法,并且相关库或模块已正确安装和配置。
-
日志和调试:启用详细的日志记录,检查加密和解密过程中的每一步,找出具体出错的位置。
通过以上步骤,可以逐步排查并解决HMACSHA1算法加密后云侧无法解密的问题。