在php中验证JAVA签名

问题描述 投票:0回答:1

现在是一天,我对此深感困惑。我环顾了四周,但无法解决问题。

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);

TODOS

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

重新创建哈希的代码

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

//Or simply

$generatedHash2 = sha1($data, true);

以下是值:

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

“ generateHash1” /“ generateHash2” => b“ öRM▀ÿuï®▀Q÷Å\x06M¬Õ\ x16 {M ^

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

[谁能帮我解决这个问题?我将不胜感激。

编辑:

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

java php rsa sha1 phpseclib
1个回答
0
投票

一个问题是“ receivedHash”不是just哈希。这是包装在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密钥为2048位。那是256个字节。签名/密文都应为该长度。当然,我想如果您修剪前导或尾随的NULL空间,它可能会更小,但是即使那样,签名/密文也不应该像您一样具有“结构”。也许在模幂运算之前,但不是之后。因此,我认为很多问题可能出在您的Java代码中。也许当我回到家时,我可以在本地运行Java代码,看看是否得到与您的receivedHash类似的输出。如果是这样,我可以发表自己的stackoverflow帖子,询问发生了什么。但是暂时,我将看一下您的Java代码。

© www.soinside.com 2019 - 2024. All rights reserved.