Java& XMLDSig:没有URI的引用

时间:2013-03-20 11:20:58

标签: java xml-signature xml-dsig

我正在尝试使用带有javax.xml.crypto.dsig。*包的XMLDSig签署一些文本。我需要引用一些正在签名的内容。根据项目要求,此引用不应包含任何URI,它不是< Reference URI =“”> ...< / Reference>,而是< Reference> ...< / Reference>。

我没有找到任何可能和正确的信息,但要求说XMLDSig允许这样的引用,每个签名最多一个。

有人遇到同样的问题吗?使用javax.xml.crypto.dsig。*包来生成带有这种引用的签名可以做些什么?没有魔法?

据我所知,上面提到的包只允许用URI(或空URI)引用一些数据,但根本没有任何URI。可能是我错过了它的用法吗?

2 个答案:

答案 0 :(得分:0)

实际上,XML签名可以包含一个没有URI的Reference,但是您需要告诉签名上下文如何找到以这种方式引用的对象。这可以通过使用URIDereferencer的自定义实现来完成。

因此,要在没有任何URI的情况下引用签名中的某些内容,您可以执行以下操作:

Reference dataReference = xmlSigFactory.newReference(null, <your digest method>, <your transformations list>, <needed type>, <id>);

第一个null参数表示null为URI,即没有URI。

要使此引用有效,您需要在URIDereferencer对象中指定自定义DOMSignContext实现,该实现包含对要签名的内容的所有引用。此自定义URIDereferencer应包含查找正在签名的内容的逻辑,它是您自己的实现,因此您应该知道如何查找所需内容。

答案 1 :(得分:0)

创建NoUriDereferencer实现URIDereferencer并将其设置为您的XmlSignContect

public class NoUriDereferencer implements URIDereferencer {

private Node data = null;

public NoUriDereferencer(Node node) {
    data = node;
}

public Data dereference(URIReference ref, XMLCryptoContext ctxt) {
    return new NodeSetData() {
        public Iterator iterator() {
            return Collections.singletonList(data).iterator();
        }
    };
}
}