HarmonyOS MD5加密结果不正确,缺少一位?

MD5加密结果不正确,应为32位实际31位。

加密的字符串如下:

ac=login&carrier=&channel=huawei_harmony&imgcode=&location_citycode=&mobile=13691467881&net=&os=ALN-AL80&os_type=Harmony&os_ver=xxxx&protocol=1&push_id=&push_switch=&rtime=&sid=&src=lx_harmony&timestamp=1724380940&token=xxxx&u_salt=378b78f2&u_time=1724380940&vcode=&ver=100000&

HarmonyOS加密结果:

fc4bb9d80eb745c58f223a56aa9b2dd

Java加密结果:

fc04bb9d80eb745c58f223a56aa9b2dd

工具加密结果:

fc04bb9d80eb745c58f223a56aa9b2dd

加密部分代码如下:

export async function doMd(message: string): Promise<string> {
  let md = cryptoFramework.createMd('MD5');
  let md5: string = '';
  await md.update({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) })

  let data = await md.digest();
  md5 = Array.from(data.data).map(byte =>
  byte.toString(16)).join('')
  return md5;
}

方法调用:

let J_sign = await doMd(mapString);
阅读 441
1 个回答

参考示例如下:

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, util } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';

let base64 = new util.Base64Helper();

export function DoMdByPromise() {
  // 摘要算法名称。
  let mdAlgName = "MD5";
  // 要进行摘要的数据。
  let message =
    "xxx";
  let md = cryptoFramework.createMd(mdAlgName);
  let promiseMdUpdate = md.update({ data: stringToUint8Array(message) });
  promiseMdUpdate.then(() => {
    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);
    let mdLen = md.getMdLength();
    console.log(str2)
    console.log("" + mdLen)
  }).catch((error: BusinessError) => {
    console.error("[Promise]: error: " + error.message);
  });
}

//摘要结果是Uint8Array类型,转换得到十六进制字符串数据
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)
}

@Entry
@Component
struct MD5Crypto {
  @State message: string = '点击开始';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            DoMdByPromise()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进