チェック以下のコードで(signerInformationVerifier)を正確に何をsigner.verifyん?
それは(私も、メッセージのハッシュですが、送信者の秘密鍵で暗号化を理解する)署名に対するメッセージのハッシュを比較して言うことは正しいです。比較する前に、それは「解読」への証明書から公開鍵署名を使用しています。署名が問題の証明書を使用していた場合はどちらも同じ結果を与える必要があります。その場合は、「検証」の目的は、テキストが証明書/署名対応を変更していない確認することです。証明書が署名の時点で有効期限が切れていなかった場合は、「検証」も...チェックすることができ
、私がこれまでに証明書が信頼されているかどうかをチェックしません下記のコード化されたように、「確認する」ことを学びました。
私は、Javadocを試みたグーグルが、答えを見つけることができませんでした。
SignerInformationStore signers = cmsSignedData.getSignerInfos();
// variable "it" iterates all signers
Iterator<?> it = signers.getSigners().iterator();
while (it.hasNext){
SignerInformation signer = (SignerInformation) it.next();
// get all
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
InputStream in = new ByteArrayInputStream(certificateHolder.getEncoded());
X509Certificate cert2 = (X509Certificate) certFactory.generateCertificate(in);
SignerInformationVerifier signerInformationVerifier = new JcaSimpleSignerInfoVerifierBuilder().build(cert2);
if (signer.verify(signerInformationVerifier)){
System.out.println("PDF signature verification is correct");
} else { System.out.println ("PDF signature verification failed");}
それは私の署名PDF文書のためにtrueを返します。Iは、CA 1(ストアでそのように登録されている)と、キーストアに信頼できるものとして登録されていないCA 2からの1つが信頼できるから、信頼できる署名を持っていたPDFでテストしました。
どれ説明/ヘルプははるかに高く評価されます。
SignerInformationVerifier
製造JcaSimpleSignerInfoVerifierBuilder...build(cert)
(主にラップしているContentVerifierProvider
)によって駆動されSignerInformation.verify
、以下のように:
以降
build(cert)
過負荷としないbuild(publickey)
オーバーロードを使用した、場合に(必須-BE-)認証/署名された属性signingTimeが存在し、それをチェックsigningTime値は、証明書の有効期間内であること認証/署名された属性が存在する場合、それは、(受信した)コンテンツのダイジェストことダイジェスト属性と一致チェックを含む、それらをチェックし、チェックし、その証明書における公開鍵の下で署名された属性の署名として署名検証(及びメッセージとのSignerInfoで指定されたアルゴリズム)
そうでない場合(NO符号付き属性)がチェックCERTで公開下(受信した)コンテンツ(及びメッセージとのSignerInfoで指定されたアルゴリズム)の署名として署名検証その
あなたが使用している場合はJcaSimpleSignerInfoVerifierBuilder...build(cert.getPublicKey())
代わりに過負荷を、唯一の違いは、存在する場合、それは証明書の有効期間に対して、signingTimeをチェックしていないということです。
これは、証明書の属性に対して署名者の属性をチェックすることができ(件名だけ?それとも、シリアル番号、発行者?)
それはしていません。あなたのコードべきです。参照org.bouncycastle.cms.CMSSignedDataParser
使用最小例のJavadocをStore
「SID」(一致CERT見つけるためにメッセージに本命のをSignerIdentification
中に)SignerInfo
。この「SID」は通常、発行者およびシリアルのペアですが、CMSにSubjectKeyIdentifierすることができます。ことを決定し、検索または証明書を確認するためにそれを使用してのいずれかの方法で非標準になるように、標準PKCS7 / CMS形式は、署名者のためのサブジェクト名を指定する(またはのSubjectAltName、そのことについては)ありません。それはあなたが他の手段で証明書を見つけたら、あなたが署名したコンテンツを処理するのに有用な情報として、その件名(またはSAN)を使用する場合がありますことが十分に可能です。
これは、証明書が有効/信頼されていることをまったくチェックしません。一例では、問題としてこれを指摘しています。
あなたは単純なアプローチを取りたい場合は、単に証明書がトラストストアにあるか、そうでない場合は、直接設定されているかどうかを確認し、あれば、それはおそらく後者をスキップし、有効期限が切れていないことができSignerInformation
署名属性signingTime含まれていた上記のようにチェックを。リスクのこの葉あなたは、署名者の証明書があるため、キーの妥協取り消され、または証明書が不正を決定した場合。あなたは泥棒や詐欺師からの署名を受け入れていきます。また、あなた自身または手動ですべての新しい署名証明書を検証した後、ローカルのトラストストアや設定を更新し、誰かに依存している、とあなたはそうするようにだまさことができれば、誤ってあなたは再び偽の署名を受け付けます。
あなたが本当に証明書を検証したい場合は、参照するJava PKIプログラマーズ・ガイド(一部の古いバージョンでまたはCertPathProgGuideを)および関連するクラスのjavadoc主にjava.security.cert.CertPathValidator
。
私の理解では、署名は、PDF文書のハッシュ(メッセージダイジェスト)の秘密鍵の暗号化です。その理由は、この方法の署名がはるかに高速であることのようです。関数signer.verify(signerInformationVerifier)を、最も可能性が高い(証明書に定義されたハッシュ関数を用いて)署名されたハッシュメッセージは証明書の公開鍵を用いてダイジェストを復号化したダイジェストハッシュメッセージに対してそれを比較して - それは同じ結果を与えるべきです。
ほとんどの場合ではありません。署名は、暗号化ではありません。以下のために1つのアルゴリズム、RSAは、そこに最初に「のPrivateKeyと暗号化」として署名を記述するに人々を誘惑暗号化と署名のコアで動作間の数学的な対称性は、ですが、それを処理することは、この方法では、すぐに脆弱性につながることが判明しましたそして今、使用される実際の暗号化と署名スキームは大幅に異なっていて、物事の誰かのコピーである、彼らはウェブ上で発見物事をコピーする多くの人々は、他の物事の誰かのコピーは20年発見されたその10年前に発見ものの、交換することができません前のエラーを繰り返し続けます。それが戻って1990年代に指定され、その設計ミスが含まれていたので、Javaの暗号は、ヘルプをしませんCipher.init
RSAは、引数を受け入れるために「暗号化」とのPrivateKeyまたは公開と「復号化」と、実際に、静かに、PKCS1署名または代わりに、暗号化および復号化の回復を行います。(今)DSA、ECDSA、及びエドワーズ曲線デジタル署名アルゴリズムのような他のアルゴリズムのために、署名と暗号化との間のいかなる種類の類似性または関係がありません。興味のある方はこれがcrypto.SXとsecurity.SX上Qsの数十に議論されています。
それはである今、すべてがPKCS7 / CMSでサポートされているほとんどの署名方式が、ハイブリッドであること本当の(小さな)ハッシュを使用して「バルク」のデータが最初に確実に(また、消化呼ぶ)ハッシュされ、そして、署名が計算される/代わりダイジェストバルクデータの。あなたが署名と検証の速度を意味している場合、それは異なります。署名検証よりもはるかに遅いです(1980程度以降)は、RSAのために、現代の時代に実施されるように。DSAとECDSAを検証するためには、署名よりもわずかに遅いです。
上記の説明によって暗示としてPKCS7 / CMSについては、署名は、通常は「コンテンツ」(あなたのPDFファイル)を撮影されていません。代わりに、コンテンツのハッシュ、プラスいくつかの他のメタデータは、PKCS7でauthenticatedAttributesと呼ばれるデータ構造に含まれ、CMSにsignedAttr [ibute] Sと改名され、それは、(ハッシュを含む)公開鍵署名で覆われているものです。しかし、そこにsignedAttributesが使用されていない下位互換性オプションであり、公開鍵署名がされたコンテンツのハッシュに適用されます。まさに署名者と検証者の両方の場合に実行することに記載されているRFC 5652のセクションらをpredは5.4から5.6まであなたは、コンテキストのためにセクション5の全てを必要とするかもしれません。また、使用されるハッシュアルゴリズムは、証明書ではなく、PKCS7 / CMSメッセージで定義されていません。しかし、公開鍵アルゴリズムとサイズ(ひいては強度)証明書に定義されている場合に使用される(好ましいが、実際には要求されない)、および良好な練習、合理的に密接に、公開鍵強度と一致するハッシュを選択することです。
RSAのために検証者は署名から(復号化ではない)ハッシュを「回復」ず、受信したデータの新たに計算されたハッシュと比較-上記のように、コンテンツ、又はsignedAttributesのいずれか。技術的にはこれはただで行われDSAとECDSAのための全く異なるベリファイ動作として、はBouncyCastleクラスによってRSAのためのJCAプロバイダクラスに(間接的に)と呼ば行われ、そのプロバイダクラスが、結果ははるかにあなたがしていると同じです心配している。