前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >简单登录&密码md5加密登录&盐值+md5加密登录

简单登录&密码md5加密登录&盐值+md5加密登录

作者头像
Tom2Code
发布2022-04-15 16:32:16
发布2022-04-15 16:32:16
2.1K00
代码可运行
举报
文章被收录于专栏:TomTom
运行总次数:0
代码可运行

最近学习mybatis框架

跟着教程一起写一个OA(Office Automation)系统

因为是自动化办公系统,所以肯定需要登录的

虽然前段时间用servlet写过简单的登录

但是密码却没有加密处理,且不讨论企业级开发

就是单纯的为了用户的数据信息安全,在我们后期开发中也得需要

对密码进行加密,所以今天这一小文就来讲一讲md5加密和加盐混淆加密

一.first blood

先看最基础的LoginServlet.java

代码语言:javascript
代码运行次数:0
运行
复制
@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

代码语言:javascript
代码运行次数:0
运行
复制
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加点“盐”

例如我们通过这个简单的算法:

代码语言:javascript
代码运行次数:0
运行
复制
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+盐值混淆之后的数据

这样我们的数据的安全性将会大大提升。

-终-

好了,这次的小文就写到这里了,祝明天考四六级的童鞋们加油,蒙的都会,干就完了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom的小院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档