目录
1、MD5概述
1.1、什么是MD5?
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
1.2、MD5加密作用
是让大容量信息在用数字签名软件签署私人密匙前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。它需要获得一个随机长度的信息并产生一个128位的信息摘要。
1.3、什么要使用MD5加密?
存储一些敏感信息的时候,如果不进行加密肯能会出现安全问题。例如:系统登录的密码,如果数据库中的密码采用明文,一旦数据库泄露,则用户的密码直接泄露。但是使用MD5加密算法之后即使数据泄露,也不会被轻易的激活成功教程,相对安全。
2、MD5加密流程
2.1、工具类导入
首先需要在项目中导入MD5的工具类,在用户注册模块中进行使用。
public class MD5Utils {
public static String getPWD( String strs ){
/*
* 加密需要使用JDK中提供的类
*/
StringBuffer sb = new StringBuffer();
try{
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] bs = digest.digest(strs.getBytes());
/*
* 加密后的数据是-128 到 127 之间的数字,这个数字也不安全。
* 取出每个数组的某些二进制位进行某些运算,得到一个具体的加密结果
*
* 0000 0011 0000 0100 0010 0000 0110 0001
* &0000 0000 0000 0000 0000 0000 1111 1111
* ---------------------------------------------
* 0000 0000 0000 0000 0000 0000 0110 0001
* 把取出的数据转成十六进制数
*/
for (byte b : bs) {
int x = b & 255;
String s = Integer.toHexString(x);
if( x > 0 && x < 16 ){
sb.append("0");
sb.append(s);
}else{
sb.append(s);
}
}
}catch( Exception e){
System.out.println("加密失败");
}
return sb.toString();
}
}
2.2、用户注册模块使用MD5
下面代码是servlet层注册的部分代码,可以看到在使用BeanUtils工具类自动封装后,从前端获取的数据就会被封装到User对象中,此时获取的密码肯定是用户输入的,那么我们在把user对象传递给dao层进行插入之前进行加密,这样就可以实现密码到数据库中时就可以进行MD5加密了
修改代码前
User user=new User();
Map<String, String[]> map = request.getParameterMap();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
boolean register = userService.register(user);
if(register){
//注册成功,重定向到成功页面
response.sendRedirect("register_success.html");
}else{
//返回为false说明用户已存在了
request.setAttribute("register_msg","用户已存在,不能重复注册!");
//转发到注册页面
request.getRequestDispatcher("register.jsp").forward(request,response);
}
在调用service层方法之前加入下面代码,重新为user对象的密码赋值为加密后的密码
user.setPassword(MD5Utils.getPWD(user.getPassword()));
修改代码后
User user=new User();
Map<String, String[]> map = request.getParameterMap();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
user.setPassword(MD5Utils.getPWD(user.getPassword()));
boolean register = userService.register(user);
if(register){
//注册成功,重定向到成功页面
response.sendRedirect("register_success.html");
}else{
//返回为false说明用户已存在了
request.setAttribute("register_msg","用户已存在,不能重复注册!");
//转发到注册页面
request.getRequestDispatcher("register.jsp").forward(request,response);
}
我在注册页面加入一个新的用户admin
可以对比看出,密码就会被加密了,不会以明文的形式展现出来,这样就可以提高数据库信息的安全性。
2.3、登录问题解决
虽然注册功能能够实现加密密码,但是登录功能却会出现问题,因为登录时候需要查询用户名和密码,然而数据库中密码已经被加密了,用户输入的密码肯定不会和加密的密码一致,所以就会出现登录失败的现象。
这是我登录servlet的部分代码,我们只需要在service调用方法之前同样加入一个密码加密就可以了,因为这里的密码也是从前端页面获取的,在进行查询用户账号和密码之前对密码进行加密,结果是一致的。
修改之前
UserService userService = new UserServiceImpl();
HttpSession session = request.getSession();
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
User user1 = userService.login(user);
if (user1!=null) {
//登录成功,重定向到QueryAllServlet中
session.setAttribute("user",user1);
//转发到查询所有
// response.sendRedirect("QueryAllServlet");
//转发到分页查询
response.sendRedirect("QueryStudentByPageServlet");
} else {
session.setAttribute("msg", "登录失败,用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
修改之后
UserService userService = new UserServiceImpl();
HttpSession session = request.getSession();
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
user.setPassword(MD5Utils.getPWD(user.getPassword()));
User user1 = userService.login(user);
if (user1!=null) {
//登录成功,重定向到QueryAllServlet中
session.setAttribute("user",user1);
//转发到查询所有
// response.sendRedirect("QueryAllServlet");
//转发到分页查询
response.sendRedirect("QueryStudentByPageServlet");
} else {
session.setAttribute("msg", "登录失败,用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
登录成功!
今天的文章Java——MD5密码加密分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23873.html