HarmonyOs —— SHA256 MAC(对比 Java 实现)

发布时间:2024年01月05日

1.导入密钥库

计算 SHA256 MAC 需要导入 HarmonyOs 提供的统一的密码算法库加解密相关接口。

ets 示例:

import cryptoFramework from '@ohos.security.cryptoFramework';

java 示例:

import javax.crypto.Mac;

2.生成消息认证码操作实例。

ets 示例:

 let mac = cryptoFramework.createMac("SHA256")

java 示例:

Mac sha256_HMAC = Mac.getInstance("HmacSHA256");

3.接受输入密钥,通过接口 init 初始化 Mac。

ets 示例:

let symKey = await cryptoFramework.createSymKeyGenerator("AES256")
      .convertKey({ data: new util.TextEncoder().encodeInto(secret) })

mac.init(symKey)

这里需要注意的是? creatSynKeyGenerator 的参数需要填 AESxxx ,xxx 需要与 secret 长度对应,例如示例中使用的是长度为 32 的字符串,每个字节占 8 bit 所以是 256 bit,因此?creatSynKeyGenerator 的参数为 AES256.

同时算法只支持 AES,如果设置其它算法比如 SHA256 或者 HMAC 或者 HMAC|SHA256 则会报错。

如图:

java 示例:

SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);

4.接受数据,通过接口 update 更新 Mac。

ets 示例:

mac.update({ data: new util.TextEncoder().encodeInto(text) })

java 示例:

sha256_HMAC.update(message.getBytes());

5.通过接口 doFinal,返回 Mac 计算结果。

ets 示例:

mac.doFinal()

java 示例:

sha256_HMAC.doFinal();

6.完整代码示例

ets 代码示例:

/**
* 需要注意的是 secret 长度决定 createSymKeyGenerator 参数是使用 AES128 还是 AES256
*/
static async mac(text: string, secret: string): Promise<Uint8Array> {
    let mac = cryptoFramework.createMac("SHA256")
    //createSymKeyGenerator 参数 “AES256”,本示例 secret 为 256 bit所以使用AES256 
    let symKey = await cryptoFramework.createSymKeyGenerator("AES256")
      .convertKey({ data: new util.TextEncoder().encodeInto(secret) })
    await mac.init(symKey)
    await mac.update({ data: new util.TextEncoder().encodeInto(text) })
    let result = await mac.doFinal()
    return result.data
}

java 代码示例:

private static byte[] sha256_HMAC(String message, String secret) {
      byte[] hash = null;
      try {
          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
          sha256_HMAC.init(secret_key);
          hash = sha256_HMAC.doFinal(message.getBytes());
      } catch (Exception e) {
          e.printStackTrace();
      }
      return hash;
}

文章来源:https://blog.csdn.net/sumsear/article/details/135400856
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。