最近在Auto.js中做腾讯云的文字识别OCR,其中有个难点是腾讯云的v3签名(有时也称作 TC3-HMAC-SHA256),其中需要用到几个加密算法,在其他服务端语言中都有现成的函数可以使用,但是在JavaScript和Auto.js中都找不到对应的函数,幸好Auto.js支持Java,参考Java代码稍微转换一下就可以用了。
今天介绍的是HMAC-SHA256加密算法。相当于PHP的 hash_hmac("SHA256", data, key);
/*
测试环境:
AutoX.js 5.5.3
安卓7.1模拟器
*/
importClass(java.nio.charset.StandardCharsets);
importClass(java.security.MessageDigest);
importClass(javax.crypto.Mac);
importClass(javax.crypto.spec.SecretKeySpec);
// 设置字符编码
const UTF8 = StandardCharsets.UTF_8;
function byteArrayToHexString(bytes) {
var val = "";
for (var i = 0; i < bytes.length; i ) {
var tmp = bytes[i];
if (tmp < 0) {
tmp = 256 tmp;
}
tmp = tmp.toString(16);
if ((tmp "").length == 1) {
tmp = "0" tmp;
}
val = tmp;
}
return val;
}
/*
参数 说明:
key
二进制数据。使用 HMAC 生成信息摘要时所使用的密钥。
data
字符串。要进行哈希运算的数据。
raw_output
布尔值。默认 false
设置为 true 输出二进制数据,设置为 false 输出 16 进制字符串
*/
function hmac256(key, data, raw_output) {
if (!raw_output) { raw_output = false; }
data = java.lang.String(data);
var mac = Mac.getInstance("HmacSHA256");
var secret_key = new SecretKeySpec(key, "HmacSHA256");
mac.init(secret_key);
var bytes = mac.doFinal(data.getBytes(UTF8));
if (!raw_output)
return byteArrayToHexString(bytes);
else
return bytes;
}
// 调用示例
var key = '123', data = 'abc';
// 将key转换为二进制数据
keyBytes = java.lang.String(key).getBytes(UTF8);
var result = hmac256(keyBytes, data);
console.log(result);
-- 完 --