作者: 孙 瑛霖, 出处:developerWorks 中国 , 责任编辑: 叶江,
2007-04-18 13:00
1.3 XML 数字签名实例
本节用一个简单的例子来介绍 XML 数字签名的语法和处理规则。
表 1签名前的 XML 文档
|
1. <?xml version='1.0'?> 2. <PaymentInfo xmlns="http://example.com/payment"> 3. <CustomerName>Peter</CustomerName> 4. <Amount>10000</Amount>
5. <CreditCardInfo> 6. <ID>4392 5649 8178 2315</ID> 7. <Issuer>CMB</Issuer> 8. <Expiration>06/2010</Expiration> 9. <Currency>USD</Currency> 10. </CreditCardInfo> 11. </PaymentInfo> |
表 1 中的 XML 文档描述了 Peter 的信用卡支付记录。在按照 XML 数字签名规范对整个文档签名之后,生成的 XML 文档如表 2 所示:
表 2 签名后的 XML 文档
|
1. <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2. <PaymentInfo xmlns="http://example.com/payment"> 3. <CustomerName>Peter</CustomerName> 4. <Amount>10000</Amount> 5. <CreditCardInfo> 6. <ID>4392 5649 8178 2315</ID> 7. <Issuer>CMB</Issuer> 8. <Expiration>06/2010</Expiration> 9. <Currency>USD</Currency> 10. </CreditCardInfo>
11. <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 12. <SignedInfo> 13. <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> 14. <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/> 15. <Reference URI=""> 16. <Transforms> 17. <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 18. </Transforms> 19. <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 20. <DigestValue>9gETxLIm1huTZtMkmGlybtZWa5g=</DigestValue> 21. </Reference> 22. </SignedInfo>
23. <SignatureValue> OIFpnZmeGt+tOywzTgrcYBje/04uGmGIrbZYYxxXj4jsBdq+0JwZ1A== </SignatureValue>
24. <KeyInfo> 25. <KeyValue> 26. <DSAKeyValue> 27. <P> 28. /KaCzo4Syrom78z3EQ5SbbB4sF7ey80etKII864WF64 29. B81uRpH5t9jQTxeEu0ImbzRMqzVDZkVG9xD7nN1kuFw== 30. </P> 31. <Q>li7dzDacuo67Jg7mtqEm2TRuOMU=</Q> 32. <G> 33. Z4Rxsnqc9E7pGknFFH2xqaryRPBaQ01khpMdLRQnG 34. 541Awtx/XPaF5Bpsy4pNWMOHCBiNU0NogpsQW5QvnlMpA== 35. </G> 36. <Y> 37. NMxkCcO6Hdd146qBJ4FQGPpz8IncS8onBPshqlxsd 38. pAqgM2lgn8kCPHqfO7jLx7NPZwHeDtHLfKKSYg+Ln6Xzw== 39. </Y> 40. </DSAKeyValue> 41. </KeyValue> 42. </KeyInfo> 43. </Signature>
44. </PaymentInfo> |
所有与 XML 数字签名相关的信息都存放在 <Signature> 元素中。<Signature> 元素包含有几个主要的子元素:
- <Reference> 元素至少包含一个 <Reference> 元素,每个 <Reference> 元素用于对待签名数据进行引用,包含有引用方式、转换方法、摘要算法和摘要值等信息
- <Reference> 还包含有 XML 数据的规则化方法,并指定了数字签名所使用的算法。
- <SignatureValue> 元素包含对 <Reference> 元素规范化后的内容进行签名生成的数字签名的值。
- <KeyInfo> 元素用于指定验证签名所需的公共密钥相关信息。
XML 数字签名的过程大致为:
1. 根据每个 <Reference> 元素中指定的资源引用方式,摘要算法,数据转换方法等信息,对引用资源进行转换,然后对转换后的结果计算出摘要值。
2. 根据 <SignedInfo> 元素中指定的 XML 数据的规范化方法对 <SignedInfo> 规则化,对规范化之后的数据生成摘要值,并使用私钥对摘要值进行加密,将生成的加密摘要值存放在 <SignatureValue> 元素中。
……
