我试图在PHP 7.0.22(Apache / 2.4.6(Red Hat Enterprise Linux))服务器上验证webhook from starling bank。
支持人员告诉我,以下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')) ;
答案 0 :(得分:1)
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上运行了你的两个片段,并且在编码字符串" test"时发现没有区别。我建议您将json有效负载输出到两个环境中的两个文件,并使用diff
进行比较。