我试图生成消息的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服务代码不匹配。我该如何解决这个问题?
答案 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是哈希值,无法解码。根据唯一的秘密和唯一的消息(通常使用日期时间),创建唯一的哈希。客户端发送该哈希值,服务器使用相同的算法生成自己的哈希值,如果两个哈希值均匹配,则授权成功。
我花了很多时间对此进行故障排除。希望以上信息对其他人有帮助。