如何将 Node JS HMAC 签名创建更改为 Java
How to change the Node JS HMAC signature creation to Java
我很少使用 Java,我需要转换 Node.js 中的函数,该函数为 REST POST 调用构建 HMAC 签名 Java
节点 JS 函数:
function buildSignature(buf, secret) {
const hmac = crypto.createHmac('sha256', Buffer.from(secret, 'utf8'));
hmac.update(buf);
return hmac.digest('hex');
}
我目前所做的是:
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
结果不一样。
我怀疑 hmac.digest('hex');
不是 base 64 编码的。我会尝试将 sha256_HMAC.doFinal(message.getBytes())
的响应转换为十六进制。
How to convert a byte array to a hex string in Java? 的
我更喜欢那里的答案(因为我在很多项目中使用 Guava)是
final String hex = BaseEncoding.base16().lowerCase().encode(bytes);
适应你的问题是
final String hash = BaseEncoding.base16().lowerCase().encode(sha256_HMAC.doFinal(message.getBytes()));
Mac sha256_HMAC;
sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] hash = sha256_HMAC.doFinal(payload.getBytes());
return new String(Hex.encodeHex(hash));
我很少使用 Java,我需要转换 Node.js 中的函数,该函数为 REST POST 调用构建 HMAC 签名 Java
节点 JS 函数:
function buildSignature(buf, secret) {
const hmac = crypto.createHmac('sha256', Buffer.from(secret, 'utf8'));
hmac.update(buf);
return hmac.digest('hex');
}
我目前所做的是:
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
System.out.println(hash);
结果不一样。
我怀疑 hmac.digest('hex');
不是 base 64 编码的。我会尝试将 sha256_HMAC.doFinal(message.getBytes())
的响应转换为十六进制。
How to convert a byte array to a hex string in Java? 的
我更喜欢那里的答案(因为我在很多项目中使用 Guava)是
final String hex = BaseEncoding.base16().lowerCase().encode(bytes);
适应你的问题是
final String hash = BaseEncoding.base16().lowerCase().encode(sha256_HMAC.doFinal(message.getBytes()));
Mac sha256_HMAC;
sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] hash = sha256_HMAC.doFinal(payload.getBytes());
return new String(Hex.encodeHex(hash));