![一个简单的数字签名系统的实现[文档在线提供]_第1页](http://file.renrendoc.com/FileRoot1/2019-12/6/17fb2091-b82d-4249-a27e-8e284e39fb18/17fb2091-b82d-4249-a27e-8e284e39fb181.gif)
![一个简单的数字签名系统的实现[文档在线提供]_第2页](http://file.renrendoc.com/FileRoot1/2019-12/6/17fb2091-b82d-4249-a27e-8e284e39fb18/17fb2091-b82d-4249-a27e-8e284e39fb182.gif)
![一个简单的数字签名系统的实现[文档在线提供]_第3页](http://file.renrendoc.com/FileRoot1/2019-12/6/17fb2091-b82d-4249-a27e-8e284e39fb18/17fb2091-b82d-4249-a27e-8e284e39fb183.gif)
![一个简单的数字签名系统的实现[文档在线提供]_第4页](http://file.renrendoc.com/FileRoot1/2019-12/6/17fb2091-b82d-4249-a27e-8e284e39fb18/17fb2091-b82d-4249-a27e-8e284e39fb184.gif)
![一个简单的数字签名系统的实现[文档在线提供]_第5页](http://file.renrendoc.com/FileRoot1/2019-12/6/17fb2091-b82d-4249-a27e-8e284e39fb18/17fb2091-b82d-4249-a27e-8e284e39fb185.gif)
已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
装订线一个简单的数字签名系统的实现专业班级:姓 名:指导教师:计算机科学与技术学院内 容 摘 要计算机和网络技术的发展将人类带入信息化社会,随之而来的是倍受关注的信息安全问题。现代密码学已成为信息安全技术的核心,数字签名是现代密码学主要研究的内容之一。数字签名技术在身份识别和认证、数据完整性、抗抵赖等方面具有其它技术所无法替代的作用,它在电子商务和电子政务等领域有着极广泛的应用。 本论文首先介绍了数字签名的研究背景和意义。接着系统介绍了数字签名的原理及其相关技术,包括密码技术、签名算法、单向散列函数和数字证书等。然后通过使用Windows和Java安全的相关内容实现数字签名在单机上的模拟来更加深刻地了解其过程。最后是对本论文的总结。 关键字:数字签名;Java安全;数字证书ABSTRACTHuman beings have entered into the information era with the development of computer and network technologies;Thus, the security problem of information has become the fundamental matter. The modern cryptography is the kernel technique of information security. The digital signature is one of main researches in modern cryptography, and it cannot be substituted by other techniques in information security, including authentication, data integrity, and non-repudiation. Digital signatures have many applications in electronic commerce and electronic government, etc. First, this paper introduces the research background and meaning of the digital signature. Then it introduces systematically the principle of the digital signature and relevant technology, including cryptography technology, signature algorithm, one-way Hash Function and digital certification etc. To understand the course of the digital signature more profound, it realize the simulation of the digital signature under the environment of PC by using the relevant contents of Windows and Java security. Finally, it is the summarization of the paper.Key Words: digital signature ; Java security; digital certification目 录1 前 言21.1 数字签名的研究背景及意义22 了解数字签名的原理22.1 什么是数字签名22.2 数字签名的原理32.3 数字签名的过程32.4 数字签名的作用43 数字签名相关技术介绍43.1 密码技术43.2 签名算法53.3 单向散列函数73.4 数字证书84 一个简单的数字签名系统的实现84.1 开发工具选择84.1.1 关于Java84.1.2 Java的安全机制94.2 用Java实现一个简单的数字签名系统94.2.1 创建CA94.2.2 创建代表用户A的证书134.2.3 用CA签发A的证书144.2.4 用户A发布签名了的证书174.2.5 用户B收到后验证证书184.2.6 用户A发送签名后的信息194.2.7 用户B验证签名205 总结22致谢23参考文献24一个简单的数字签名系统的实现1 前 言1.1 数字签名的研究背景及意义 我们知道,一般的书信或者文件等纸质文档是根据亲笔签名或印章来证明其真实性的。当今社会,电子文档将逐步代替纸质的文件成为信息交流的主体。证明某一个电子文件是某作者所作的有效办法是模拟普通的手写签名在电子文档上进行电子签名,即在电子化文件中添加可以标记自己的一段特征数据来实现签名。作者可以通过数字签名表明目己的身份,读者可以通过数字签名验证作者的身份。 电子邮件是互联网上最重要的应用之一,传统的电子邮件都是明文传输,并且发送方可以轻松地伪造自己的身份。随着电子邮件的应用扩展到各种信息敏感领域,如:政府间来往、商业谈判等,电子邮件的内容保密和发送方身份确认的重要性便逐步凸现出来。数字签名能很好地解决电子邮件的身份确认问题。 电子商务是互联网上发展最快的应用方向,它是借助于互联网的快速信息传输能力来完成各种商务活动,包括电子数据交换、在线交易系统、网上银行、商业增值网等。互联网是一个开放的空问,任何人都可以进入,而重要的商务信息具有敏感性和保密性,所以通常的商务信息在传输中要进行加密,同时,为了进一步防止欺骗性的篡改,数字签名是必不可少的。电子商务活动中的电子订单、电子帐单、电子收据、电子合同等电子文档都需要作数字签名以确保真实性。 网页数据是互联网上传输量最大的数据,网页已成为发布新闻、广告、招标、招聘等各种信息的重要媒体,己经开始对社会、经济、生活产生出一定的影响。这些信息来源的可靠性对相关人员来说极为重要。 随着数字化时代的到来,作为一种重要且有效的信息安全技术数字签名将应用到社会的各个领域。2 了解数字签名的原理2.1 什么是数字签名数字签名是由Diffie和Hellman在他们的著名的论文“New Direction in Cryptography”中第一次提出来的。数字签名是指附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据或变换能使数据单元的接收者确认数据单元的来源和数据的完整性,并保护数据,防止被人(如接收者)进行伪造。签名机制的本质特征是该签名只有通过签名者的私有信息才能产生,也就是说,一个签名者的签名只能唯一地由他自己产生。当收发双方发生争议时,第三方(仲裁机构)就能够根据消息上的数字签名来裁定这条消息是否确实由发送方发出,从而实现抵赖性安全服务。数字签名是认证技术中的一种,数字签名可以用来进行下列认证: (1)实体认证 在报文通信之前,采用可鉴别协议来认证通信是否在议定的通信实体之间进行。 (2)报文认证 经实体认证后,双方通信实体便可进行报文通信。为了保证数据的真实性,应对报文进行认证,即接收实体应能验证报文的来源、时间性与目的地的真实性。通常也采用数字签名等技术来实现。 (3)身份认证 用户的身份认证是许多应用系统的第一道防线,目的是防止数据被非法用户访问。除了口令控制之外,在身份认证环节采用数字签名技术无疑大大提高了访问控制的力度。2.2 数字签名的原理 手写签名一直是纸介质文件签发者的身份证明,而数字签名则是电子信息世界中信息签发者不可否认的标记。数字签名通过单向散列(HASH)函数对要传送的消息M进行处理得到消息摘要(Message Digest) H(M),然后使用消息发送者的私有密钥D对摘要加密得到签名D(H(M)。 数字签名中的HASH函数是一类特殊的散列函数,具有以下特点: (1)对接受的输入消息数据没有长度限制。 (2)对输入任何长度的消息数据能够生成固定长度的消息摘要H(M)。 (3)易于计算,对于给定的任何消息M将能够快速地得出H(M)。 (4)单向函数,即给出一HASH值h,难以计算出一特定输人M,使得h=H(M)。 (5)免冲突,又可分为弱免冲突和强免冲突两种。弱免冲突指给出一消息M1,找出一消息M2与M1相似且H(M1)=H(M2)是计算不可行的,而强免冲突指找出任意两条消息M1、M2使H(M1)=H(M2)也是计算不可行的。 满足上述条件的HASH函数作用于一长文档上时,可以产生该文档的一个“数字指纹”(Digital Fingerprint),可以用这个结果来判断该文档没有被修改过。统计表明,如果消息摘要长度为128位时,则任意两个消息M1、M2具有完全相同摘要的概率为10负24次方,即近于零的重复概率。如果取H(M)为384位或512位时,重复概率则更小。我们知道,如果消息M1与M2相同,则有H(M1)= H(M2),改变M1或M2中的任意一位,其结果将导致H(M1)与H(M2)中有一半左右对应位的值都不相同。通过数字签名的发散特性就可以很容易地发现消息是否被篡改。2.3 数字签名的过程数字签名的流程如下:(1)采用散列函数对原始报文进行运算,得到一个固定长度的数字串,即消息摘要。不同的报文所得到的消息摘要各不相同。但对相同的报文,它的消息摘要却是唯一的。在数学上保证,只要改动任何一位,重新计算出来的摘要值就会与原先的值不相符,这样就保证了报文的不可更改性。 (2)发送方生成消息摘要,用自己的私存密钥对摘要进行加密来形成发送方的数字签名。 (3)这个数字签名将作为报文的附件和报文一起发给接收方。 (4)接收方首先从接收到的原始报文中用同样的算法计算出新的消息摘要,再用发送方的公开密钥对报文附件的数字签名进行解密,比较两个消息摘要。如果相同,接收方就能确认数字签名是发送方的,否则就可断定收到的报文是伪造的或者中途被篡改了。例如:假设Alice要发送一份带有自己签名的消息M给别人时,她首先对消息M通过HASH函数进行消息摘要得到H(M),再用自己的私有密钥Da对该值加密,得到对M的签名Sa(M)后,有Sa(M)=Da(H(M)。接收方收到消息M及签名Sa(M)后,先计算H(M),然后使用Alice的公开密钥Ea解密签名,如消息是完整的,应有H(M)=Ea(Sa(M)=Ea(Da(H(M)=H(M)。2.4 数字签名的作用数字签名提供了一种安全的保障数据完整性和真实性的机制,可以检验数据从数据源到目的地的传输过程中是否被篡改以及数据的真实来源。因此,它能够防止下面所示的四类问题: (1)否认或抵赖:发送(接收)者事后不承认已发送(或接收)过这样一份文件。 (2)伪造:接收者伪造一份来自发送者的文件。 (3)篡改:接收者对接收者的信息进行部分篡改。 (4)冒充:网中的某一用户冒充另一用户作为发送者或接收者。3 数字签名相关技术介绍3.1 密码技术信息安全技术是一门综合性学科,它涉及信息论、计算机科学和密码学等多方面知识,它的主要任务是研究计算机系统和通信网络内信息的保护方法以实现系统内信息的安全、保密、真实和完整。其中,信息安全的核心是密码技术。 随着计算机网络不断渗透到各个领域,密码学的应用也随之扩大。数字签名、身份鉴别等都是由密码学派生出来的新技术和应用。在计算机上实现的数据加密,其加密或解密变换是由密钥控制实现的。密钥(Keyword)是用户按照一种密码体制随机选取,它通常是一随机字符串,是控制明文和密文变换的唯一参数。根据密钥类型不同将现代密码技术分为两类:一类是对称加密(秘密钥匙加密)系统,另一类是公开密钥加密(非对称加密)系统。 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。 对称密码系统的安全性依赖于以下两个因素。第一,加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的;第二,加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性,而需要保证密钥的秘密性。对称加密系统的算法实现速度极快,从高级加密标准(AES)候选算法的测试结果看,软件实现的速度都达到了每秒数兆或数十兆比特。对称密码系统的这些特点使其有着广泛的应用。因为算法不需要保密,所以制造商可以开发出低成本的芯片以实现数据加密。这些芯片有着广泛的应用,适合于大规模生产。 对称加密系统最大的问题是密钥的分发和管理非常复杂、代价高昂。比如对于具有n个用户的网络,需要n(n1)/2个密钥,在用户群不是很大的情况下,对称加密系统是有效的。但是对于大型网络,当用户群很大,分布很广时,密钥的分配和保存就成了大问题。对称加密算法另一个缺点是不能实现数字签名。 公开密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。由于加密钥匙是公开的,密钥的分配和管理就很简单,比如对于具有n个用户的网络,仅需要2n个密钥。公开密钥加密系统还能够很容易地实现数字签名。因此,最适合于电子商务应用需要。在实际应用中,公开密钥加密系统并没有完全取代对称密钥加密系统,这是因为公开密钥加密系统是基于尖端的数学难题,计算非常复杂,它的安全性更高,但它实现速度却远赶不上对称密钥加密系统。在实际应用中可利用二者的各自优点,采用对称加密系统加密文件,采用公开密钥加密系统加密“加密文件”的密钥(会话密钥),这就是混合加密系统,它较好地解决了运算速度问题和密钥分配管理问题。因此,公钥密码体制通常被用来加密关键性的、核心的机密数据,而对称密码体制通常被用来加密大量的数据。3.2 签名算法 数字签名算法有映象式和印记式两类。由于印记式的签名速度和验证速度比映象式快得多,因此印记式数字签名算法更为实用。下面对几种实用的印记式数字签名算法及其应用进行论述。 (1)RSA数字签名算法 产生签名与验证参数: Stepl 签名人A选择两个大素数p、q,计算n=pq及fi(n) = (p-1)(q-1); Step2 寻找e、d属于Zn使满足(e,fi(n)=1及ed=1(mod fi(n); Step3 公开验证参数n,e, A保存p,q,d,fi(n)作为秘密的签名参数; Step4 选用一通用的散列函数h( )。 签名算法: Stepl A将需签名的文件m(含接收人、内容、签名人、日期等)编码后映射成h(m); Step2 计算c1=(h(m)的d次方 mod p, c2=(h(m)的d次方mod q及印记Sa(m)=(c1q1q+c2p1p) mod n,其中q1q=1 mod p,p1p=1 mod q; Step3 将m, Sa(m)发送至文件接收人B或仲裁人T(A、 B、T的含义下同)。 验证算法: B(或T)检验(Sa(m)的e次方=h(m) mod n是否成立,若成立则接收此文件及签名,否则拒绝接收或宣布无效。 (2)Rabin数字签名算法 产生签名与验证参数: Step1 A选择两个大素数p、q,并计算n=pq; Step2 公开验证参数n,A保存p,q作为秘密的签名参数; Step3 选用一通用的散列函数h( )。 签名算法: Step1 A将需签名的文件m编码后映射成h(m),选取a=bh(m)使满足(a/p)=( b/q)=1, b属于1,-1,2,-2,其中(/)为Legendre符号; Step2 计算c1=+a的(p+1)/4次方mod p,c2=+a的(q+1)/4次方mod q及印记Sa(m)=(c1q1q+c2p1p) mod n。其中c1、c2固定一种取法,p1、p2满足q1q=1 mod p,p1p= 1 mod q; Step3 将m,Sa(m),b发送至B或T。 验证算法: B(或T)检验(Sa(m)的二次方=bh(m) mod n是否成立,若成立则接收此文件及签名,否则拒绝接收或宣布无效。(3)DSS数字签名算法 产生签名与验证参数: Stepl A选择一个大素数p, p-1应具有大素数因子q,选择一个g属于Zp使g的次数为q,再选择一个x属于Zp,并计算y=g的x次方mod p; Step2 公开验证参数p, q, g, y), A保存x作为秘密的签名参数; Step3 选用一通用的散列函数h( )。 签名算法: Stepl A将需签名的文件m编码后映射成h(m),任意选择k属于Zp,计算k的-1次方使k的-1次方k=1 mod q; Step2 计算r=(g的k次方mod p) mod q及s=k的-1次方(h(m)+xr) mod q; Step3 将m, r, s)发送至B或T。 验证算法: Stepl B(或T)先计算u=h(m)s的-1次方 mod q及v=rs的-1 次方mod q; Sten2 检验(g的u次方y的v次方 mod p) mod q=r是否成立,若成立则接收此文件及签名,否则拒绝接收或宣布无效。 签名算法的比较:(1)安全性 由于求解mod n (n = pq)的平方根问题以高概率等价于n的整数分解问题(Rabin定理),所以Rabin算法的安全性与RSA大体相当。DSS的安全性是建立在求离散对数问题上,至今虽未证明破解DSS与求解q阶乘法群的离散对数等价,但也未找到其他可绕开求离散对数的解法。整数分解与求离散对数的计算复杂度是近似的,因而上述三种签名算法的安全性大体相当。 (2)参数选择DSS算法参数的选择比前两种算法要容易。RSA算法出于安全性考虑,对参数p、q的选择有一些较严格的要求,如p-kq(k为较小自然数)应足够大、gcd(p-1,q-1)应比较小、p+1和q+1都应至少含有一个充分大的素数因子等;Rabin算法对参数p、q的要求与RSA算法大体相同,但为了达到与RSA相当的安全性,其参数p、q应比RSA算法中稍大;DSS算法安全性的关键参数是q,可比前两种算法中的n值略小,但应远大于单独的p和q,其他参数虽多但都不难选取。 (3)参数共享性 RSA算法和Rabin算法都无法共享参数:因为DSS算法可以对k有不同选择,所以可以共享参数p、q、g,参数共享时至今尚未发现用户之间可以互相伤害的途径。 (4)签名速度 DSS算法签名速度较慢。RSA算法和Rabin算法签名时耗费时间的主要部分都是mod p、mod q的指数运算,这两种算法签名速度大体相同:DSS算法签名时mod p(pq)的指数运算所耗费的时间要比前两种算法长。(5)验证速度 DSS算法验证速度较慢。Rabin算法验证时需进行一次mod n的平方运算,而RSA算法验证时需进行一次mod n的e次指数运算,因此RSA算法比Rabin算法要稍慢;DSS算法验证时需要进行2次mod p的指数运算,因此DSS算法验证速度较前两种算法慢,而Rabin算法验证速度最快。 (6)签名印记长度 DSS算法签名印记较长。RSA算法和Rabin算法的签名印记都是一个mod n数Sa(m),只是Rabin算法多了1个很小的数b;DSS算法的签名印记是两个mod q数r、s,比起前两种算法的印记Sa(m)要长一些。 (7)签名印记的重复性 DSS算法签名印记具有不重复特性。文件m和h(m)完全相同时,用DSS算法签名时因每次可以选择不同的k产生签名印记,故DSS算法的签名印记每次可以不同;RSA算法和Rabin算法无此特性,但可以对算法作适当改进,以增加1个随机数加长传送的数据为代价,使算法具有签名印记不重复的特性。 Java类库中已包含了实现一些著名签名算法(如RSA、DSA等)的类库,可以直接使用,这也是算法公开的好处。3.3 单向散列函数密码学中使用的单向散列函数将任意长度的消息压缩到某一固定长度的消息摘要。单向散列函数又称为单向Hash函数,它不是加密算法,却在密码学中有着广泛的应用,与各种加密算法有着密切的关系。它的模型为:=()其中,是待处理的明文,可以为任意长度;是单向散列函数,是生成的报文摘要,它具有固定的长度,并且和的长度无关。其中具有以下的单向性质:(1)给定和,很容易计算;(2)给定和,很难计算,甚至得不到的任何消息;(3)给定,要找两个不同的1和2,使得(1)=(2)在计算上是不可行的。根据单向散列函数的安全水平,可以将单向散列函数分成两类:强碰撞自由的单向散列函数和弱碰撞自由的单向散列函数。上面描述的是强碰撞自由的单向散列函数的性质。如果将第(3)条改为:给定和一个已知的消息,找另外一个不同的消息1,使得()=(1)在计算上是不可行的,就叫做弱碰撞自由的单向散列函数。显然强碰撞自由的单向散列函数比弱碰撞自由的单向散列函数安全性要高。因为弱碰撞自由的单向散列函数随着重复使用次数的增加安全性逐渐降低,强碰撞自由的单向散列函数则不会因其重复使用而降低安全性。因此在实际中要求使用强碰撞自由的单向散列函数。除此之外,在实际应用中还要求单向散列函数具有如下特点:(1)单向散列函数能够处理任意长度的明文(至少是在实际应用中可能碰到的长度的明文),其生成的消息摘要数据块长度具有固定的大小,而且,对同一个消息反复执行该函数总是得到相同的信息摘要。(2)单向散列函数生成的信息摘要是不可预见的,消息摘要看起来和原始的数据没有任何的关系。而且,原始数据的任何微小变化都会对生成的信息摘要产生很大的影响。(3)具有不可逆性,即通过生成的报文摘要得到原始数据的任何信息在计算上是完全不可行的。单向散列函数在密码学中有着非常广泛的应用,它被广泛地应用于数字签名、消息的完整性鉴别、消息的起源认证等,另外也和各种密码算法一起构成混合密码系统。3.4 数字证书数字证书是驾驶执照、护照及会员卡等类似证件的电子对应物。您可以通过出示电子数字证书等来证明您的身份或访问在线信息或使用服务的权力。数字证书将身份绑定到一对可以用来加密和签名数字信息的电子密钥。数字证书能够验证一个人使用给定密钥的权利。这有助于防止有人利用假密钥冒充其他用户。数字证书与加密一起使用,可以提供一个更加完整的解决方案,确保交易中各方的身份。数字证书通常简称为证书,它包括一个公开密钥、拥有对应私有密钥的实体身份以及证书管理机构CA(Certification Authority)对这些内容的数字签名。CA的签名可以确保证书内容的完整性和真实性。证书的格式一般遵循国际电信同盟ITU(International Telecommunications Union) 制订的 X.509标准,其具体字段及说明如表3.1所示:表3.1 X.509数字证书字段名及说明Version版本号Serial number证书唯一序列号Signature algorithm ID签名使用算法Issuer nameCA名Validity period证书生效日期和失效日期Subject(user) name持证人姓名Subject public key information持证人公开密钥信息Issuer unique identifierCA唯一标识(仅在v2、v3中)Subject unique identifier持证人唯一标识(仅在v2、v3中)Extensions扩充内容(仅在v3中)Signature on the above fieldCA对证书的签名采用数字证书能够实现以下两点:(1)保证信息是由签名者自己签发的,签名者不能否认或难以否认。(2)保证信息自签发后到收到为止未曾做过任何修改,签发的信息是真实信息。4 一个简单的数字签名系统的实现4.1 开发工具选择4.1.1 关于Java 1995年,美国Sun Microsystems公司正式向IT业界推出了Java语言,该语言具有安全、跨平台、面向对象、简单、适用于网络等显著特点,当时以web为主要形式的互联网正在迅猛发展,Java语言的出现迅速引起所有程序员和软件公司的极大关注,程序员们纷纷尝试用Java语言编写网络应用程序,并利用网络把程序发布到世界各地进行运行。包括IBM、Oracle、微软、Nets cape、Apple、SGI等大公司纷纷与Sun Microsystems公司签订合同,授权使用Java平台技术。微软公司总裁比尔盖茨先生在经过研究后认为“Java语言是长时间以来最卓越的程序设计语言”。目前,Java语言已经成为最流行的网络编程语言,截止到2001年中,全世界大约有310万Java程序员,许多大学纷纷开设Java课程,Java正逐步成为世界上程序员最多的编程语言。在经历了以大型机为代表的集中计算模式和以PC机为代表的分散计算模式之后,互联网的出现使得计算模式进入了网络计算时代。网络计算模式的一个特点是计算机是异构的,即计算机的类型和操作系统是不一样的,例如SUN工作站的硬件是SPARC体系,软件是UNIX中的Solaris操作系统,而PC机的硬件是INTEL体系,操作系统是windows或者是Linux,因此相应的编程语言基本上只是适用于单机系统,例如COBOL、FORTRAN、C、C等等;网络计算模式的另一个特点是代码可以通过网络在各种计算机上进行迁移,这就迫切需要一种跨平台的编程语言,使得用它编写的程序能够在网络中的各种计算机上能够正常运行,Java就是在这种需求下应运而生的。正是因为Java语言符合了互联网时代的发展要求,才使它获得了巨大的成功。Java语言最重要的特点是从设计伊始它就是一种独立于硬件设备的语言。Java程序可以不加修改地运行在任何支持Java 的计算机上。所以,用Java编制软件还有一个显而易见的优势,就是整个软件、无须重新修改和编译就可在NT、Unix、Linux等支持Java的平台上运行。4.1.2 Java的安全机制Java提供了几种安全机制,其中两种主要的机制是安全管理器和Java类文件认证器。安全管理器是安全的实施者,它是一个可扩展类,提供加在应用程序和特写系统上的安全措施。它实现Java虚拟机的安全策略。安全管理器建立Java程序的名空 间,限制对网络、 本地文件系统和程序其它部分的访问(程序的名空间是由操作系统或这里的Java虚拟机所 建立的程序边界,该程序无法访问名空间以外的资源)。Java认证器在.class文件运行前完成该文件的安全检查,确保Java字节码符合Java 虚拟机规范。Java平台通过使用认证器查看类文件的句法和词法正确性,检查版本及API符合性等,保证病毒和其它恶意程序不会侵犯本地系统。认证器包括四个阶段的操作:类文件认证、类型系统认证、字节码认证和运行时类型与访问检查。此外,认证器在检查期间还能识别算法操作的上溢和下溢等其他可能发生在运行期间的程序错误。4.2 用Java实现一个简单的数字签名系统 我们用Java来实现一个简单的数字签名系统。用户A要与用户B进行通信,需要先把自己的公钥发送给用户B,但此公钥未得到证明,也就是说用户A的身份未得到证实,因此用户A首先要创建一个代表自己身份的证书,由认证中心签名后发布数字证书。以后用户A就可以用其私钥对所发送的信息进行签名了。但我们只是为了简单地模拟一下这个过程,而不需要真的去认证证书,因此首先模拟创建一个CA。4.2.1 创建CA(1)创建代表CA的证书 使用J2SDK提供的keytool工具用RSA算法和在指定的密钥库mykeystore中创建公钥/私钥对和证书。 在命令行中输入“keytool -genkey -alias CA -keyalg RSA -keysize 1024 -keystore mykeystore -validity 4000”将使用RSA算法生成1024位的公钥/私钥对及整数,密钥长度为1024位,证书有效期为4000天。使用的密钥库为mykeystore文件。如图4.1所示。图4.1 创建密钥库mykeystore由于当前目录下没有mykeystore文件,因此以上操作将在当前目录建立文件名为mykeystore的文件。(2)将数字证书导出到文件使用J2SDK提供的keytool工具将证书从密钥库导出为编码过的文件。 使用keytool的-export参数可以将别名指定的证书导出到文件,文件名通过-file参数指定。如图4.2所示。 图4.2则当前目录下将增加一个文件CA.cer,其内容是编码过的,可以在屏幕上显示、拷贝或打印。如图4.3所示。 图4.3 编码后的证书内容(3)安装CA的证书现在存在一个CA, 全名是“CN=Gao Dong, OU=CS, O=DLMU, L=ZB, ST=Shanghai, C=CN”,简称“CA”。在计算机中的身份以证书CA.cer来代表, 随证书一起创建的还有和证书中的公钥相对应的私钥,全部保存在密钥库mykeystore中,别名为CA。该证书的文本如图4所示。可以通过电子邮件、网页或盖有公章的正式文件确定如图4所示的文件CA.cer是权威的,在部门或单位内部是值得信任的,并可将其认证指纹(即消息摘要,拇印)公布。用户得到CA自身的证书后,可以将证书安装在计算机操作系统中,以便计算机自动检验其他证书是否值得信任。双击导出的证书文件CA.cer,出现图4.5所示的证书窗口:图4.5 CA的证书点击窗口中的“安装证书”按钮,出现图4.6所示的“证书导入向导”窗口。 图4.6 “证书导入向导”窗口点击其中的“下一步”按钮,出现图4.7所示的“证书存储”的窗口。图4.7 “证书存储”的窗口不妨使用该窗口的默认选择:“根据证书类型,自动选择证书存储区”,继续点击其中的“下一步”按钮,出现图4.8所示的“正在完成证书导入向导”的提示。 图4.8 “正在完成证书导入向导”的提示该窗口显示证书将被存储到“受信任的根目录证书发行机构”区域,这样,以后操作系统将自动信任由CA.cer证书签发的其他证书。点击其中的“完成”按钮,出现最后的确认窗口,如图4.9所示。图4.9 最后核实证书的窗口 如果怀疑该证书是否正确,可以再核实一遍该窗口中显示的拇印,确认后点击其中的“是”按钮,最后提示导入成功。 至此,将代表CA“Gao Dong”的证书文件CA.cer安装在机器中,以便在计算机中确立CA.cer证书的权威性。4.2.2 创建代表用户A的证书此操作与创建CA证书相似,在当前目录生成一个密钥库文件Akeystore。在命令行中输入“keytool -genkey -alias A -keyalg RSA -keysize 1024 -keystore Akeystore -validity 3500”将使用RSA算法生成1024位的公钥/私钥对及整数,密钥长度为1024位,证书有效期为3500天。如图4.10所示。图4.10 创建密钥库Akeystore 将此密钥库中的A条目对应的证书导出到文件A.cer中。如图4.11所示。 图4.11 该证书内容如图4.12所示:图4.12 证书内容 4.2.3 用CA签发A的证书CA签发数字证书应该使用自己的私钥,CA自身的证书中并不包含私钥信息,因此需从密钥库mykeystore中提取。此外,由于被签发的证书还需要知道CA的名字,这可以从CA的证书中获得。签发证书实际上是创建了一个新的证书,使用J2SDK内部使用的sun.security.x509包中的X509CertImpl类来创建新的证书,该类的构造器中传入有关新的证书各种信息,主要信息来自被签发的A.cer,只是对某些必须修改的信息如序列号、有效期、签发者等进行重新设置。最后使用X509CertImpl类的sign( )方法用CA的私钥进行签名。可以打印新的证书的信息,也可以将其保存在密钥库中。完整代码如下:import java.io.*;import java.security.*;import java.security.cert.*;import java.util.*;import java.math.*;import sun.security.x509.*;public class SignCert public static void main(String args ) throws Exception char storepass=000000.toCharArray( ); char cakeypass=000000.toCharArray( ); String alias=CA; String name=mykeystore; /从密钥库读取CA的证书 FileInputStream in=new FileInputStream(name); KeyStore ks=KeyStore.getInstance(JKS); ks.load(in,storepass); java.security.cert.Certificate c1=ks.getCertificate(alias); /从密钥库读取CA的私钥PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass);in.close(); /从CA的证书中提取签发者信息 byte encod1=c1.getEncoded(); X509CertImpl cimp1=new X509CertImpl(encod1); X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+.+X509CertImpl.INFO); X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+.+CertificateIssuerName.DN_NAME); /获取待签发的证书 CertificateFactory cf=CertificateFactory.getInstance(X.509); FileInputStream in2=new FileInputStream(args0); java.security.cert.Certificate c2=cf.generateCertificate(in2);in2.close(); /从待签发的证书提取证书信息byte encod2=c2.getEncoded(); X509CertImpl cimp2=new X509CertImpl(encod2); X509CertInfo cinfo2=(X509CertInfo)cimp2.get( X509CertImpl.NAME+.+X509CertImpl.INFO); /设置新证书有效期 Date begindate =new Date();/3000 day Date enddate =new Date(begindate.getTime()+3000*24*60*60*1000L); CertificateValidity cv=new CertificateValidity(begindate,enddate); cinfo2.set(X509CertInfo.VALIDITY,cv); /设置新证书序列号 int sn=(int)(begindate.getTime()/1000); CertificateSerialNumber csn=new CertificateSerialNumber(sn); cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn); /设置新证书签发者 cinfo2.set(X509CertInfo.ISSUER+.+CertificateIssuerName.DN_NAME,issuer); /设置新证书算法信息 AlgorithmId algorithm = new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid); cinfo2.set(CertificateAlgorithmId.NAME+.+CertificateAlgorithmId.ALGORITHM, algorithm); /创建证书并使用CA的私钥对其签名 X509CertImpl newcert=new X509CertImpl(cinfo2); newcert.sign(caprk,MD5WithRSA); System.out.println(newcert); /将新证书存入密钥库 ks.setCertificateEntry(A_signed, newcert) ; FileOutputStream out=new FileOutputStream(newstore); ks.store(out,newpass.toCharArray(); out.close(); 程序中添加了打印语句将新创建的证书的相关信息在屏幕上打印出来。在当前目录下存放密钥库mykeystore,其中包含了CA的证书。当前目录下同时有证书A.cer,签发之前假定我们已经核实过A.cer中包含的信息,确认无误,接下来我们开始用CA对该证书进行签名。输入“java SignCert A.cer 1.txt”运行程序,则程序将从密钥库中取出CA的私钥对A.cer证书进行签名,输出结果已重定向到文件1.txt中,打开1.txt文件,可以看到如图4.13有关新的证书的信息。 图4.13 新证书的内容从中可以看出签发者已经由原先的“CN=A, OU=CS, O=DLMU, L=DL, ST=LN, C=CN”(自己给自己签名),变为了:“CN=Gao Dong, OU=CS, O=DLMU, L=DL, ST=LN, C=CN”(CA的签名)。有效期也设置成了3000天。新的证书同时由密钥保存在了密钥库newstore中。4.2.4 用户A发布签名了的证书将新的证书A_signed从密钥库newstore中导出,如图4.14。图4.14这样签名后的数字证书将被导出到文件A_signed.cer,可以将该文件E-mail给对方,也可以用Windows的记事本打开该证书文件,将其编码内容通过E-mail或Web等方式发布。其他人只要将其文本粘贴下来,保存到文件名以“.cer”为后缀的文本文件中即可。该证书内容如图4.15所示:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年日本军购协议书
- 做好职业技能培训的策略及实施路径
- 2025年学生纠纷的协议书
- 2025年拆锅炉安全协议书
- (2025年标准)桃子妈忠诚协议书
- 煤泥综合处置再利用工程可行性分析报告
- 金属钼酸生产线工程可行性研究报告
- (2025年标准)无责调解协议书
- 2025年家具养护承包协议书
- (2025年标准)物业树木领养协议书
- 2025年电梯安全管理员试题及答案
- 2025年赛码考试题库
- 2025年餐饮经理人岗位胜任力评估试题及答案
- 中石化班组管理办法
- 肿瘤患者健康宣教
- 教师信息技术能力提升培训
- 对便秘患者的健康教育
- 甲状腺癌病例分享
- 文化艺术活动策划与执行方案
- 意识障碍护理评估要点
- 浙江省湖州市2024-2025学年高一下学期期末考试数学试卷
评论
0/150
提交评论