Java SE 6中XML数字签名标准Java接口
2008-01-05 20:21:33 来源:WEB开发网级别: 中级
孙 瑛霖, 软件工程师, IBM 中国软件开发实验室 SOA设计中心
2007 年 4 月 16 日
xml 数字签名技术用于对 XML 格式的数据进行数字签名,以保证报文的完整性,不可否认性,以及提供身份认证信息。JSR 105 提供了 XML 数字签名的 java 接口,而最近发布的 Java SE 6 则包括了 JSR 105的 实现,从而为基于 Java 的应用程序提供了标准的 XML 数字签名接口。本文首先简要介绍技术背景,以实例来讲解 XML 数字签名的语法和处理规则,之后用具体的程序例子解释如何使用 Java SE 6 生成各种格式的 XML 数字签名并进行验证。
1. 技术背景
1.1 数字签名简介
数字签名是非对称密钥技术的一种应用模式,用于保证报文的完整性,不可否认性,以及提供身份认证信息。数字签名的原理如图 1 所示。
图 1:数字签名的原理
发送者在发送报文之前,先选用某种摘要算法为报文生成一个摘要值,并使用自己的私钥对摘要值加密,然后将加密后的摘要附在报文后面,一同发送给报文的接收者。接收者收到报文后,从中分离出原始报文和加密后的报文摘要,使用与发送者相同的摘要算法计算原始报文的摘要值 D
,并使用发送者的公共密钥将加密后的报文摘要解密得到摘要值 D’
,检查 D
与 D’
是否匹配。
假如匹配,那么由于密钥对的唯一性,所以可以确定报文发送者的身份,而且由于数据摘要算法的特点,还可以确定原始报文在传输过程中没有被篡改。
1.2 XML 数字签名简介
XML 发展至今,已经逐渐成为标准的数据描述技术,在分布式应用中广泛地用于数据的交换。由于 XML 数据本身的非凡性和使用 XML 进行数据传输的分布式应用的特点,在对 XML 文档的特定部分进行签名,多方签名,以及签名后保持 XML 文档原有的良构特性等诸多方面,传统的数字签名技术都无法很好地实现。
基于这样的问题,W3C 组织制订了 XML 数字签名规范,规定了标准的 XML 数字签名语法和处理规则。同传统意义的数字签名相比,XML 数字签名能够对 XML 文档进行细粒度地分析,支持多种方式的文档数据转换,只对文档的特定部分进行签名和验证,并且能够保持 XML 文档的良构特性。此外,XML 数字签名提供的密钥信息表示方法清楚易读,更加便于签名的自动验证处理。
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>
更多精彩
赞助商链接