消息摘要算法在Java Web系统中的应用
2012-04-13陈坤定
陈坤定
(闽西职业技术学院 计算机系,福建 龙岩 364021)
0 引言
Java Web作为目前构建web应用系统、支持动态处理的程序设计技术,在市场上已经表现出非常强大的生命力。利用这种技术可以建立先进、安全和跨平台的动态网站,很多企业也都采用J2EE来构建企业门户网站及B/S系统。无论是动态网站还是B/S系统,一般都有登录模块,而登录模块中包含用户名和密码等用户敏感内容。很多系统登录模块在设计时都是将密码以明文的形式进行存储,然后在此基础上提供取回密码的服务,这很容易使用户的隐密信息被泄漏出去。而且将密码以明文的方式存储在数据库中,将使拥有数据库访问权限的人可以轻而易举的获取用户密码,并假借用户名称进行操作,这势必给用户造成很大的损失。所以将用户信息存储在数据库的时候,很有必要对这些信息进行加密处理,使具有数据库操作权限的人无法获得用户的具体信息,以避免给用户造成损失。在众多的加密方法中,消息摘要算法中的MD5、SHA等虽然已经被王小云教授破解,已不是很安全,但是对于一般的用户和公司,用算法来破解消息摘要算法还是很困难的。因此,它仍然还是较为优秀安全的加密算法[1]。
消息摘要算法是将任意长度的“字节串”变换成一个固定位数的大整数,并且是一个不可逆的字符串变换算法。消息摘要算法的典型应用是对一段字节串产生指纹,以防止消息在传输过程中被“篡改”,从而保证数据的完整性[2]。
另外,它还广泛应用在加密和解密技术上,在Java Web系统中,可以用来加密敏感的账号或密码等信息。
1 用户注册过程
用户注册时,有些系统只对密码而没有对用户名进行摘要处理,这样容易使一些有不良企图的、能够访问数据库企业内部员工,将能很轻松地利用同样的摘要算法生成新密码,对用户的旧密码进行覆盖,然后用新的密码登录冒充用户的身份做一些有损用户利益的操作。而且有的人在覆盖密码以前,先把原来的旧密码保存起来,等操作完成后,再将旧密码存回数据库,这样用户比较难以发现,即使用户发现进行投诉后,企业也很难找到任何的蛛丝马迹。所以为更好的提高安全性,一并将用户名、密码等信息进行摘要处理,然后把摘要信息存入数据库中,将是一个正确的选择。其注册过程见序列图1。
2 用户登录过程
登录时,对输入的用户名、密码,即明文进行摘要处理(仅限于明文到密文的转换,摘要算法不可逆,不能从密文转换成明文),将处理的摘要信息通过数据库进行查询。登录过程见序列图2。
图1 用户注册过程
图2 用户登录过程
摘要算法在Java Web中的具体实现可以通过java.security包的MessageDigest类或者Apache commons的DigestUtils工具类来完成。第一种方法是由SUN公司提供的面向底层的算法,缺少相应的进制转换实现,无法将其字节数组形式的摘要信息转为十六进制字符串,使用不是很方便。第二种方法支持多种形式的支持,支持十六进制形式的摘要信息,使用较为方便[2]。
2.1 第一种方法
在JAVA6中使用摘要算法比较简单,只要导入java.security包使用MessageDigetst类生成一个JavaBean就可以在JavaWeb系统中使用。
具体过程:
(1)编写JavaBean
其中方法MDEncrypt()是将字符串in进行消息摘要处理,并将得到的十六进制字符---信息摘要通过另一个方法byteToString()转换为字符串。
(2)将MDEncoder部署到系统中。
(3)使用摘要加密功能。
①调用MDEncoder.MDEncrypt()对初始注册的用户名和密码进行摘要加密并保存到数据库中。
②用户登录时,将用户名和密码进行摘要加密,然后将加密后的信息摘要和数据库提取的数据进行对比。
在JSP系统中的具体参考代码如下:
2.2 第二种实现方式
可以利用Apache commons的DigestUtils工具类,它实际上对sun提供的摘要算法实现做了一个简单的包装,但却为使用该算法提供了方便。DigestUtils类位于org.apache.commons.codec.digest包中,因此,应首先下载commons-codec-1.x.jar包,并将其导入JSP系统中,然后将上述JSP页面稍加修改即可[3]。
3 结语
通过消息摘要算法在Java Web的应用,可以极大的提高信息安全性,但消息摘要算法有其局限性,因为其是不可逆的,密方不能转换为明文。所以,它一般使用在注册登录、消息传递等只需进行数据安整性验证的场合,而在一些需要把密文转换成明文的地方则不适合使用消息摘要算法。
[1]梁栋.Java加密解与解密的艺术[M].北京:机械工业出版社,2010.
[2]王常吉.信息与网络安全实验教程[M].北京:清华大学出版社,2007.
[3]何扬.使用MD5对存放在数据库中用户密码进行保护[EB/OL].(2011-11-27)[2012-02-13].http://www.blogjava.net/heyang/archive/2012/02/13/339188.html.