1

私は2つの同様の質問を見つけ、解決策として与えられたコードを実行しようとしました。それらの答えは私にとってうまくいかないので、コードのスニペットで質問を提起します。

  1. signature.verify()は常にFalseを返します
  2. Signature.verify()は常にfalseを返します

両方の答えが機能していないので、この質問を重複として扱わないでください

これが私のコードです。

import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.io.FileInputStream;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import xmlread.ReadXMLFile;


public class CertificateTest {


    public static void main(String[] sdd)  {

        try{
        FileInputStream fin = new FileInputStream("pub.arm");
        CertificateFactory f = CertificateFactory.getInstance("X.509");
        X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
        PublicKey pk = certificate.getPublicKey();
        byte[] sign = "Qn/rlJRdZAdlPpu1UmmjE+rup8rv8d6XlS9MngAorzYDXefw0vWEP4eHil3YHoA1JUkoQQOgmw0w0QZFmrQbS33sa2t76iuqXI7EtnAPU798K+hEXP88tsYDWJNJFo9DdhkGltP5dQ02DN030Q1w58aTF+yZFfY1KVOPx2bIoL8=".getBytes();

        Signature sig = Signature.getInstance("SHA1withRSA");
        sig.initVerify(pk);
        sig.update(Base64.decode(ReadXMLFile.getString().getBytes()));

        boolean verifies = sig.verify(Base64.decode(ReadXMLFile.getString().getBytes()));

        System.out.println("signature verifies: " + verifies);

        }catch(Exception ex){}
    }
}
4

1 に答える 1

1

ReadXMLFile.getString以下は、整合性がテストされているデータではなく、エンコードされた署名自体であると私が知る前の説明です。解決策については、ディスカッションをご覧ください。


コードが間違っています-base64で暗号化されたRSA暗号化SHA1ダイジェストReadXMLFile.getString()をそれ自体と比較しようとしています。

final byte[] data = Base64.decode(ReadXMLFile.getString().getBytes());
sig.update(data);
boolean verifies = sig.verify(data);

仕様からSignature.update

指定されたバイト配列を使用して、署名または検証されるデータを更新します。

次に、からSignature.verify

渡された署名を確認します。

これで、実際に署名データをverify!に渡していないことになります。sig.verify(Base64.decode(sign))代わりにやるつもりでしたか?

さらに証拠が必要な場合は、投稿pub.armしてください。動作する正しいコードを示すことができます:-)

于 2012-08-22T03:16:02.153 に答える