hmacsha256在java中不返回相同的值

ukqbszuj  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(450)

我有一个回调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/

vawmfj5a

vawmfj5a1#

我把问题贴出来了。这个问题在代码上稍作改动就解决了。我没有直接将值写为字节,而是先将其改为字符串,然后从中读取字节。
更改为:

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));

感谢马丁·博德维斯指出了正确的方向。

相关问题