Java 摘要哈希和 PHP 哈希不同
Java Digest Hash and PHP Hash are different
我正在尝试在 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')) ;
base64_encode
和 hash
在这种情况下实际上在做同样的事情:
您应该在 php 代码中将第三个参数指定为 TRUE
以匹配 java 版本:
raw_output - Setting to TRUE will return as raw output data, otherwise the return value is binhex encoded.
http://php.net/manual/ru/function.openssl-digest.php
我 运行 你在 java 和 php 上的两个片段,发现在编码字符串 "test" 时没有区别。我建议您将 json 有效载荷输出到两个环境中的两个文件,并使用 diff
来比较它们。
我正在尝试在 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')) ;
base64_encode
和 hash
在这种情况下实际上在做同样的事情:
您应该在 php 代码中将第三个参数指定为 TRUE
以匹配 java 版本:
raw_output - Setting to TRUE will return as raw output data, otherwise the return value is binhex encoded.
http://php.net/manual/ru/function.openssl-digest.php
我 运行 你在 java 和 php 上的两个片段,发现在编码字符串 "test" 时没有区别。我建议您将 json 有效载荷输出到两个环境中的两个文件,并使用 diff
来比较它们。