在JSP程序中,用MD5算法的常用之处就是对用户登录密码的加密和验证了。在数据库中,存放系统用户信息的用户表中常常会有用户登录密码这个字段,如果不对密码作加密处理,放在这个字段中的密码就会是明文,只要能打开数据库并拥有对用户表的查询权限,就可以直接看到用户的登录密码,这样是不够安全的。为解决这个问题,可以采用MD5算法来对密码计算摘要,然后把计算后的摘要存放到密码字段中,那么在数据库的用户表中查看到的就不是明文了。
MD5算法并不是对数据的加密处理,而是对数据采用MD5算法来记录数据特征(称为摘要)的一段字符串,对于同一个数据,计算出来的摘要是相同的。因此,在用户注册时,就在用户表的密码字段存放根据密码数据用MD5算法计算出来的摘要;在下次登录时,根据用户输入的密码作MD5算法计算摘要处理,如果计算出来的摘要与用户表中存放的摘要相同,则表示密码正确。
一般来说,不管要传递的数据有多长,计算出来的摘要总是16或20个字节长。JDK中已带有目前比较成熟的计算摘要的算法,如MD5、SHA等。下面来看MD5计算摘要是如何实现的。
【实例140】 为登录密码计算MD5摘要
本例的思路如下:在用户注册时就为用户输入的密码计算MD5摘要,并存入数据库的用户表中;在用户登录时再根据输入的密码计算摘要,并与数据库中用户表的这个用户的摘要作对比,如果相同则通过验证。
本例将继续使用第7章实例51“向用户表中插入记录”中的源代码insertUserTable.jsp和acceptInsertUserTable.jsp,并稍作修改。insertUserTable.jsp页面的代码无须修改,acceptInsertUserTable.jsp页面的首部语句改为:
<%@ page import="java.sql.*,java.security.MessageDigest" %>
这里导入了java.security.MessageDigest类,这个类可用来使用MD5算法计算的实例对象,并作MD5计算。在接收输入password(用户密码)参数时,接收参数的语句修改为如下:
String password=codeToString(request.getParameter("password"));
if(password==null)//无内容则设为空串
password="";
//为密码计算摘要
try{
//------生成MessageDigest对象MD------
MessageDigest MD=MessageDigest.getInstance("MD5");
//------传入要计算的字符串------
MD.update(password.getBytes("UTF8"));
//------计算消息摘要------
byte[] passwordMD5Byte=MD.digest();
password=new String(passwordMD5Byte);
}catch(Exception e){
e.printStackTrace();
}
下面来看登录页面的代码:
login.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head><title>登录页面</title></head>
<body>
<table align="center" border="0">
<tr align="center"><td><font color="red"><html:errors/></font></td></tr>
<tr align="center"><td>系统登录</td></tr>
<form action="loginCheck.jsp" method="post" focus="username">
<tr><td>用户名:<input type="text" name="username"/></td></tr>
<tr><td>密 码:<inputtype="password"name="password"/></td></tr>
<tralign="right"><td><inputtype="submit"value="确定"/></td></tr>
</form>
</table>
</body>
</html>