[英]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_encode
和hash
有效地執行了相同的操作:
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.