快速业务通道

使用Java验证Lotus Forms XML数字签名 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
使用户能够对表单进行数字签名,不需要下载和安装 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) 文档中。

准备好 DOM 实例文档后,从要进行验证的 Signature DOM 节点中创建一个 DOMValidateContext。还需要用一个 KeySelector 从 KeyInfo 部分的签名证书 中提取公共密匙。DOMValidateContext 使用前面小节中的定制 URI dereferencer 来执行 XML 标准化(canonization)。解组 DOMValidateContext 将创建一个 XMLSignature 对象,其 validate() 方法可以返回表示签名是否有 效的信息。

对所有 XForms 实例中的所有签名进行验证后,将收集最终生成的结果,表示 完整表单的验证状态。

使用Java验证Lotus Forms XML数字签名(3)

时间:2011-05-15 IBM Eric Fu

处理 XForms 数据模型

如前一小节所述,Lotus Forms 中的 XML 签名是一个封装的签名,包含 XForms 实例的标记。要准确地验证此类签名,必须为 XForms 实例数据构建 DOM 。W3C XForms 规范(http://www.w3.org/TR/xforms/#structure-model- instance)要求将实例数据提取到一个单独的 DOM 文档中,并且如果实例数据被 内联到文档内部,那么必须从 XForms 实例元素及其祖先节点继承相应的名称空 间。所有对数据的操作应当在单独的 DOM 文档中完成。

这种方法意味着要创建文档,必须从包含 XML 签名的 xform:instance 内容 中克隆 DOM 子树。新的文档应当包含注释和 PI 节点,以及来自 xforms:instance 的惟一子元素。对于与清单 1 相对应的已签名表单,必须使用 从所有祖先节点继承的名称空间创建一个新文档,其中包含 <data> 文档 元素。这个文档被称为实例文档,而源文档被称为表单文档。

清单 2. 提取的文档元素的名称空间

<data xmlns=""  xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"   xmlns:custom="http://www.ibm.com/xmlns/prod/XFDL/Custom"   xmlns:designer="http://www.ibm.com/xmlns/prod/workplace/forms/designer/ 2.6"   xmlns:ds="http://www.w3.org/2000/09/xmldsig#"   xmlns:dsxp="http://www.w3.org/2002/06/xmldsig-filter2"   xmlns:ev="http://www.w3.org/2001/xml-events"   xmlns:sigmeta="http://www.ibm.com/xmlns/prod/forms/signature/metadata/1 .0"   xmlns:xfdl="http://www.ibm.com/xmlns/prod/XFDL/7.6"   xmlns:xforms="http://www.w3.org/2002/xforms"   xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> …  </data>

由于父节点的名称空间前缀可以被一个子节点覆盖,比如默认名称空间,因此 如果名称空间已被复制到目标,那么就不会再次复制该名称空间。这种方法遵守 名称空间覆盖规则,因此只有距离最近的名称空间定义是有效的。

清单 3. 将名称空间从源节点的所有祖先复制到目标节点的代码

private void cloneNamespaces(Element src, Element target)  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号