HarmonyOS 如何实现HMacMd5加密?

如下Java的HMAC加密算法如何转换为HarmonyOS。

public class HmacUtil {
    public static String signTopRequest(Map<String, String> params, String secret) throws IOException {
    // 第一步:检查参数是否已经排序
    String[] keys = params.keySet().toArray(new String[0]);
    Arrays.sort(keys);
    // 第二步:把所有参数名和参数值串在一起
    StringBuilder query = new StringBuilder();
      for (String key : keys) {
      Object value = params.get(key);
      query.append(key).append(value);
    }
    System.out.println(query.toString());
    // 第三步:使用HMAC加密
    byte[] bytes;
    bytes = encryptHMAC(query.toString(), secret);
    // 第四步:把二进制转化为大写的十六进制(正确签名应该为32大写字符串,此方法需要时使用)
    return byte2hex(bytes);
  }

  public static byte[] encryptHMAC(String data, String secret) throws IOException {
    byte[] bytes = null;
    try {
      SecretKey secretKey = new SecretKeySpec(secret.getBytes("utf-8"), "HmacMD5");
      Mac mac = Mac.getInstance(secretKey.getAlgorithm());
      mac.init(secretKey);
      bytes = mac.doFinal(data.getBytes("utf-8"));
    } catch (GeneralSecurityException gse) {
      throw new IOException(gse.toString());
    }
    return bytes;
  }

  public static String byte2hex(byte[] bytes) {
    StringBuilder sign = new StringBuilder();
    for (int i = 0; i < bytes.length; i++) {
      String hex = Integer.toHexString(bytes[i] & 0xFF);
      if (hex.length() == 1) {
        sign.append("0");
      }
      sign.append(hex.toUpperCase());
    }
    return sign.toString();
  }
}
阅读 603
1 个回答

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-compute-mac-V5\#开发步骤

示例参考如下:

async function calculateHmacSHATest(key: string) {
  try {
    let macAlgName = "MD5";
    let keyBytes = new Uint8Array(buffer.from(key, 'utf-8').buffer;
    let message = "aabbccddee112233ffgghh";
    let dataBytes = new Uint8Array(buffer.from(message, 'utf-8').buffer;
    let symKey = await cryptoFramework.createSymKeyGenerator("HMAC").convertKey({ data: keyBytes });
    let mac = cryptoFramework.createMac(macAlgName);
    await mac.init(symKey);
    await mac.update({ data: dataBytes });
    let macOutput = await mac.doFinal();
    let str = uint8ArrayToHexStr(macOutput.data)
    console.info("[ETS HMAC]: result string : " + str);
  } catch (err) {
    console.error(err)
  }
}

function uint8ArrayToHexStr(data: Uint8Array): string {
  return buffer.from(data).toString('hex');
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进