HarmonyOS 鸿蒙Next中MD5加密乱码问题

HarmonyOS 鸿蒙Next中MD5加密乱码问题 需要对请求报问参数做MD5处理,目前使用了import util from '@ohos.util'库,加密结果转字符串是乱码

但在如下方法中,却是乱码,麻烦帮看下是什么问题,谢谢

static doMd5(msg: string): Promise<string> {
let mdAlgName = 'pageNum:1,pageSize:10,timestamp:xx}xxx'; // 摘要算法名
let message = "{pageNum:1,pageSize:10,timestamp:xx}xx" //msg; // 待摘要的数据

let md = cryptoFramework.createMd(mdAlgName);

return new Promise<(resolve, reject) => {
// 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制
md.update({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }).then((r) => {
md.digest().then((res) => {
if (res) {
let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: false });
let str = textDecoder.decodeWithStream(res.data, { stream: false })
let lowerStr = str.toLowerCase()
resolve(lowerStr)
}
else {
reject(res)
}

});

});
}

更多关于HarmonyOS 鸿蒙Next中MD5加密乱码问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

let mdAlgName = ‘pageNum:1,pageSize:10,timestamp:1709534329}JX6m0WOrgiMja0Lmo5iSzDv68Vgrs5’; // 摘要算法名

mdAlgName 是需要指定为签名算法:例如SHA256,demo中这个字符串不属于任何算法,

详细请参考指导文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/crypto-encrypt-decrypt-dev-V13

需要把结果转成base64 或者 十六进制,直接转字符串是会乱码。

await md.update({ data: new Uint8Array(buffer.from(message, ‘utf-8’).buffer) });

let mdResult = await md.digest();

console.info(‘Md result:’ + mdResult.data);

let base64 = new util.Base64Helper;

//加密 let base64Str = base64.encodeToStringSync(mdResult.data)

//解密 let result = base64.decodeSync(base64Str, util.Type.MIME);

上述加解密方法可参考@ohos.util:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-util-V13

附上几种转换:

// 可理解的字符串转成字节流 function stringToUint8Array(str: string) { let arr = new Uint8Array(str.length);

for (let i = 0, j = str.length; i < j; ++i) { arr[i] = str.charCodeAt(i); }

return arr; }

// 字节流转成可理解的字符串 function uint8ArrayToString(array:Uint8Array) { // 将UTF-8编码转换成Unicode编码 let out: string = “”; let index: number = 0; let len: number = array.length; while (index < len) { let character = array[index++]; switch(character >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: out += String.fromCharCode(character); break; case 12: case 13: out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F)); break; case 14: out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0)); break; default: break; } } return out; }

//十六进制转Uint8Array function HexStrTouint8Array(data: string): Uint8Array { return new Uint8Array(buffer.from(data, ‘hex’).buffer);; }

//Uint8Array转十六进制 function uint8ArrayToHexStr(data: Uint8Array): string { let hexString = “”; let i; for (i = 0; i < data.length; i++) { let char = (‘00’ + data[i].toString(16)).slice(-2); hexString += char; } return hexString; }

那就不用base64,用16进制,转出来的string,我用你的msg验证了一下,转换完的string是:9a6ffe7c227fccb91a1517e3b886f449

//Uint8Array转十六进制 function uint8ArrayToHexStr(data: Uint8Array): string { let hexString = “”; let i; for (i = 0; i < data.length; i++) { let char = (‘00’ + data[i].toString(16)).slice(-2); hexString += char; } return hexString; }

更多关于HarmonyOS 鸿蒙Next中MD5加密乱码问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,MD5加密出现乱码问题可能是由于编码方式不一致导致的。MD5加密生成的是128位的哈希值,通常以16进制或Base64编码形式呈现。如果在加密后的处理过程中编码方式不匹配,可能会导致乱码。例如,加密后的数据在转换为字符串时未使用正确的编码格式,或者在数据传输过程中编码格式被改变。解决此类问题,需确保在整个过程中使用统一的编码方式,如UTF-8。

在HarmonyOS鸿蒙Next中,使用MD5加密时出现乱码问题,通常是由于编码方式不匹配导致的。MD5加密生成的是二进制数据,直接转换为字符串时可能会产生乱码。建议使用Base64或Hex编码将二进制数据转换为可读字符串。例如,使用Hex.toHexString()方法将MD5结果转换为十六进制字符串,或使用Base64.encodeToString()方法进行Base64编码。确保在转换过程中使用统一的字符编码(如UTF-8),以避免乱码问题。

回到顶部