使用 Java 验证 Lotus Forms XML 数字签名
2010-01-15 00:00:00 来源:WEB开发网XML 签名包含一个表示签名内容的 Reference 元素。Reference 不具有 URI 属性,在 XFDL 文档中这表示整个文档都应当被签名隐藏。Reference 然后包含一个 Transform,可以去掉生成的 XML 签名。这一步是必需的,因为 XML 签名被封装在已签名的 XFDL 文档的内部。当所引用的资源(XFDL 文档)的数字指纹被计算后,Reference 的 DigestValue 元素将为空。计算结果随后被存储到 DigestValue 中,这将修改 XFDL 文档。然而,实际上没有发生修改(从 XML 文档中去除 XML 签名),这就是我们从对其计算摘要的内容中去掉已封装签名的原因。
在清单 1 中,SignedInfo 中还有一个 Reference。XML 签名可以对创建者所需要的任意数量的资源进行签名。在本例中,我们使用它对生成的 XML 签名的额外元数据进行签名。例如,这一特性可用于在生成的 XML 签名中包含一个简单的 XAdES 时间戳。
图 1. 样例签名表单
验证签名表单
查看应用程序(比如 IBM Lotus Forms Viewer)或程序可以使用一个私有密匙对表单进行签名。下载 小节提供了一个未进行签名的样例表单。建议用户下载 Lotus Forms Viewer 来对表单进行签名并理解其工作原理。IBM Lotus Forms Server 还使用户能够对表单进行数字签名,不需要下载和安装 Lotus Forms Viewer。
除 Lotus Forms API 以外,还可以使用标准的 Java XML Digital Signature API(在 JSR 105 中定义)对签名表单进行交叉验证,这个 API 也作为 Java 6 的一部分包含在其中。
要断言某个表单没有被篡改,必须对表单中的所有签名进行验证。这种验证可以通过查找所有包含 Signature 元素和非空 SignatureValue 元素的 XForms 实例来完成。对于此类 XForms 实例中的每一个,将针对验证创建一个单独的、具有合适名称空间的实例文档。出于性能考虑,可以使用用于 XML 的流 API 来拉取 XForms 实例并放入到一个新的 Document Object Model (DOM) 文档中。
更多精彩
赞助商链接