2

我在我的程序中使用 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);
    } 
4

1 回答 1

2

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

于 2012-05-21T20:44:39.513 回答