【问题标题】:Hash function in javajava中的哈希函数
【发布时间】:2021-06-20 11:36:30
【问题描述】:

我需要在客户端应用程序中配置付款。 为此,我需要使用私钥生成签名(sha256)。 在支付文档中,php 中有生成签名的功能:

function createSignature($orderData, $serviceKey, $hashMethod)
{
$data = prepareData($orderData);
return hash($hashMethod, $data . $serviceKey);
}

所以他们使用内置 php 函数哈希。 不幸的是,我们在 java 中有应用程序,我需要在 java 中创建相同的功能,我有 一些字符串作为输入数据和私钥。 我在 java 中找到了解决方案,例如:

 public static String encode(String key, String data) throws Exception {
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
    sha256_HMAC.init(secret_key);

    return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
}

但在 php 和 java 中,我收到不同的哈希值。如何在java中创建与php相同的函数?

【问题讨论】:

  • "如何在 java 中创建与 php 相同的函数?" - 你知道PHP中的hash函数在做什么吗?
  • php 函数是一个 ad-hoc MAC,而不是标准 MAC。因此,只需使用 Java MessageDigest 类复制 php 方法。
  • 老实说,我不知道 php 函数是如何工作的,我是 java 开发人员,但不幸的是文档是用 php 编写的 :(。James K. Polk 总统你能粘贴准备好的函数吗?我不知道是什么你的意思是
  • 你不需要复制整个hash函数,你只需要执行一个SHA256 hash。此外,在 PHP 中,. 是连接运算符。
  • 您的两个代码示例在处理密钥的方式上存在很大差异。在 PHP 中,您的密钥只是被附加到数据的末尾,然后对组合字符串进行哈希处理。在您的 Java 中,SHA256 HMAC 将以完全不同的方式组合密钥和数据。

标签: java php hash sha256


【解决方案1】:

解决方案是我需要在变量 String 数据的末尾附加 java 中的 serviceKey 并使用 Guava 库中的散列函数(https://www.baeldung.com/sha-256-hashing-java

  String key = "amount=" + amountX +"&currency=" + "PLN" + "&customerEmail=" + user.getEmail() + "&customerFirstName=" + user.getFirstname() +
    "&customerLastName=" + user.getLastname() + "&merchantId=" + merchantId + "&orderId=" + session + "&serviceId=" + serviceId + servicekey;

  
    String sha256hex = Hashing.sha256()
            .hashString(key, StandardCharsets.UTF_8)
            .toString();

现在可以了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2017-01-22
    • 2012-03-09
    • 2016-03-25
    • 2011-02-27
    相关资源
    最近更新 更多