我正在使用DocusSign连接webhook服务,并希望使用HMAC安全性来验证请求。为此,我已按照https://developers.docusign.com/esign-rest-api/guides/connect-hmac即:
- 在我们的DocuSign帐户上,我为Connect设置了Include HMAC签名,并创建了一个Connect身份验证密钥
- 接收到来自Docusign Connect的Connect消息,该消息包含带有用应用程序定义的HMAC密钥散列的数据的标头
- 但在第三步面临问题,即使用以下代码验证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收到的哈希码不同吗?
要么您的比较测试错误,要么您的有效负载变量包含太多或太少。
要测试您的比较,请打印出computedHash
和headerSign
。
要测试payload
值,请将其打印出来,并检查它是否是对侦听器(服务器(的POST请求的整个主体。
还要检查您是否只有一个X-DocuSign-Signature
标头。一种方法是确认标头X-DocuSign-Signature-2
没有值
我已经提交了内部错误报告DEVDOCS-4874,因为Java示例有一个错误。