最近学习mybatis框架
跟着教程一起写一个OA(Office Automation)系统
因为是自动化办公系统,所以肯定需要登录的
虽然前段时间用servlet写过简单的登录
但是密码却没有加密处理,且不讨论企业级开发
就是单纯的为了用户的数据信息安全,在我们后期开发中也得需要
对密码进行加密,所以今天这一小文就来讲一讲md5加密和加盐混淆加密
一.first blood
先看最基础的LoginServlet.java
@WebServlet(name = "LoginServlet",urlPatterns = "/check_login")
public class LoginServlet extends HttpServlet {
Logger logger= LoggerFactory.getLogger(LoginServlet.class);
private UserService userService=new UserService();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username=request.getParameter("username");
String password=request.getParameter("password");
Map<String,Object> result=new HashMap<>();
try {
User user=userService.checkLogin(username,password);
HttpSession session=request.getSession();
session.setAttribute("login_user",user);
result.put("code","0");
result.put("message","success");
result.put("redirect_url","/index");
}catch (BussinessException ex){
logger.error(ex.getMessage(),ex);
result.put("code",ex.getCode());
result.put("message",ex.getMessage());
}catch (Exception ex){
logger.error(ex.getMessage(),ex);
result.put("code",ex.getClass().getSimpleName());
result.put("message",ex.getMessage());
}
String json=JSON.toJSONString(result);
response.getWriter().println(json);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
我们这里直接获取了前端表单中的password,而且更重要的是在数据库中密码也没有进行加密,这样一来数据就会不安全,因为一旦数据库被攻破,那随之而来的就是用户的损失。这样的损失将会是惨痛的。
防止这种惨痛的事情的发生,所以我们可以把我们数据库中的密码进行加密,这样一来,黑客及时攻破了数据库,我们的用户信息也不会那么的轻易泄露。
接下来,我们来研究加密——MD5。
二.MD5加密
首先讲一下什么是MD5摘要算法:
a. MD5信息摘要算法广泛使用的密码散列函数
b. MD5可以产生一个128位的散列值用于唯一标识源数据
c. 项目中通常使用MD5作为敏感数据的加密算法
特点:
a. 压缩性,MD5生成的摘要长度固定
b. 抗修改性,源数据哪怕有一个字节变化,MD5也会有巨大差异
c. 不可逆,无法通过MD5反向推算源数据
那么接下来就来使用Apache Commons Codec来加密一个字符串并产生对应的MD5
创建对应的工具类:
MD5Utils.java
package cn.tompro.oa.utils;
import org.apache.commons.codec.digest.DigestUtils;
public class MD5Utils {
public static String md5Digest(String source){
return DigestUtils.md5Hex(source);
}
}
然后我们使用junit4对我们的类进行测试:
这样一来,我们好像觉得数据安全了。可是真的安全吗?
我们百度搜索md5不仅会出来加密,而且还会出来解密
那我们去复制我们这串MD5然后去虽然丢到一个网站里解密看看?
可以看到,直接可以查询到我们这条MD5对应的解密之后的信息
由此可见,我们的数据即使经过MD5加密,其实也并不安全
那怎么办呢?
三.md5+盐值
那什么是MD5+盐值加密呢
其实可以理解成混淆加密,因为我们知道一个例如我们最初想要加密的字符串是test
但是我们在加密的时候可以给test加点“盐”
例如我们通过这个简单的算法:
public static String md5Digest(String source,Integer salt){
char[] ca=source.toCharArray();//字符数组
for(int i=0;i<ca.length;i++){
ca[i]=(char)(ca[i]+salt);
}
String target=new String(ca);
String md5=DigestUtils.md5Hex(target);
return md5;
}
然后这次我们再次对这个有盐值的加密方法进行测试
会发现,这次的md5就与之前的md5完全不一样了
而且对应的解密网站也查询不出来对应的数据了
这样一来,如果我们把数据库中的密码都改成md5+盐值混淆之后的数据
这样我们的数据的安全性将会大大提升。
-终-
好了,这次的小文就写到这里了,祝明天考四六级的童鞋们加油,蒙的都会,干就完了。