javascript - 使用 URI 和 key 生成 HMAC SHA 算法

标签 javascript node.js hmac sha

我编写了一个生成 HMAC SHA 哈希码的 Java 程序,但由于某些原因,我必须在 NodeJs/JavaScript 中编写相同的代码。我试着用谷歌搜索但没有得到任何东西。在此 Java 代码中,我将 URI 和 Key 作为参数传递,以生成哈希码,其中 URI 包含时间戳。 Java 代码如下:

    public static String calcMAC(String data, byte[] key) throws Exception {
    String result=null;
    SecretKeySpec signKey = new SecretKeySpec(key, SecurityConstants.HMAC_SHA1_ALGORITHM);
    Mac mac = Mac.getInstance(SecurityConstants.HMAC_SHA1_ALGORITHM);
    mac.init(signKey);
    byte[] rawHmac;
    try {
        rawHmac = mac.doFinal(data.getBytes("US-ASCII"));
        result = Base64.encodeBase64String(rawHmac);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result.trim();
}

public static void main(String args[]) {
    String timestamp = args[0];
    String key = "d134hjeefcgkahvg32ajkdbaff84ff180";
    String out = null;
    try {
        out = calcMAC("/req?app_id=47ca34" + timestamp + "=2018-05-22T12:02:15Z", 
                key.getBytes());
        System.out.println(URLEncoder.encode(out, "UTF-8"));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

是否有可能在 NodeJs/JavaScript 中实现相同的目标?

注意:我必须从 Postman 预请求脚本中调用此脚本。

最佳答案

加密模块应该为你做这件事,你可以用你想要散列的任何东西替换'data'变量:

const crypto = require('crypto');

const data = 'The fault dear Brutus lies not in our stars';
const key = Buffer.from('d134hjeefcgkahvg32ajkdbaff84ff180', 'utf8');

const hash = crypto.createHmac('sha1', key).update(data).digest('base64');
const uriEncodedHash = encodeURIComponent(hash);
console.log('Hash: ' + uriEncodedHash);

在 Java 和 Node.js 中对数据进行哈希处理得到的结果(URI 编码)为:

TJJ3xj93m8bfVpGoucluMQqkB0o%3D

相同的 Java 代码将是:

public static void main(String args[]) {
    String data = "The fault dear Brutus lies not in our stars";
    String key = "d134hjeefcgkahvg32ajkdbaff84ff180";
    String out = null;
    try {
        out = calcMAC(data, key.getBytes());
        System.out.println(URLEncoder.encode(out, "UTF-8"));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

同样,我们可以将任何内容放入我们想要的“数据”中。

关于javascript - 使用 URI 和 key 生成 HMAC SHA 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50985829/

相关文章:

linux - AIX Openssl dgst hmac 结果不同

Chrome 扩展中的 javascript 正则表达式

javascript - appendTo 没有将我的元素放在我想要的位置

javascript - 如何使用 jQuery 按数据属性过滤选项?

javascript - 如何增加 html 页面中组合框的大小

node.js - PassportJs 的 Passport.session() 与文件 uploader 冲突 - 不会写入文件

node.js - Nodejs、express、移动 Passport

javascript - 如何从多个模式中收集数据? - 境界

python - Unicode Objects must be encoded before hashing 错误

c++ - MSDN HMAC-SHA1 示例不工作