数字签名及其实现
2012-12-29朱文艳
朱文艳
(胜利石油管理局 海洋钻井公司,山东 东营 257000)
数字签名及其实现
朱文艳
(胜利石油管理局 海洋钻井公司,山东 东营 257000)
随着计算机技术、网络技术以及其他高科技技术的发展,信息的安全性、数据的保密性也越来越重要。以Visual C++6.0为开发工具,开发数字签名的签名和认证程序。结果表明,开发的程序能够对文本生成的数字摘要通过签名算法进行签名,并对签名值利用认证算法进行认证,判断签名的有效性,保证数据的完整性、发送信息的不可否认性和身份的确定性。
数字签名;数字摘要;签名算法;认证
1 研究目的
随着油田协同办公平台研究的不断深入,领导签批业务呈扩大化的趋势,网上签批作为其中重要的一环,如果解决不好势必影响整个办公系统的效率,将先进的网上签批技术融合到协同办公系统,能够提高网上审批的安全性和权威性,拓展办公系统现有网上审批功能,提高办公效率,逐步深入实现数字化办公。因此需要对网络签批业务进行整体规划,实现统一签批模式、统一安全认证。为此,一种用来保证信息完整性的安全技术——数字签名技术成为人们非常关心的话题。本文在数字签名技术的原理和数字签名中的签名和认证过程的基础上,以Visual C++6.0为开发工具,实现数字签名的签名和认证程序,对文本生成的数字摘要通过签名算法进行签名,并对签名值利用认证算法进行认证,判断签名的有效性。
2 数字签名的理论知识
数字签名是通过一个单向函数对要传送的报文进行处理得到的用以认证报文来源并核实报文是否发生变化的一个字母数字串[1]。
在传统的办公系统中,通常都利用书面文件的亲笔签名或印章来规定契约性的责任,在协同办公平台中,传送的文件是通过电子签名证明当事人身份与数据真实性的,数据加密是保护数据的最基本方法,但也只能防止第三者获得真实数据。电子签名则可以解决否认、伪造、篡改及冒充等问题,具体要求:发送者事后不能否认发送的报文签名、接收者能够核实发送者发送的报文签名、接收者不能伪造发送者的报文签名、接收者不能对发送者的报文进行部分篡改、网络中的某一用户不能冒充另一用户作为发送者或接收者。
3 数字签名相关技术
实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术,如基于RSA Date Security公司的 PKCS(public key cryptography standards)、Digital Signature Algorithm、x.509、PGP(pretty good privacy)。1994年美国标准与技术协会公布了数字签名标准(DSS)而使公钥加密技术广泛应用。&127公钥加密系统采用的是非对称加密算法。
3.1 用非对称加密算法进行数字签名
3.1.1 算法的含义
此算法使用两个密钥:公开密钥(public key)和私有密钥(private key),&127;分别用于对数据的加密和解密,即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能进行解密;如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。
3.1.2 签名和验证过程
(1)发送方首先用公开的单向函数对报文进行一次变换,得到数字签名,然后利用私有密钥对数字签名进行加密后附在报文之后一同发出。
(2)接收方用发送方的公开密钥对数字签名进行解密变换,得到一个数字签名的明文。发送方的公钥是由一个可信赖的技术管理机构即验证机构(CA:certification authority)发布的。
(3)接收方将得到的明文通过单向函数进行计算,同样得到一个数字签名,再将两个数字签名进行对比,如果相同,则证明签名有效,否则无效。
这种方法使任何拥有发送方公开密钥的人都可以验证数字签名的正确性。由于发送方私有密钥的保密性,使得接收方既可以根据验证结果来拒收该报文,也能使其无法伪造报文签名及对报文进行修改,原因是数字签名是对整个报文进行的,是一组代表报文特征的定长代码,同一个人对不同的报文将产生不同的数字签名。
3.2 用对称加密算法进行数字签名
3.2.1 算法的含义
对称加密算法所用的加密密钥和解密密钥通常是相同的,即使不同也可以很容易地由其中的任意一个推导出另一个。在此算法中,加、解密双方所用的密钥都要保守秘密。由于计算速度快而广泛应用于对大量数据如文件的加密过程中,如RD4和DES。
3.2.2 签名和验证过程
Lamport发明了称为Lamport-Diffie的对称加密算法:利用一组长度是报文的比特数(n)两倍的密钥A,来产生对签名的验证信息,即随机选择2n个数B,由签名密钥对这2n个数B进行一次加密变换,得到另一组2n个数C。
(1)发送方从报文分组M的第一位开始,依次检查M的第i位,若为0时,取密钥A的第i位,若为1则取密钥A的第i+1位;直至报文全部检查完毕。所选取的n个密钥位形成了最后的签名。
(2)接收方对签名进行验证时,也是首先从第一位开始依次检查报文M,如果M的第i位为0时,它就认为签名中的第I组信息是密钥A的第i位,若为1则为密钥A的第i+1位;直至报文全部验证完毕后,就得到了n个密钥,由于接收方具有发送方的验证信息C,所以可以利用得到的n个密钥检验验证信息,从而确认报文是否是由发送方所发送[1]。
这种方法是逐位进行签名的,只要有一位被改动过,接收方就得不到正确的数字签名,因此其安全性较好,其缺点是签名太长,对报文先进行压缩再签名,可以减少签名的长度。另外,签名密钥及相应的验证信息不能重复使用,否则极不安全。
3.3 认证产品
认证产品可分两大类:一是用户认证,主要是通过单独签名访问网络资源;二是对象认证,即判定传递信息和文件的认证及其真实性。数字签名技术就主要用于信息、文件以及其他存储在网上的传输对象的认证。AT&T Government Market的Secret Agent便通过将数字签发的文档作为E-mail消息的文件附件来发表的形式,将现有客户机运行的环境E-mail系统 、Web浏览器等应用密切地结合在一起;Regnoc Software的Signature使用OLE 2.0可对Windows下的任何文本作数字签名;ViaCrypt的ViaCrypt PGP可从传递信息的应用中切割文本至Windows或Macintosh裁剪板,在那里对它进行数字签名后将它粘贴到传递信息中。
4 加密验证算法
数字签名的算法很多,应用最为广泛的三种是:Hash签名、DSS签名、RSA签名。
4.1 Hash签名
Hash签名不属于强计算密集型算法,应用较广泛。很多少量现金付款系统,如DEC的Millicent和Cyber Cash的Cyber Coin等都使用Hash签名。使用较快的算法,可以降低服务器资源的消耗,减轻中央服务器的负荷。Hash的主要局限是接收方必须持有用户密钥的副本以检验签名,因为双方都知道生成签名的密钥,较容易攻破,存在伪造签名的可能。如果中央或用户计算机中有一个被攻破,那么其安全性就受到了威胁[2]。
4.2 DSS和RSA签名
DSS和RSA采用了公钥算法,不存在Hash的局限性。RSA是最流行的一种加密标准,许多产品的内核中都有RSA的软件和类库,早在Web飞速发展之前,RSA数据安全公司就负责数字签名软件与Macintosh操作系统的集成,在Apple的协作软件Power Talk上还增加了签名拖放功能,用户只要把需要加密的数据拖到相应的图标上,就完成了电子形式的数字签名。RSA与 Microsoft、IBM、Sun和Digital都签订了许可协议,使在其生产线上加入了类似的签名特性。与DSS不同,RSA既可以用来加密数据,也可以用于身份认证。和Hash签名相比,在公钥系统中,由于生成签名的密钥只存储于用户的计算机中,安全系数大一些。
数字签名的保密性很大程度上依赖于公开密钥。数字认证是基于安全标准、协议和密码技术的电子证书,用以确立一个人或服务器的身份,它把一对用于信息加密和签名的电子密钥捆绑在一起,保证了这对密钥真正属于指定的个人和机构。数字认证由验证机构CA进行电子化发布或撤消公钥验证,信息接收方可以从CA Web站点上下载发送方的验证信息。
JSR-105 API可以完成上节所述的签名及其校验,所有这些功能都封装在了六个Java API包中。概括起来,每种签名都要有以下这几个步骤:
步骤1:加载一个XMLSignatureFactory对象,后面我们创建Reference元素对象、SignedInfo元素对象、KeyInfo元素对象、XMLSignature元素对象都要直接或者间接用到这个工厂类对象。其典型的创建语句为:
XMLSignatureFactory fac=XMLSignatureFactory.getInstance(“DOM”);
步骤2:使用前一步骤得到的工厂类对象创建Reference对象,给它指定计算摘要的算法。其典型创建语句(以下为创建Enveloping签名的做法)为:
Referenceref=fac.new Reference(“#object”,
fac.new Digest Method(Digest Method.SHA1,null));
步骤3:使用第1步得到的工厂类实例创建SignedInfo对象,给它指定正规化算法和签名的算法。其典型的创建语句为:
SignedInfo si=fac.new SignedInfo(
fac.new Canonicalization Method(
Canonicalization Method.INCLUSIVE_WITH COMMENTS, (C14NMethodParameterSpec)null),
fac.newSignature Method(Signature Method.RSASHA1,null),Collections.singleton List(ref));
步骤4:创建KeyInfo对象,给他设置签名算法的公钥以作验证之用。其典型的创建语句为:
KeyInfo
ki=kif.new KeyInfo(Collections.singleton List(kv));
步骤5:使用第1步得到的工厂类实例创建XMLSignature对象。其典型的创建语句为:
XMLSignature
signature = fac.new XMLSignature(si,ki,Collections.singleton List(obj),null,null);
步骤6:创建签名上下文对象DOMSignContext,设置签名用的私钥。其典型的创建语句为:
DOMSignContext signContext=
new DOMSignContext(kp.getPrivate(),doc);
步骤7:签名。其典型的执行语句为:
signature.sign(signContext);
对于三种签名,它们都要执行上面的步骤,所不同的是在设置签名数据来源上,只要把Reference对象构造成具有不同数据来源的情况就可以了。
签名的校验过程与签名过程类似,也有几个必经步骤。
步骤1:读入要校验的XML文件,解析,找到文件中的签名元素。
步骤2:加载一个XMLSignatureFactory对象,后面各步骤中将用到这个对象。
步骤3:创建一个DOMValidateContext对象,给他指定密钥选择器和解析得到的XML文档中的签名元素。其典型的创建语句为:
DOMValidateContext valContext=
new DOMValidateContext(new
Key ValueKeySelector(),nl.item(0));
步骤4:根据校验上下文的信息利用第2步得到的工厂对象重新安排XML签名,得到一个可以用来校验的XMLSignature对象。其典型的执行语句为:
XMLSignature
signature=fac.unmarshal XMLSignature(val-Context);
步骤5:根据当前的校验上下文信息执行核心校验。其典型的执行语句为:
Boolean core Validity=signature.validate
(valContext);
4.3 JSR-105 API的应用方案及其实现基本数字签名
XML数字签名可以实现网络环境中对特定URI的数据资源的签名,也可以对XML文档签名,还可以对放入XML文档里面的数据元素来签名,因而以XML文档来组织数据进行交换将具有较高安全可靠性。因此网络中的数据资源在被传播、扩散的过程中可以用XML数字签名与校验的方式来提高其有效性,从而提高网络数据的可信任度。
这里实现了一个应用程序对用户指定的的网上文件进行签名及校验,对现有的XML文件进行签名与校验,还可以对其他即时数据进行签名(图1)。
图1 XML数字签名的实现
盲签名:盲签名是指消息拥有者的目的是让签名人对该消息签字,但不让签名者知道消息的具体内容,签名保证在某一时刻以公证人的资格证实这个消息的存在。盲签名包括盲化消息、签名、对签名去盲、验证签名有效性几个步骤,这里只讨论一种利用XML数字签名机制实现的盲签名如何用现有的XML数字签名实现(以下假定Alice为消息拥有者,Bob为签名者)[3]。
利用XML数字签名机制实现的盲签名:Alice选择随机大数n和待签名的消息M∈Z*n,随机数r,∈Zn,计算m′=Mr mod n,将m′传给Bob。
Bob对盲信息进行XML数字签名(采用RSA-SHA1算法)并将XML签名产生的文件传给Alice。Alice将M与XML文件一并作为签名。
验证:验证者从Alice那里得到r和n,计算出盲信息m′,将它与XML文件中被签名信息比较,若相等则继续进行XML数字签名核心验证,若核心验证通过则最后对信息M的数字签名验证通过,否则签名验证失败。
验证阶段需要向消息拥有者询问盲信息产生所需的随机数r和n。因此消息拥有者每次让签名者签名完成之后要保留r和n,因而,这是受到很多限制的盲签名。由于XML数字签名签名时要对所签信息利用指定的算法转化,因而使得XML数字签名并不像普通方式下的数字签名那么单纯。要实现更加复杂的签名方式必须对XML数字签名的很多细节很清楚(图2)。
图2 XML盲签名的实现
5 数字签名的发展前景展望
生成和验证数字签名的工具需要完善,只有广泛使用SSL(安全套接层)建立安全链接的 Web浏览器,才可能频繁用到数字签名技术。基于数字签名技术来提升业务办理信息化水平,保障领导、职能部门网上签批的安全性和信息传输的完整性;能够在油田协同办公平台的流程审批、费用签批以及文件下发流转中得到应用。
[1] 张先红.数字签名原理与技术[M].北京:机械工业出版社,2004:19-28.
[2] 朱少彰.信息安全概论[M].北京:北京邮电大学出版社,2006:116-120.
[3] 袁晓宇,张其善.基于ECDSA的电子签章系统研究[J].计算机工程与设计,2005,26(5):1233-1235.
TP309.2 < class="emphasis_bold">[文献标识码]A[文章编号]
1673-5935(2012)01-0027-04
2011-11-14
朱文艳(1979-),女,山东临沂人,胜利石油管理局海洋钻井公司经济师,主要从事计算机应用开发研究。
[责任编辑] 刘 颖