使用REST API的HMAC安全性验证webhook请求



我正在使用DocusSign连接webhook服务,并希望使用HMAC安全性来验证请求。为此,我已按照https://developers.docusign.com/esign-rest-api/guides/connect-hmac即:

  1. 在我们的DocuSign帐户上,我为Connect设置了Include HMAC签名,并创建了一个Connect身份验证密钥
  2. 接收到来自Docusign Connect的Connect消息,该消息包含带有用应用程序定义的HMAC密钥散列的数据的标头
  3. 但在第三步面临问题,即使用以下代码验证HMAC签名-
// x-docusign-signature headers
String headerSign = request.getHeader("X-DocuSign-Signature-1");
String secret = "....";
-------
public static boolean HashIsValid(String secret, String payload,
String headerSign)
throws InvalidKeyException, NoSuchAlgorithmException,
UnsupportedEncodingException {
String computedHash = ComputeHash(secret, payload);
boolean isEqual = 
MessageDigest.isEqual(computedHash.getBytes("UTF-8"), 
headerSign.getBytes("UTF-8"));
return isEqual;
}
------

public static String ComputeHash(String secret, String payload)
throws InvalidKeyException, NoSuchAlgorithmException {
String digest = "HmacSHA256";
Mac mac = Mac.getInstance(digest);
mac.init(new SecretKeySpec(secret.getBytes(), digest));
String base64Hash = new String(
Base64.getEncoder().encode(mac.doFinal(payload.getBytes())));
return base64Hash;
}

但它总是返回false。

有人知道为什么我的哈希码与从DocuSign收到的哈希码不同吗?

要么您的比较测试错误,要么您的有效负载变量包含太多或太少。

要测试您的比较,请打印出computedHashheaderSign

要测试payload值,请将其打印出来,并检查它是否是对侦听器(服务器(的POST请求的整个主体。

还要检查您是否只有一个X-DocuSign-Signature标头。一种方法是确认标头X-DocuSign-Signature-2没有值

我已经提交了内部错误报告DEVDOCS-4874,因为Java示例有一个错误。

最新更新