2017-09-07 83 views
0

我試圖在PHP 7.0.22(Apache/2.4.6(紅帽企業Linux))服務器上驗證webhook from starling bankJava Digest哈希和PHP哈希是不同的

我已經被告知通過支持,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和requestJson我從網絡掛接POST採取:

$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

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您既片段和編碼字符串「測試」時,發現沒有差別。我建議您在兩種環境下將json有效負載輸出到兩個文件,並使用diff來比較它們。