【发布时间】: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 将以完全不同的方式组合密钥和数据。