2

プログラムでml署名を使用して、メッセージが改ざんされているかどうかを確認し、有効な人物によって署名されているかどうかを確認しています。私が理解した第二の部分。問題は最初の部分にあります-つまり、参照の有効性をチェックします。これが私が使用しているコードです。xmldocxmlエンベロープ署名を含むドキュメントオブジェクトです。

 NodeList nl = xmldoc.getElementsByTagNameNS
      (XMLSignature.XMLNS, "Signature");

    DOMValidateContext valContext = new DOMValidateContext
      (pbk1, nl.item(0)); 

ご覧のとおり、valContextには署名要素と公開鍵のみが含まれています(これは署名を検証するために必要になります)。ただし、以下のコードでは、オブジェクトを使用することによってのみvalContext、参照が検証されていることがわかります。これはどのように可能ですか?参照を検証するには、で参照されている要素を抽出できる実際のxmldocにアクセスし、<reference>その値のハッシュ/ダイジェストを見つけて、それらをと比較する必要があり<digest value>ます。
しかし、どういうわけか、以下のコードは機能します。方法がわかりませんか?誰か説明してください。

Iterator i =
      signature1.getSignedInfo().getReferences().iterator();
    for (int j=0; i.hasNext(); j++) {
      boolean refValid = ((Reference) 
        i.next()).validate(valContext);
      System.out.println("ref["+j+"] validity status: " + 
        refValid);
    } 
4

1 に答える 1

2

要素のDOMNodeオブジェクトは、要素だけでなく、XMLドキュメント全体に含まれている要素でもあります。ノードインターフェイスのドキュメントを見ると、と呼ばれるメソッドに気付くでしょうgetOwnerDocument()。したがってNode、オブジェクトに渡したものからDOMValidateContext、XMLドキュメント全体にアクセスできるため、Signature要素内で参照されているそのドキュメント内のすべてのコンテンツにアクセスできます。

于 2012-05-21T20:44:39.513 に答える