【关键字】
MD5加密 / 字符串
【问题描述】
鸿蒙自带的加密库MD5加密结果有问题,简单字符串加密没有什么问题,但是遇到一个字符串加密出来的结果和服务器端加密结果不一致导致接口无法通过验证。
后来使用第三方库https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fcrypto-js,加密结果才与服务器加密结果匹配。
具体测试字符串如下:
"kbaptkJGtByWrQaP\tjkJrRIacBwcpK68d\t1708500023960\t/user/register2\t\t{\"nonces\":\"f89caa35-10bd-45ef-80ec-ec37715aff31\",\"deviceType\":\"ios\",\"smsCode\":\"303701\",\"pwd\":\"Xa1vKgm51p8=\",\"nickname\":\"\",\"deviceId\":\"a0a0cadd-b6c6-43dd-9599-bde86cbb6db4\",\"phone\":\"18306215493\",\"cityId\":\"420100\",\"gender\":\"\",\"cityName\":\"武汉市\",\"birthday\":\"\",\"tdid\":\"cf5094ba-a0b8-4b4d-ae30-9128fa1eba5d\"}"
期望值如下:
"e9a7285f5dce4df160bf081e298ffb8e"
【解决方案】
可以参考以下样例代码进行开发,经测试doMdByPromise中str2结果是您的期望值:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { buffer, util } from '@kit.ArkTS';
let base64 = new util.Base64Helper();
function uint8ArrayToHexStr(data: Uint8Array): string {
let hexString = "";
let i: number;
for (i = 0; i < data.length; i++) {
let char = ('00' + data[i].toString(16)).slice(-2);
hexString += char;
}
return hexString;
}
// 字节流转成可理解的字符串
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;
}
function stringToUint8Array(str: string) {
return new Uint8Array(buffer.from(str, 'utf-8').buffer)
}
function doMdByPromise() {
// 摘要算法名称。
let mdAlgName = "MD5";
// 要进行摘要的数据。
let message = "kbaptkJGtByWrQaP\tjkJrRIacBwcpK68d\t1708500023960\t/user/register2\t\t{\"nonces\":\"f89caa35-10bd-45ef-80ec-ec37715aff31\",\"deviceType\":\"ios\",\"smsCode\":\"303701\",\"pwd\":\"Xa1vKgm51p8=\",\"nickname\":\"\",\"deviceId\":\"a0a0cadd-b6c6-43dd-9599-bde86cbb6db4\",\"phone\":\"18306215493\",\"cityId\":\"420100\",\"gender\":\"\",\"cityName\":\"武汉市\",\"birthday\":\"\",\"tdid\":\"cf5094ba-a0b8-4b4d-ae30-9128fa1eba5d\"}";
let md = cryptoFramework.createMd(mdAlgName);
;
console.info("[Promise]: Md algName is: " + md.algName);
// 如果数据量较小,可以使用 update() 一次传入所有数据。输入参数的长度没有限制。
let promiseMdUpdate = md.update({ data: stringToUint8Array(message) });
promiseMdUpdate.then(() => {
// 调用 digest() 以返回结果。
let PromiseMdDigest = md.digest();
return PromiseMdDigest;
}).then(digestOutput => {
let mdOutput = digestOutput.data;
let str2 = uint8ArrayToHexStr(mdOutput);
let str = base64.encodeToStringSync(mdOutput);
let str1 = uint8ArrayToString(mdOutput);
console.info("[Promise]: MD result: " + mdOutput);
let mdLen = md.getMdLength();
console.info("[Promise]: MD len: " + mdLen);
}).catch((error: BusinessError) => {
console.error("[Promise]: error: " + error.message);
});}