xml签名中的java引用验证
我在我的程序中使用ml签名来检查消息是否被篡改,并检查消息是否由有效的人签名。第二部分我明白了。问题在于第一部分,即检查参考有效性。这是我正在使用的代码xmldoc
是包含xml封装签名的文档对象
NodeList nl = xmldoc.getElementsByTagNameNS
(XMLSignature.XMLNS, "Signature");
DOMValidateContext valContext = new DOMValidateContext
(pbk1, nl.item(0));
正如您所看到的,valContext只包含signature元素和公钥(这是验证签名所必需的)。但是在下面的代码中,您可以看到,只有通过使用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 楼答案
元素的DOM
Node
对象不仅仅是元素,它是整个XML文档中包含的元素。如果查看Node interface documentation,您会注意到一个名为getOwnerDocument()
的方法。因此,从传递给DOMValidateContext
对象的Node
可以访问整个XML文档,以及Signature
元素中引用的文档中的任何内容