Java Digest哈希和PHP哈希是不同的

Java Digest哈希和PHP哈希是不同的

问题描述:

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

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来比较它们。