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;
}