【问题标题】:Java Digest Hash and PHP Hash are differentJava Digest Hash 和 PHP Hash 是不同的
【发布时间】:2017-09-07 10:06:18
【问题描述】:

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

【问题讨论】:

    标签: java php hash base64 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 上运行了你的两个 sn-ps,发现在对字符串“test”进行编码时没有区别。我建议您将 json 有效负载输出到两个环境中的两个文件,并使用diff 进行比较。

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 2011-03-13
      • 2012-12-10
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      相关资源
      最近更新 更多