2012-04-04 72 views
2

我在我的程序中使用了ml签名来检查消息是否已被篡改,并检查它是否已由有效人员签名。第二部分我明白了。问题在于第一部分,即检查参考有效性。这是我正在使用的代码。 xmldoc是一个包含xml封装签名的文档对象。您可以看到valContext仅包含签名元素和公钥(这将需要验证签名)。您可以看到valContext只包含签名元素和公钥(这将需要验证签名)。但是在下面的代码中,只有使用valContext对象才能看到该参考已验证。这怎么可能?为了验证参考,它需要访问实际的xmldoc,从中可以提取<reference>中引用的元素,然后找到其值的散列/摘要并将其与<digest value>进行比较。
但不知何故,下面的代码工作。我不知道如何?有人请解释。xml签名中的引用验证

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

回答

2

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