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