2
javaで署名を検証する必要があります。私は複数のパラメータを持つURLを取得し、そのうちの1つは署名(16進形式)です。署名されたメッセージは、他のすべてのパラメータの連結のSHA-256ハッシュです。私はまた、チェックに使用される公開鍵を持つ証明書を持っています。 私がテストに使用しているすべての値は正しいと思われる例で私に与えられます、私はちょうど連結文字列を作成します。署名の長さが正しくない
これは私が実行コードです:
// signed message --> hash of concat
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(concat.getBytes());
byte[] message = digest.digest();
System.out.println("message length "+message.length); // --> 32
// signature belonging to the message --> checkValue
System.out.println("check value length " +checkValue.length()); // --> 512
byte[] sigBytes = checkValue.getBytes();
System.out.println("check value bytes "+sigBytes.length); // --> 512
// public certificate of the CA
File file3 = new File(certificatePath);
byte[] encCertRSA = new byte[(int) file3.length()];
FileInputStream fis3 = new FileInputStream(file3);
fis3.read(encCertRSA);
fis3.close();
InputStream is = new ByteArrayInputStream(encCertRSA);
CertificateFactory f = CertificateFactory.getInstance("X.509");
X509Certificate certRSA = (X509Certificate)f.generateCertificate(is);
certRSA.checkValidity();
PublicKey pubKeyRSA = certRSA.getPublicKey();
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initVerify(pubKeyRSA);
// supply the Signature object with the data for which a signature was generated --> hash of concat
sig.update(message);
boolean isValid = sig.verify(sigBytes);
System.out.println("The signature of the email verifies: " + isValid);
これは私が取得エラーです:
java.security.SignatureException: Signature length not correct: got 512 but was expecting 256
at sun.security.rsa.RSASignature.engineVerify(Unknown Source)
at java.security.Signature$Delegate.engineVerify(Unknown Source)
at java.security.Signature.verify(Unknown Source)
私が間違って何をやっていますか?署名の長さが512ではなく256になることを期待していました。署名値の部分文字列を256の長さに一致させるテストを実行し、上記のエラーは発生しませんが、sig.verifyはfalseを返します。
をチェックする前に、あなたのsigBytes変数はすでに長さ512を持っているように、それははい、私はから得る値ならば理解したいのですが見えます例が間違っているか、何かが見つからない場合.. – user4219558
'sigBytes'と' checkValue'変数のために何も変更しないので、あなたの値が間違っているか間違っているように見えます。おそらく、checkValue変数の値を送るクラスの値をチェックすることができます。 –