我有一个回调URL,它在头和请求体中接收一个HMAC256。
但是,当我试图用HMAC256头验证请求体时。这两种价值观是不同的。
public static final String SECRET = "secret_key";
public static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
@PostMapping("/callbackUrl")
public void receiveNotification(@RequestHeader("hmac-sha256") String hmac, @RequestBody Notification notification) {
SecretKeySpec sKey = new SecretKeySpec(SECRET.getBytes(StandardCharsets.UTF_8), HMAC_SHA256_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
mac.init(sKey);
byte[] data = new ObjectMapper().writeValueAsBytes(notification);
byte[] rawHmac = mac.doFinal(data);
String result = new String(Base64.encodeBase64(rawHmac));
log.info("HMAC request calculated {}", result);
log.info("HMAC received {}", hmac);
}我在信息日志中得到不同的值,而我应该得到相同的值:
HMAC request calculated w5ynJTVV1H8GNgzje91BKEIYn8n9GtRU7iNcnEr/AwE=
HMAC received P5z/Ipu71qQ4ROqExL87xfhkCz5e1WpP4ypFxtikyaE=代码的哪一部分不正确?
编辑
若要检查发送方如何计算Hmac,请检查以下内容:
https://docs.cronofy.com/developers/push-notifications/authentication/
发布于 2020-12-14 16:14:32
我贴了这个问题。这个问题通过代码的小改动得到了解决。我首先将其更改为字符串,然后从字符串中读取字节,而不是直接将值写入字节。
改变了这一点:
byte[] data = new ObjectMapper().writeValueAsBytes(notification);
byte[] rawHmac = mac.doFinal(data);对此:
String data = new ObjectMapper().writeValueAsString(pushNotification);
byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));感谢Maarten Bodewes指出了正确的方向。
https://stackoverflow.com/questions/64921592
复制相似问题