使用base64编码的秘密在Nodejs中创建HMAC

时间:2016-03-09 03:44:50

标签: java node.js sha256 hmac

我试图生成消息的HMAC。 HMAC一代的算法是SHA256。问题是我有一个base64编码密钥(共享密钥)。我如何解码这个秘密来获得所需的hmac

示例代码:

var hmac = require('crypto').createHmac('SHA256', "SOME_BASE64_ENCODED_SHARED_SECRET").update("MESSAGE").digest('base64');

此hmac被发送到java服务。它产生hmac的方式如下:

Mac mac = Mac.getInstance("HmacSha256");
SecretKey sharedKey = new SecretKeySpec(Base64.getDecoder().decode("SOME_BASE64_ENCODED_SHARED_SECRET"), "TlsPremasterSecret");
mac.init(sharedKey);
byte[] messageBytes = "MESSAGE".getBytes("UTF-8");
byte[] expectedHmac = mac.doFinal(messageBytes);
String hmac = Base64.getEncoder().encodeToString(expectedHmac));

现在,我的nodejs代码生成的HMAC与Java服务代码不匹配。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

base64编码的秘密在传递给crypto.createHmac()之前需要解码:

var secret = new Buffer('SOME_BASE64_ENCODED_SHARED_SECRET', 'base64');
var hmac = require('crypto').createHmac('SHA256', secret)
                            .update('MESSAGE')
                            .digest('base64');

答案 1 :(得分:0)

//include crypto
var crypto = require('crypto');

var yourMessage = 'your signature to be hashed using HMAC SHA256';
var sharedSecret = 'your shared secret key';
//generate hmac sha256 hash
var hmacSignature = crypto.createHmac('SHA256', new Buffer(sharedSecret, 'base64')).update(yourMessage).digest('base64');

上面也为我工作。

注意:HMAC SHA256是哈希值,无法解码。根据唯一的秘密和唯一的消息(通常使用日期时间),创建唯一的哈希。客户端发送该哈希值,服务器使用相同的算法生成自己的哈希值,如果两个哈希值均匹配,则授权成功。

我花了很多时间对此进行故障排除。希望以上信息对其他人有帮助。

相关问题