rg/TR/2001/REC-xml-c14n-20010315#WithComments"/>
5. <SignatureMethod
6. Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/>
7. <Reference URI="#SimonPayment">
8. <DigestMethod
9. Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
10. <DigestValue> XGesfrCnr8KuXCBmwlb4ofheksg=</DigestValue>
11. </Reference>
12. </SignedInfo>
13.
14. <SignatureValue>
15. kxOvEO6beK6rcLh+5OyJz5G2KjFBKKLGREtMGgio2CZzYpaNH/nyfw==
16. </SignatureValue>
17.
18. <KeyInfo>
<KeyValue>
<DSAKeyValue>
<P>
/KaCzo4Syrom78z3EQ5SbbB4sF7ey80etKII864WF64B81uRpH5t9
jQTxeEu0ImbzRMqzVDZkVG9xD7nN1kuFw==
</P>
<Q>li7dzDacuo67Jg7mtqEm2TRuOMU=</Q>
<G>
Z4Rxsnqc9E7pGknFFH2xqaryRPBaQ01khpMdLRQnG541Awtx
/XPaF5Bpsy4pNWMOHCBiNU0NogpsQW5QvnlMpA==
</G>
<Y>
MOqJjU5ihtTOS6wiVnoZSCz3mDewfBsy4eRLIzgZe47iJ1F9
jGJHC1HvUt3zd6l5zHu1ubZpR4y0XIEAxvprKw==
</Y>
</DSAKeyValue>
</KeyValue>
19. </KeyInfo>
20.
21. <Object Id="SimonPayment">
22. <PaymentInfo xmlns="http://example.com/payment">
23. <CustomerName>Simon</CustomerName>
24. <Amount>25000</Amount>
25.
26. <CreditCardInfo>
27. <ID>4392 5649 8178 2315</ID>
28. <Issuer>CMB</Issuer>
29. <Expiration>06/2010</Expiration>
30. <Currency>USD</Currency>
31. </CreditCardInfo>
32. </PaymentInfo>
33. </Object>
34. </Signature>
表 5 中的验证程序同样可以用来验证上面生成的 Enveloping 格式的 XML 签名。
上一页 [1] [2] [3] [4] [5] 下一页
3.3 生成并验证Detached格式的签名
Detached 格式的签名指 <Signature> 元素与被签名的数据内容之间是彼此分离的,既不是包含关系也不是被包含关系,如下表所示:
1. ..............
2. <SignedData>
3. ..............
4. </SignedData>
5. ..............
6. <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
7. ..............
8. </Signature>
9. ..............
Detached 格式多用于对外部独立的数据对象进行签名,使用 URI 来引用外部数据对象,也可以引用同一 XML 文档中的其他元素,对之进行数字签名。
表3中待签名的 XML 文档包含有两次信用卡交易的支付信息,第一个是 Simon 的信用卡交易记录,第二个是 Peter 的。本节将对 Peter的支付记录进行数字签名,所使用的签名格式是 Detached 格式。为了让 <Signature> 元素能够引用到包含有 Peter 信用卡交易信息的 XML 元素,这里用 id 属性对 Peter 的 <PaymentInfo> 元素加以引用。
3.3.1 生成签名
本节的大部分代码都与生成 Enveloped 格式签名的代码相同,只是在创建 Reference 的时候有些不同:
1. XMLSignatureFactory fac =
2. XMLSignatureFactory.getInstance("DOM");
3.
4. // Create the reference to Peter's payment info
5. DigestMethod sha1DigMethod =
6. fac.newDigestMethod(DigestMethod.SHA1, null);
7. Reference ref =
8. fac.newReference("#PeterPayment", sha1DigMethod);
"#PeterPayment" 用于引用位于同一文档中的 Peter 的
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
|