使用 Java 验证 Lotus Forms XML 数字签名
2010-01-15 00:00:00 来源:WEB开发网定制 URI dereferencer
由于 XForms 处理模型要求将包含签名的实例数据从源表单文档(本例中为 XFDL 文档)中单独实例化,因此带有 URI="" 的引用(相同的文档引用)表示对实例文档的开始部分的引用,而不是完整的 XFDL 文档。我们希望能够对整个 XFDL 文档进行签名,而不是仅仅是数据,从而在签名双方创建安全的协议和合约。
标准 XML 签名允许一个特殊的 Reference:不带有 URI 属性 Reference。XML 签名规范将其定义为接收方应用程序应当能够识别在这种情况下应当使用的对象。在 Lotus Forms 中,未包含 URI 的 Reference 表示整个 XFDL 文档。因此,需要一个定制 dereferencer 来知道如何从各种引用的 URI 中获取所有被引用数据(包括不带 URI 的引用)。这种定制 dereferencer 实现了 javax.xml.crypto.URIDereferencer 并且被称为 NoUriDereferencer。
NoUriDereferencer 使用委托(delegation)模式构建。在取消引用期间,如果 URIReference 对象的 URI 属性为 null,那么表单文档被作为八位字节流(octet stream)返回(尽管返回 XML 文档节点集会更加有效,要实现除相同文档引用以外的引用,javax.xml.crypto.URIDereference> 文档必须使用八位字节流)。对于所有其他 URI,类将委托由标准 JSR 105 实现提供的最初的默认 dereferencer。
清单 4. Dereferencer 代码public static class NoUriDereferencer implements URIDereferencer
{
private InputStream inputStream;
public NoUriDereferencer(InputStream inputStream) throws IOException
{
this.inputStream = inputStream;
}
public Data dereference(URIReference uriReference, XMLCryptoContext context)
throws URIReferenceException
{
if (uriReference.getURI() == null)
{
Data data = new OctetStreamData(this.inputStream);
return data;
}
else
{
URIDereferencer defaultDereferencer = XMLSignatureFactory.getInstance("DOM").
getURIDereferencer();
return defaultDereferencer.dereference(uriReference, context);
}
}
}
更多精彩
赞助商链接