现在是一天,我对此深感困惑。我环顾了四周,但无法解决问题。
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
重新创建哈希的代码
$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 ^”
可以看出,即使在两端使用了相同的字符串,哈希也会部分匹配。
[谁能帮我解决这个问题?我将不胜感激。
编辑:
一个问题是“ 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代码。