Auto.js中实现HMAC-SHA256加密算法,支持腾讯云v3签名

日期: 标签:Auto.jsjavascript

最近在Auto.js中做腾讯云的文字识别OCR,其中有个难点是腾讯云的v3签名(有时也称作 TC3-HMAC-SHA256),其中需要用到几个加密算法,在其他服务端语言中都有现成的函数可以使用,但是在JavaScript和Auto.js中都找不到对应的函数,幸好Auto.js支持Java,参考Java代码稍微转换一下就可以用了。

前面已经介绍过 字符串生成SHA256哈希值的方法

今天介绍的是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);

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/auto-js-hmac-sha256.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。