簡體   English   中英

Java Digest Hash和PHP Hash不同

[英]Java Digest Hash and PHP Hash are different

我正在嘗試 PHP 7.0.22(Apache / 2.4.6(Red Hat Enterprise Linux))服務器上的八哥銀行驗證Webhook。

支持人員告訴我,以下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有效地執行了相同的操作:

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

您應該在您的php代碼中將第三個參數指定為TRUE ,以匹配Java版本:

raw_output-設置為TRUE將作為原始輸出數據返回,否則返回值是二進制混合編碼。

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

我已經在java和php上運行了您的兩個代碼片段,並且在編碼字符串“ test”時發現沒有區別。 我建議您在兩種環境下將json負載輸出到兩個文件,並使用diff進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM