gpt4 book ai didi

java - 验证php中的JAVA签名

转载 作者:行者123 更新时间:2023-12-01 22:10:54 25 4
gpt4 key购买 nike

我已经被困在这个问题上一天了。我环顾四周但无法解决问题。

JAVA代码:

public String generateDigitalSignedToken(String requestData) throws Exception 
{
Signature signature = Signature.getInstance("SHA1withRSA");
PrivateKey privateKey = this.readPrivateKeyFromFile(busPrivateFile);
signature.initSign(privateKey, new SecureRandom());
byte[] message = requestData.getBytes();
signature.update(message);
byte[] sigBytes = signature.sign();
return Base64.getEncoder().encodeToString(sigBytes);
}

PHP 代码:

$rsa = new RSA();
$rsa->loadKey($publicKey);
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$rsa->setHash("sha1");
$rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1);
$receivedHash = $rsa->decrypt($decodedHash);

待办事项

  1. 解密 token 以获取收到的哈希值。
  2. 第二个任务是重新创建哈希并将其与接收到的哈希进行比较。

重新创建哈希的代码

$temp = new RSA();
$temp->setHash('sha1');
$temp->setSignatureMode(RSA::SIGNATURE_PKCS1);
$generatedHash1 = $temp->hash->_sha1($decryptedBody);

//Or simply

$generatedHash2 = sha1($data, true);

Following are the values :

"receivedHash" => b"0!0\t\x06\x05+\x0E\x03\x02\x1A\x05\x00\x04\x14öRM▀ÿuï®▀Q÷Å\x06M¬Õ\x16{M^"

"generatedHash1" / "generatedHash2" => b"öRM▀ÿuï®▀Q÷Å\x06M¬Õ\x16{M^"

可以看出,即使两端使用相同的字符串,哈希也会部分匹配。

谁能帮我解决这个问题吗?我将不胜感激任何帮助。

编辑:

使用的 PHP 库:https://github.com/phpseclib/phpseclib

最佳答案

一个问题是“receivedHash”不仅仅是一个哈希值。它是封装在 ASN.1 结构中的哈希值。如果你对其执行 openssl asn1parse ,你将得到以下结果:

    0:d=0  hl=2 l=  33 cons: SEQUENCE
2:d=1 hl=2 l= 9 cons: SEQUENCE
4:d=2 hl=2 l= 5 prim: OBJECT :sha1
11:d=2 hl=2 l= 0 prim: NULL
13:d=1 hl=2 l= 20 prim: OCTET STRING

您可以通过执行以下操作获取实际的 sha1 哈希值(在 PHP 中):

substr(base64_decode('MCEwCQYFKw4DAhoFAAQUlFJN35h1i6nfUfaPBk2q5RZ7TV4='), 13 + 2, 20)

还有其他可以说更好的方法来实际解析 ASN.1 并“映射”它,但这些方法更加冗长,无论如何都超出了这个“答案”的范围。

另一个问题是 receivedHash 不是实际的签名,也不是有效的密文。您的 RSA key 是 2048 位。那是 256 字节。签名/密文也应该是这个长度。当然,我想如果您修剪前导或尾随 NULL 空格,它可能会更小,但即使如此,签名/密文也不应该像您的那样具有“结构”。也许在模幂之前会,但之后不会。所以我认为很多问题可能出在你的 Java 代码中。也许当我回到家时,我可以在本地运行您的 Java 代码,看看是否获得与您的 receivedHash 类似的输出。如果是这样,我可以发表自己的 stackoverflow 帖子来询问这是怎么回事。但目前我会查看您的 Java 代码。

关于java - 验证php中的JAVA签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58661236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com