Java Digest Hash和PHP Hash是不同的

时间:2017-09-07 10:06:18

标签: java php hash base64 sha512

我试图在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')) ;

1 个答案:

答案 0 :(得分:1)

在这种情况下,

base64_encodehash实际上是在做同样的事情:

https://stackoverflow.com/a/11195855/3323777

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

  

raw_output - 设置为TRUE将作为原始输出数据返回,否则返回值为binhex编码。

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

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