12.1.2 安全升级1—摘要处理
针对这样的系统,我们可以使用摘要算法对其进行安全加固,确保用户敏感数据不被泄露。
1.修改用户数据
MySQL提供了MD5和SHA1两种消息摘要算法函数:MD5()和SHA1()。我们需要对数据库稍作调整,使用MD5算法隐藏用户密码(这里用户密码为用户名),更新用户密码SQL如代码清单12-7所示。
代码清单12-7 更新用户密码SQL1
UPDATEaccount
SETpassword=MD5(name)
这里,我们使用了MD5算法函数MD5()。再次检索用户表Account,用户密码已经变得“面目全非”了,这正是我们的目的!如图12-4所示。
图 12-4 检索用户数据2
2.修改校验模块
用户密码已经经过摘要处理,因此,我们需要对用户登录校验模块稍作修改。这里,我们使用Common Codec对用户输入的密码做摘要处理,然后比对数据库数据。对原login.jsp页面校验部分稍作调整,如代码清单12-8所示。
代码清单12-8 校验用户密码1
if(p.equals(DigestUtils.md5Hex(password))){
out.println("用户"+username);
out.println("登录成功!");
}else{
out.println("用户"+username);
out.println("密码错误!");
}
当然,我们也可以使用MySQL函数MD5(),并修改SQL语句完成上述操作。login.jsp页面的完整代码如代码清单12-9所示。
代码清单12-9 login.jsp页面2
<%@page language="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="org.apache.commons.codec.digest.DigestUtils"%>
<%@page import="java.sql.*"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>登录结果</title>
</head>
<body>
<%
//构建数据库连接
//JDBC驱动类
String driverClass="com.mysql.jdbc.Driver";
//用户名
String name="root";
//密码
String pwd="admin";
//数据库连接
String url="jdbc:mysql://localhost:3306/test";
Class.forName(driverClass);
Connection conn=DriverManager.getConnection(url, name, pwd);
//取得表单信息
String username=request.getParameter("username");
String password=request.getParameter("password");
//检索用户
PreparedStatement statement=conn.prepareStatement("select*
from account where name=?");
statement.setString(1,username);
ResultSet rs=statement.executeQuery();
%>
<pre>
<%
//如果记录存在验证用户身份
if(rs.next()){
String p=rs.getString("password");
if(p.equals(DigestUtils.md5Hex(password))){
out.println("用户"+username);
out.println("登录成功!");
}else{
out.println("用户"+username);
out.println("密码错误!");
}
}else{
out.println("用户"+username+"不存在");
}
%>
</pre>
<%
//关闭结果集
rs.close();
//关闭语句集
statement.close();
//关闭连接
conn.close();
%>
</body>
</html>
如果我们对一些成熟系统仔细研究,就会发现这种使用摘要算法隐蔽用户密码的方法已经很普遍了。
对于上述代码修改的服务验证甚为简单,请读者自行验证。