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所示。

figure_0407_0144

图 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>


如果我们对一些成熟系统仔细研究,就会发现这种使用摘要算法隐蔽用户密码的方法已经很普遍了。

对于上述代码修改的服务验证甚为简单,请读者自行验证。