【问题标题】:Convert HMAC function from Java to JavaScript将 HMAC 函数从 Java 转换为 JavaScript
【发布时间】:2018-02-08 04:23:41
【问题描述】:

我打算使用这个 Java 函数作为参考在 NodeJS 中实现一个 HMAC 函数:

private static String printMacAsBase64(byte[] macKey, String counter) throws Exception {
    // import AES 128 MAC_KEY
    SecretKeySpec signingKey = new SecretKeySpec(macKey, "AES");

    // create new HMAC object with SHA-256 as the hashing algorithm
    Mac mac = Mac.getInstance("HmacSHA256");
    mac.init(signingKey);

    // integer -> string -> bytes -> encrypted bytes
    byte[] counterMac = mac.doFinal(counter.getBytes("UTF-8"));

    // base 64 encoded string
    return DatatypeConverter.printBase64Binary(counterMac);
}

由此我得到 Qze5cHfTOjNqwmSSEOd9nEISOobheV833AncGJLin9Y=的 HMAC=

通过 node.js 中的 HMAC 算法传递相同的计数器和密钥时,我得到了不同的 HMAC 值。这是我生成 hmac 的代码。

var decryptedMacKey = 'VJ/V173QE+4CrVvMQ2JqFg==';
var counter = 1;

var hash = crypto
    .createHmac('SHA256',decryptedMacKey)
    .update(new Buffer(counter.toString(),'utf8'),'utf8')
    .digest('base64');

当我运行它时,我得到一个 MAC 为 nW5MKXhnGmgpYwV0qmQtkNBDrCbqQWQSkk02fiQBsGU=

我无法在 javascript 中找到任何与 SecretKeySpec 类等效的东西,因此这可能是缺少的链接。

我还能够使用它生成与我的程序相同的值 https://quickhash.com/ 通过选择算法 Sha-256 并输入解密的 mac 密钥和计数器。

【问题讨论】:

    标签: java node.js cryptography hmac


    【解决方案1】:

    您忘记从 Base 64 表示解码 decryptedMacKey

    var hash = crypto.createHmac('SHA256', new Buffer(decryptedMacKey, 'base64'))
        .update(new Buffer(counter.toString(),'utf8'),'utf8')
        .digest('base64');
    

    给予:

    'Qze5cHfTOjNqwmSSEOd9nEISOobheV833AncGJLin9Y='

    【讨论】:

    • 我知道我必须忽略一些东西。我会试一试。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多