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
可以参考楼上的回复,您这边可能是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('')
看这里: 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结果兼容。