将HMAC函数从Java转换为JavaScript

时间:2015-12-09 03:24:52

标签: java node.js cryptography hmac

我想在NodeJS中使用这个Java函数作为参考来实现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

当通过节点中的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密钥和计数器。

1 个答案:

答案 0 :(得分:4)

您忘记从Base 64表示中解码decryptedMacKey

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

给出:

'Qze5cHfTOjNqwmSSEOd9nEISOobheV833AncGJLin9Y='