xml签名中的引用验证

时间:2012-04-04 04:41:08

标签: java xml xml-signature

我在程序中使用ml签名来检查邮件是否已被篡改并检查邮件是否已由有效人员签名。第二部分我明白了。问题出在第一部分 - 即检查参考有效性。这是我正在使用的代码。 xmldoc是一个包含xml封装签名的文档对象。

 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);
    } 

1 个答案:

答案 0 :(得分:2)

元素的DOM Node对象不仅仅是元素,它是整个XML文档中包含的元素。如果您查看Node interface documentation,您会注意到一个名为getOwnerDocument()的方法。因此,从您传递给Node对象的DOMValidateContext,可以访问整个XML文档,从而访问Signature元素中引用的该文档中的任何内容。