您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > 基于JSR的XML数字签名及其应用
基于JSR-105的XML数字签名及其应用刘军军,梁建武(中南大学信息科学与工程学院,湖南长沙410075)摘要:随着XML应用的日益深入,越来越多的信息被以XML文档形式来交换。基于XML的数字签名就是其中一个例子。JSR-105实现了XML数字签名标准,使其应用更加贴近工程实践。本文介绍XML数字签名的一些细节包括XML数字签名的对象、签名种类、签名验证以及XML数字签名所涉及的算法(摘要算法、签名算法、转换算法),还介绍了如何利用JSR-105API来实现数字签名。最后利用JSR-105API实现了两个实际数字签名的例子,一个是示例性的说明了XML数字签名的概念。第二个实现了简单的盲签名。关键词:JSR-105,XML数字签名,盲签名XMLSignatureanditsapplicationsbasedonJSR-105LIUJun-junLIANGJian-wu(SchoolofInformationScience&Technology,CentralSouthUniversity,Changsha410075,China)Abstract:WiththedeepgoingoftheXMLapplication,moreandmoreinformationisexchangedwiththeformofXMLdocuments.XMLSignatureisanexampleofthissituation.JSR-105implementsthestandardsofXMLSignature,whichbringsitneartopracticeofengineering.ThispaperintroducessomedetailsonXMLSignaturewhichincludesthetargetofsigning,thetypeofsignatureandthecoursesofvalidate,andalso,thereisanintroductiononwaysappealingtoJSR-105APIinXMLSignature.Attheend,twopracticalexamplesarepresented,inwhichoneisillustrationtotheconceptsofXMLSignature,anotherrealizesthebasicblindsignature.KeyWords:JSR-105,XMLSignature,blindSignature1引言可扩展标记语言(XML)是由W3C设计并推荐的新一代标记语言。针对XML数据传输存储的安全需求,IETF和W3C联合发布了XML数字签名规范。现在这一规范已成为W3C的推荐标准[1]。JSR-105[2]是对这一标准的具体实现,并使其成为了JDK1.6安全体系的一部分。JSR(JavaSpecificationRequest)是由JavaCommunity成员提交给JCP(JavaCommunityProcess)这个国际开放组织的JavaAPI开发草案,105是这一草案的编号。如今这一草案已经成为现实,而留给我们的是一组更加容易使用的进行XML数字签名的标准API。本文首先介绍了W3C关于XML数字签名标准中数字签名的实现及其校验的过程。然后介绍JSR-105的实现。最后,介绍几种利用JSR-105API来实现数字签名、盲签名的方案及具作者简介:刘军军(1982-),男,内蒙乌海人,在读硕士研究生,主要研究方向为计算机网络安全;梁建武(1964-),男,高级工程师,研究领域为网络安全与认证。体软件实现。2XML数字签名标准XML数字签名规范的语法定义中定义了一些元素,关于其语法,可以参看W3C推荐的原文,从中也可得到很多XML数字签名的细节。值得一提的是XML数字签名的签名对象、三种签名形式、校验的过程以及XML数字签名所涉及的算法(包括摘要算法、签名算法、转换算法)。XML数字签名可以针对XML文档、一个文档中的XML元素、XML元素包含的内容。具体的包括:封装式签名(Enveloping)、嵌入式签名(Enveloped)和分离式签名(Detached)。对于不同情况的XML数字签名,校验[3]的具体过程是不同的,但它们都包含引用校验(ReferenceValidation)和签名校验(SignatureValidation)两个过程。这里重点介绍一下XML数字签名所用到的一些算法,因为他们的很多细节信息对于编程实现复杂功能是很有用的。(1)摘要算法以SHA-1为例,计算摘要得到了160bit的摘要信息,那么在签名生成的XML文件里面会包含有摘要的值(在DigestValue元素中),这些输出的摘要是经过base64[4]编码处理过的,因此处理签名XML文件时候要注意这点。(2)签名算法以RSA算法为例,这里的称呼为PKCS1(RSA-SHA1),而在RFC中的正式称呼为RSASSA-PKCS1-v1_5[5]。RSA算法签字的模式为:CRYPT(PAD(ASN.1(OID,DIGEST(data))))从这个函数式中我们可以看到XML数字签名内在的一些细节。其中包括摘要计算,抽象语法标记的转换,填充操作,然后才是对这些处理过的信息的签名。当然,与摘要算法一样,显示的信息是经过base64编码处理的。(3)转换算法转换是将数据源数据转变成其派生类型的处理过程。典型的转换包括XML的正规化、XPath和XSLT。转换算法[6]是对Reference元素所指示的数据所形成的8bit组数据流进行的。因此在需要对签名的XML文档的内容进行特殊处理的时候需要考虑的是经过逆变换得到的实际是一个8bit组构成的串,不恰当的处理将使编程举步维艰。3JSR-105对XML数字签名的实现在JSR-105API可以完成上节所述的三种签名及其校验,所有这些功能都封装在了六个JavaAPI包中[7]。概括起来,每种签名都要有以下这几个步骤:步骤1:加载一个XMLSignatureFactory对象,后面我们创建Reference元素对象、SignedInfo元素对象、KeyInfo元素对象、XMLSignature元素对象都要直接或者间接用到这个工厂类对象。其典型的创建语句为:XMLSignatureFactoryfac=XMLSignatureFactory.getInstance(DOM);步骤2:使用前一步骤得到的工厂类对象创建Reference对象,给它指定计算摘要的算法。其典型创建语句(以下为创建Enveloping签名的做法)为:Referenceref=fac.newReference(#object,fac.newDigestMethod(DigestMethod.SHA1,null));步骤3:使用第1步得到的工厂类实例创建SignedInfo对象,给它指定正规化算法和签名的算法。其典型的创建语句为:SignedInfosi=fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,(C14NMethodParameterSpec)null),fac.newSignatureMethod(SignatureMethod.RSA_SHA1,null),Collections.singletonList(ref));步骤4:创建KeyInfo对象,给他设置签名算法的公钥以作验证之用。其典型的创建语句为:KeyInfoki=kif.newKeyInfo(Collections.singletonList(kv));步骤5:使用第1步得到的工厂类实例创建XMLSignature对象。其典型的创建语句为:XMLSignaturesignature=fac.newXMLSignature(si,ki,Collections.singletonList(obj),null,null);步骤6:创建签名上下文对象DOMSignContext,设置签名用的私钥。其典型的创建语句为:DOMSignContextsignContext=newDOMSignContext(kp.getPrivate(),doc);步骤7:签名。其典型的执行语句为:signature.sign(signContext);对于三种签名,它们都要执行上面的步骤,所不同的是在设置签名数据来源上,只要把Reference对象构造成具有不同数据来源的情况就可以了。签名的校验过程与签名过程类似,也有几个必经步骤。步骤1:读入要校验的XML文件,解析,找到文件中的签名元素。步骤2:加载一个XMLSignatureFactory对象,后面各步骤中将用到这个对象。步骤3:创建一个DOMValidateContext对象,给他指定密钥选择器和解析得到的XML文档中的签名元素。其典型的创建语句为:DOMValidateContextvalContext=newDOMValidateContext(newKeyValueKeySelector(),nl.item(0));步骤4:根据校验上下文的信息利用第2步得到的工厂对象重新安排XML签名,得到一个可以用来校验的XMLSignature对象。其典型的执行语句为:XMLSignaturesignature=fac.unmarshalXMLSignature(valContext);步骤5:根据当前的校验上下文信息执行核心校验。其典型的执行语句为:BooleancoreValidity=signature.validate(valContext);4JSR-105API的应用方案及其实现(1)基本数字签名XML数字签名可以实现网络环境中对特定URI的数据资源的签名,也可以对XML文档签名,还可以对放入XML文档里面的数据元素来签名,因而以XML文档来组织数据进行交换将具有较高安全可靠性。因此网络中的数据资源在被传播、扩散的过程中可以用XML数字签名与校验的方式来提高其有效性,从而提高网络数据的可信任度。这里实现了一个应用程序对用户指定的的网上文件进行签名及校验,对现有的XML文件进行签名与校验,还可以对其他即时数据进行签名。如下页图1所示。图1XML数字签名的实现(2)盲签名盲签名[7]是指消息拥有者的目的是让签名人对该消息签字,但不让签名者知道消息的具体内容,签名保证在某一时刻以公证人的资格证实这个消息的存在。具体的,盲签名包括盲化消息、签名、对签名去盲、验证签名有效性几个步骤,这里只讨论一种利用XML数字签名机制实现的盲签名如何用现有的XML数字签名实现。(以下假定Alice为消息拥有者,Bob为签名者)利用XML数字签名机制实现的盲签名:(1)Alice选择随机大数n和待签名的消息*nZM,随机数nZr,,计算nMrmmod,将m传给Bob。(2)Bob对盲信息进行XML数字签名(采用RSA-SHA1算法)并将XML签名产生的文件传给Alice。Alice将M与XML文件一并作为签名。(3)验证。验证者从Alice那里得到r和n,计算出盲信息m,将它与XML文件中被签名信息比较,若相等则继续进行XML数字签名核心验证,若核心验证通过则最后对信息M的数字签名验证通过,否则签名验证失败。验证阶段需要向消息拥有者询问盲信息产生所需的随机数r和n。因此消息拥有者每次让签名者签名完成之后要保留r和n,因而,这是受到很多限制的盲签名。由于XML数字签名签名时要对所签信息利用指定的算法转化,因而使得XML数字签名并不像普通方式下的数字签名那么单纯。要实现更加复杂的签名方式必须对XML数字签名的很多细节很清楚。图2XML盲签名的实现参考文献[1]EastlakeD,etal.XML-SignatureSyntaxandProcessing[R].W3CRecommendation,12Feb.
本文标题:基于JSR的XML数字签名及其应用
链接地址:https://www.777doc.com/doc-2570267 .html