前后端日常使用:前后端两次MD5加密

本文详细介绍了一种基于MD5的双层加密机制,通过前端和后端的两次MD5加盐加密,确保用户密码在传输和存储过程中的安全性。前端使用JQuery md5工具进行初次加密,后端接收并进行二次加密,最终与数据库存储的密码进行对比验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MD5加密设计

前端后端分别进行一次md5 salt加密

前端加密

为了防止密码明文在http上传输,则需要在前端进行一次md5 salt加密

  • 使用JQuery md5

前端JQuery md5工具:https://github.com/emn178/js-md5

  • 在前端js中声明一个固定盐salt
//salt
var g_passsword_salt="ewn576ifa12";

  • 登录js方法中加密调用ajax

这里使用layer Web组件,进行ajax消息弹窗

function doLogin(){
    var inputPass = $("#password").val();
    var salt = g_passsword_salt;
    //使用盐中5位组合md5加密
    var str = "" salt.charAt(0)   salt.charAt(2)   salt.charAt(5)   inputPass   salt.charAt(7)   salt.charAt(8);
    var password = md5(str);
    //使用第一次加密的密码进行ajax传输
    $.ajax({
        url: "/login/do_login",
        type: "POST",
        data:{
            mobile:$("#mobile").val(),
            password: password
        },
        //成功回调函数
        success:function(data){
            layer.closeAll();
            if(data.code == 2000){
                layer.msg("成功");
                window.location.href="/goods/to_list";
            }else{
                layer.msg(data.msg);
            }
        },
        //失败回调函数
        error:function(){
            layer.closeAll();
        }
    });
}

后端加密存储

后端将拿到第一次md5加密的结果,这个密码就是表单提交上来的密码,我们需要在后端编写第二道md5加密方式来加密表单传来的密码后再与数据库存储的两次md5加密的密码进行比较,相同才能登陆成功

  • 第二次加密作用:因为第一次前端加密的密码有可能被窃取的,也可能解析我们的js看到我们前端加密方式,可以直接得到明文密码,所以我们需要第二次后端加密再存储,这样即使前端密码被拿到了后端的也不符合。

我们将后端使用同样的方式(也可以用不同的方式)再次加密,盐值salt需要相等,用于注册时,后端进行计算出与前端第一次加密匹配的密码。

  • 依赖:Apache-commons-codec
<dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>

  • MD5Util 类
public class MD5Util {
    public static String md5(String t){
        return DigestUtils.md5Hex(t);
    }

    private static final String salt = "ewn576ifa12";
//前端输入的密码到表单提交的密码(第一次加密) 用于校验前端传入的密码与该方法返回的密码是否相等
    public static String inputPassToFormPass(String pass){
        String s = ""   salt.charAt(0)   salt.charAt(2)   salt.charAt(5)   pass   salt.charAt(7)   salt.charAt(8);
        return md5(s);
    }
//表单提交的密码(第一次加密的密码)到数据库存储的密码(第二次加密)
    public static String formPassToDb(String formPass,String salt){
        String s = ""   salt.charAt(0)   salt.charAt(2)   salt.charAt(5)   formPass   salt.charAt(7)   salt.charAt(8);
        return md5(s);
    }
//前端输入的明文密码到数据库存储的密码 可用于注册
    public static String inputPassToDbPass(String input,String salt){
        String form = inputPassToFormPass(input);
        return formPassToDb(form,salt);
    }
}

  • 登录业务代码
public boolean login(HttpServletResponse response,String mobile, String formPass) {
    //根据手机号获取User用户对象
        User user = UserMapper.getById(Long.parseLong(mobile));
        if(user==null){
            throw new GlobalException(ErrorCodeEnum.MOBILE_NOT_EXIST);//抛出自定义异常
        }
        String dbPass = user.getPassword();//获取数据库的第二次加密的密码
        String dbSalt = user.getSalt();//获取后端存储的盐
        String calPass = MD5Util.formPassToDb(formPass,dbSalt);//根据前端表单传来的密码计算出第二次加密结果
        if(!calPass.equals(dbPass)){//如果不相等
            log.error("{}登录密码错误",mobile);
            throw new GlobalException(ErrorCodeEnum.LOGIN_FAIL);
        }
        return true;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值