Java 使用base64编码密钥在Nodejs中创建HMAC

Java 使用base64编码密钥在Nodejs中创建HMAC,java,node.js,sha256,hmac,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 = Ma

我正在尝试生成消息的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服务代码不匹配。如何解决此问题?

需要先对
base64
编码的机密进行解码,然后再将其传递给
crypto.createHmac()

以上对我也有用

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


我花了很多时间来解决这个问题。希望以上信息对其他人有所帮助。

在将base64编码的秘密传递给
createHmac()
(例如
crypto.createHmac('SHA256',new Buffer('base64-encoded-secret','base64'))之前,您是否尝试过解码base64编码的秘密。更新(…
)?耶!成功了!非常感谢。:)这似乎也取决于消息
var secret = Buffer.from('SOME_BASE64_ENCODED_SHARED_SECRET', 'base64');
var hmac = require('crypto').createHmac('SHA256', secret)
                            .update('MESSAGE')
                            .digest('base64');
//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');