Java 摘要哈希和 PHP 哈希不同

Java Digest Hash and PHP Hash are different

我正在尝试在 PHP 7.0.22 (Apache/2.4.6 (Red Hat Enterprise Linux)) 服务器上验证 webhook from starling bank

支持人员告诉我以下 java 代码用于生成摘要

private String calculateSignature(String sharedSecret, String requestJson) {
  try {
    String contentToDigest = sharedSecret + requestJson;
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
    byte[] digest = messageDigest.digest(contentToDigest.getBytes());
    return Base64.getEncoder().encodeToString(digest);
  } catch (NoSuchAlgorithmException e) {
    throw new RuntimeException("Error calculating digest for payload [" +  requestJson + "]", e);
  }
}

我已经拥有的 sharedSecret 和我从 webhook POST 获取的 requestJson 使用:

$requestJson=file_get_contents('php://input') ;

我的php生成散列的代码如下:

$concatenated_string=$sharedSecret . json_encode($requestJson) ;
$generated_hash=base64_encode(hash('sha512', $concatenated_string ));

这不会给出相同的散列。在尝试寻找答案的同时,我还尝试了以下方法:

 $concatenated_string=$sharedSecret . $requestJson ;

以及不同的哈希类型和选项:

 $generated_hash=base64_encode(hash('sha512', $concatenated_string, true ))
 $generated_hash=base64_encode(openssl_digest($concatenated_string, 'sha512')) ;

base64_encodehash 在这种情况下实际上在做同样的事情:

您应该在 php 代码中将第三个参数指定为 TRUE 以匹配 java 版本:

raw_output - Setting to TRUE will return as raw output data, otherwise the return value is binhex encoded.

http://php.net/manual/ru/function.openssl-digest.php

我 运行 你在 java 和 php 上的两个片段,发现在编码字符串 "test" 时没有区别。我建议您将 json 有效载荷输出到两个环境中的两个文件,并使用 diff 来比较它们。