加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用xml中的公钥进行javax.xml.crypto.dsig验证

发布时间:2020-12-16 23:15:04 所属栏目:百科 来源:网络整理
导读:使用 javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证 XMLSignature?公钥似乎是在签名的xml中,但我无法找到一种方法来获取它. DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);XMLSignature signature = fac.unmars
使用 javax.xml.crypto.dsig,如何在不指定公钥的情况下解组和验证 XMLSignature?公钥似乎是在签名的xml中,但我无法找到一种方法来获取它.

DOMValidateContext valContext = new DOMValidateContext(key,signatureNode);
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature.validate(valContext);

据我所知,有必要将KeySelector而不是Key传递给DOMValidateContext.但是,我无法弄清楚如何实现KeySelector.

这是我发现的关于如何实现KeySelector的唯一示例:
????http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html

不幸的是它不起作用.在该实现中,它执行以下操作但总是失败,因为没有KeyValue元素(看起来它们是org.jcp.xml.dsig.internal.dom.DOMX509Data元素而不是KeyValue元素,它们无法通过他们的关键).

List list = keyInfo.getContent();

for (int i = 0; i < list.size(); i++) {
    XMLStructure xs = (XMLStructure) list.get(i);
    if(xs instanceof KeyValue) {
        PublicKey pk = null;
        try {
            pk = ((KeyValue) xs).getPublicKey();
        } catch (KeyException ke) {
            throw new KeySelectorException(ke);
        }
        // make sure algorithm is compatible with method
        if (algEquals(sm.getAlgorithm(),pk.getAlgorithm())) {
            return new SimpleKeySelectorResult(pk);
        }
    }
}
throw new KeySelectorException("No KeyValue element found!");

那么,有没有办法做到这一点?我希望能够验证xml文件的签名,而无需使用公钥.我只想从xml获取公钥.

解决方法

扩展你检查的if()条件,看看xs是否是KeyValue的一个实例,也检查X509Data的实例,如下所示:

else if (xs instanceof X509Data) {
     for (Object data : ((X509Data) xs).getContent()) {
          if (data instanceof X509Certificate) {
              pk = ((X509Certificate) data).getPublicKey();
          }
     }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读