fo> 元素中,这里使用 XMLSignature 对象的接口取出公钥。
5. 创建DOMValidateContext(行24 - 行25)
在验证签名的过程中,需要创建 DOMValidateContext 对象来指定上下文信息,参数为前面获取到的验证公钥和 <Signature> 元素。
6. 验证签名(行27 - 行28)
验证签名所需的所有信息都已就绪,开始使用XMLSignature 对象提供的接口进行验证。
7. 检查验证结果(行30 - 行46)
如果签名验证失败,则分别对 <Reference> 元素的签名值和其中的每一个引用进行验证,进一步确定导致验证失败的原因。如果签名值验证成功,而某个引用验证失败,则说明是该引用新生成的摘要值与原文档中的摘要值不匹配导致验证失败。
以签名后生成的 XML 文档作为输入,执行验证程序,从程序的输出信息可以判断出验证成功:
Signature passed core validation
接下来将包含有 <Signature> 元素的待验证文档作一点改动,把 Peter 的支付信息中的金额改为 60000 美元,再次执行程序进行验证,则验证失败:
Core validation failed
Signature validation status: true
Reference[0] validity status: false
输出信息提示签名值验证成功,而对整个文档的引用验证失败。签名值验证成功是因为 <SignedInfo> 没有改动,对文档的引用验证失败是因为前面修改了文档中的数据。
3.2 生成并验证Enveloping格式的签名
Enveloping 格式的签名指 <Signature> 元素包含着被签名的数据内容,如表 6 所示:
表 6 Enveloping 格式的数字签名
1. ..............
2. <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
3. ..............
4. <SignedData>
5. ..............
6. </SignedData>
7. </Signature>
8. ..............
在 Enveloping 格式的数字签名中,待签名的 XML 内容需要通过 URI 或者 Transform 进行引用。
3.2.1 生成签名
1. // Create XMLObject refering to Simon's payment info
2. DocumentBuilderFactory dbf =
3. DocumentBuilderFactory.newInstance();
4. dbf.setNamespaceAware(true);
5. Document origDoc =
6. dbf.newDocumentBuilder().parse(new FileInputStream(inputFile));
7. Element docEle = origDoc.getDocumentElement();
8. Node simonPayment =
9. docEle.getElementsByTagName("PaymentInfo").item(0);
10. XMLStructure content = new DOMStructure(simonPayment);
11. XMLObject xmlObj =
12. fac.newXMLObject(Collections.singletonList(content),
13. "SimonPayment", null, null);
14.
15. // Create the reference to element to be signed
16. Reference ref = fac.newReference("#SimonPayment",
fac.newDigestMethod(DigestMethod.SHA1, null));
...... ......
17. XMLSignature signature = fac.newXMLSignature(si, ki,
Collections.singletonList(xmlObj), null, null);
为了引用待签名的内容,首先查找到 Simon 的支付记录对应的 DOM 元素,使用 XMLStructure 对其进行包装,然后生成 XMLObject ,并为其指定 id 为 "SimonPayment"。随后在创建 Referenc 的时候,同样指定引用 id 为 "SimonPayment"。在创建 XMLSignature 对象的时候将待签名的 XMLObject 作为参数,这些 XMLObject 包含的 XML 内容将会成为 <Signature> 元素的子元素,从而创建出 Enveloping 格式的签名。程序的其他部分与生成 Enveloped 格式的数字签名相同。
签名之后生成的 <Signature> 元素如下:
1. <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
2. <SignedInfo>
3. <CanonicalizationMethod
4. Algorithm="http://www.w3.o上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
|