摘 要:随着计算机网络技术的迅猛发展和网络系统的深入应用,信息网络的社会化和国际化使人类社会的生活方式发生重大变化,网络已经成为今天的各项社会生活 赖以存在的基础设施,电子商务成为随之而形成的商务活动的新模式,而Java在网络安全方面有全套关于加密、数字签名的类,以确保文件在网络传输安全。本文介绍了Java中利用Diffie-Helman、MD5等加密算法实现对文件或消息的加密和解密过程。
关键词:Java;加密;MD5;Diffie-Helman
1.引言
随着计算机网络技术的迅猛发展和网络系统的深入应用,信息网络的社会化和国际化使人类社会的生活方式发生重大变化,网络已经成为今天的各项社会生活赖以存在的基础设施,电子商务成为随之而形成的商务活动的新模式。但是,网络社会越发达,它遭受攻击的危险性也越大。如果想保证商务活动安全稳定的进行,保证网络安全是最关键的问题。网络安全不仅从一般性的防卫变成了一种非常普通的防范,而且还从一种专门的领域变得无处不在。
网络安全用于保证信息在处理、存储或传递过程中的可靠性和权成性。早期这项安全技术大部分是基于军事上的需求,到了90年代,Internet和电子商务得到广泛应用,尤其是Java技术的发展才使得网络安全在商业上广受重视并成为主流技术 [1]。
2. Java加密体系结构
2.1 Java加密体系结构的设计原理
Java加密体系结构(JCA)是根据以下目标设计的:
(1)实现的独立性和互操作性;
(2)算法的独立性和可扩展性。
实现的独立性和算法独立性是互补的。其目的是让API用户能用密码学的概念(如数字签名和报文摘要),但又不必关心这些概念的实现甚至这些概念所用算法的实现。当不可能完全实现算法独立性时,JCA将为开发人员提供标准的特定算法API。当实现方法的独立性不可能实现时,JCA将让开发人员指明所要求的特定实现方法。
算法独立性是通过定义密码“引擎”(服务) 的类型以及定义提供这些密码引擎功能的类来实现的。提供加密算法的应用程序接口的类称为engine(引擎)类,例如MessageDigest类、Signature类和KeyFactory类。
实现的独立性是通过使用基于 “提供者” 的体系结构而实现的。密码服务提供者(简称“提供者”)指的是用于实现一种或多种密码服务的一个包或一组包,如数字签名算法、报文摘要算法及密钥交换服务。应用程序可以只是简单地请求某类对象(如签名对象)实现某种服务(如DSA数字签名算法),并从任一安装好的提供者上获取实现方法。反之,必要时程序可从某个特定的提供者请求实现方法。
实现的互操作性指的是各种实现方法可在一起工作, 使用彼此的密钥或校验彼此的签名。这意味着对于相同的算法,由一个提供者生成的密钥可被另一个提供者使用,而一个提供者生成的签名也可由另一个提供者来校验。算法的可扩展性指的是可以很容易地添加那些能适应engine类的新算法[2]。
2.2 Java加密体系结构
密码服务总是与某个特定的算法或类型相关联,它或者提供密码运算(如数字签名或报文摘要中的运算),生成或提供密码运算所需要的密码信息(密钥或参数),或者生成安全封装的密钥(这些密钥可用于密码运算中)的数据对象。例如,Signature 和 KeyFactory 类就是两个引擎类。Signature 类提供对数字签名算法功能的访问。DSA KeyFactory 以一种可供 DSA Signature 对象的 initSign或initVerify 方法使用的格式提供 DSA 私钥或公钥(从其编码或透明规范中)。
Java加密体系结构包含了JDK 1.2 安全包中与密码有关的类,包括引擎类。API用户可通过请求和利用引擎类的实例来执行相应的运算。
一个引擎类提供某类密码服务功能的接口(与特定的密码算法无关)。它定义“应用程序接口” (API) 方法,以使应用程序能够访问所提供的某类密码服务。实际的实现方法(由一个或多个提供者提供)即是那些指定算法的实现。例如,Signature 引擎类将提供对数字签名算法功能的访问。SignatureSpi子类中(参见下一段落)所提供的实际实现方法将是某个指定签名算法(如带有 DSA 的 SHA1、带有 RSA 的 SHA1 或带有RSA 的MD5)的实现[3]。
3. Java实现加密验证过程
3.1对消息或文件加密
消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文消息的话,就要使用其他的算法,要确保机密性,我们需要使用私有钥密码来交换私有消息。使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security.Key),然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有:DES(实际密钥只用到56位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,私钥加密需要一个共享的密钥,那么如何传递密钥。在网络的传输过程中,直接传递的话很容易被侦听到,那么使用公有密钥加密。公钥加密也叫非对称加密,非对称算法使用一对密钥对,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开。但是速度很慢(比私钥加密慢100到1000倍),公钥的主要算法有DSA,Diffie-Helman等,jdk1.6种提供了对RSA的支持,是一个改进的地方。它们分别称为公开密钥(Public key)和秘密密钥(Private key)。因为在网络中传输私有密钥很容易被侦听,但是也必须采用私有密钥来解密,这种情况下,在本地产生密钥对,传输公有密钥给另一个用户端,同时此用户端也产生一对密钥对,比校两个公有密钥是否相同,在相同的情况下才用本地私有密钥解密[4]。
3.2利用MD5加密消息实现数字签名
我们知道MD5就是把一个任意长度的字节串变换成一定长的大整数,而且此大整数具有不重复性和不可逆性,以保证签名的唯一性,那么就可以用MD5指定生成字符串。把消息摘要用MD5生成一串字符之后,同时把消息搞要和生成密文摘要传给用户端, 用户端又把消息摘要再进行生成一次,把两次生成的字符串是否相同完成数字签名。
4.总结
本文有两个关于加密算法应用的类,分别是myDigest(MD5加密)、public_signtrue(非对称加密)的实现,完整的体现了加密和解密过程。不管在网络中还单机中对于加密算法的应用无处不在,以确保数
据的安全。下面代码是public_signtrue类的应用。
byte.沈阳师范大学学报. 2009(1):75-76