HarmonyOS鸿蒙Next中相同数据Md5加密以后与安卓结果不一致,有时候会少一位,有时候正常,这个要怎么处理呢

HarmonyOS鸿蒙Next中相同数据Md5加密以后与安卓结果不一致,有时候会少一位,有时候正常,这个要怎么处理呢

toMD5A(content: string) { //content为传入的待转换成md的参数
  let md = cryptoFramework.createMd('MD5');
  md.update({ data: new Uint8Array(buffer.from(content, 'utf-8').buffer) }, (error) => {
    md.digest((error, digestOutput) => {
      console.log(this.message, `MD5 result is : ${digestOutput.data}`);
      //转换为16进制字符串并输出
      const result = Array.from(digestOutput.data).map(byte => byte.toString(16)).join('')
      console.info("xxxx:", result)
      promptAction.showToast({ message: `MD5 result is : ${result}` })
    })
  })
}

更多关于HarmonyOS鸿蒙Next中相同数据Md5加密以后与安卓结果不一致,有时候会少一位,有时候正常,这个要怎么处理呢的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

可以参考楼上的回复,您这边可能是16进制转换的问题,可以使用一下方法试下。

【解决方案】

  • 将16进制编码格式字符串转换为Uint8Array类型,如下代码所示:
function hexStrToUint8Array(data: string): Uint8Array {
  return new Uint8Array(buffer.from(data, 'hex').buffer);
}
  • 将Uint8Array类型转换16进制编码格式字符串,如下代码所示:
function uint8ArrayToHexStr(input: Uint8Array): string {
  let bufferStr = buffer.from(input).toString('hex');
  return bufferStr;
}

具体参考文档数据编码格式差异

更多关于HarmonyOS鸿蒙Next中相同数据Md5加密以后与安卓结果不一致,有时候会少一位,有时候正常,这个要怎么处理呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Array.from(digestOutput.data).map(byte => byte.toString(16)).join('')

cke_1400.png

看这里: byte.toString(16), 当byte<16的时候,这个前面不会补0

鸿蒙Next与安卓MD5结果差异主要源于系统底层实现机制不同。鸿蒙采用自研算法库,与安卓的Bouncy Castle或OpenSSL实现存在差异,可能导致字节处理方式不同造成结果位数变化。建议检查数据编码格式是否统一,确认输入数据在加密前完全一致,包括字符集和字节顺序。可对比加密前后的字节数组,排查是否存在隐式转换或填充规则差异。

在HarmonyOS Next中,MD5加密结果与Android不一致或位数缺失,主要问题在于字节到十六进制字符串的转换处理。当字节值小于16时,Android等平台通常会自动补零,而你的代码中byte.toString(16)可能生成单字符(如"a"而非"0a"),导致结果长度异常。

建议修改转换逻辑:

const result = Array.from(digestOutput.data).map(byte => 
  byte.toString(16).padStart(2, '0')
).join('');

使用padStart(2, '0')确保每个字节转换为两位十六进制数,避免因缺零导致长度不一致。这能保证与Android的MD5结果兼容。

回到顶部