首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HmacSHA256不返回相同的值

HmacSHA256不返回相同的值
EN

Stack Overflow用户
提问于 2020-11-19 23:30:57
回答 1查看 151关注 0票数 0

我有一个回调URL,它在头和请求体中接收一个HMAC256。

但是,当我试图用HMAC256头验证请求体时。这两种价值观是不同的。

代码语言:javascript
复制
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);
}

我在信息日志中得到不同的值,而我应该得到相同的值:

代码语言:javascript
复制
HMAC request calculated w5ynJTVV1H8GNgzje91BKEIYn8n9GtRU7iNcnEr/AwE=
HMAC received P5z/Ipu71qQ4ROqExL87xfhkCz5e1WpP4ypFxtikyaE=

代码的哪一部分不正确?

编辑

若要检查发送方如何计算Hmac,请检查以下内容:

https://docs.cronofy.com/developers/push-notifications/authentication/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-14 16:14:32

我贴了这个问题。这个问题通过代码的小改动得到了解决。我首先将其更改为字符串,然后从字符串中读取字节,而不是直接将值写入字节。

改变了这一点:

代码语言:javascript
复制
    byte[] data = new ObjectMapper().writeValueAsBytes(notification);
    byte[] rawHmac = mac.doFinal(data);

对此:

代码语言:javascript
复制
    String data = new ObjectMapper().writeValueAsString(pushNotification);
    byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));

感谢Maarten Bodewes指出了正确的方向。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64921592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档