0

我正在使用 DocusSign 连接 webhook 服务并希望使用 HMAC 安全性来验证请求。为此,我遵循了 https://developers.docusign.com/esign-rest-api/guides/connect-hmac中提到的说明 ,即:

  1. 在我们的 DocuSign 帐户中,我设置了 Connect 包含 HMAC 签名并创建了一个 Connect Authentication Key。
  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 收到的不同?

4

1 回答 1

0

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

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

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

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

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

于 2021-05-20T11:35:43.257 回答