Java Digest哈希和PHP哈希是不同的
问题描述:
我试图在PHP 7.0.22(Apache/2.4.6(红帽企业Linux))服务器上验证webhook from starling bank。Java 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_encode
和hash
有效地做同样的事情在这种情况下, :
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
来比较它们。