Java将密码加盐加密存储和校验

注册和登陆的时候,需要加密和校验,以下为加密和解密代码

复制代码
package org.ongoal.common.config;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

public class PasswordUtil {
    /**
     * 加盐算法 -> 格式:盐值(32)$加密之后的密码(32)
     * @param password 原密码
     * @return
     */
    public static String encrypt(String password){
        // 1.生成盐值
        String salt = UUID.randomUUID().toString().replace("-","");
        // 2.使用加密算法将盐值+原密码进行加密
        String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
        // 3.将盐值和加密后的密码一起返回
        String dbPassword = salt+"$"+finalPassword;
        return dbPassword;
    }

    /**
     * 密码验证
     * @param inputPassword
     * @param dbPassword
     * @return
     */
    public static boolean decrypt(String inputPassword,String dbPassword){
        // 1.验证参数
        if(!StringUtils.hasLength(inputPassword) || !StringUtils.hasLength(dbPassword) ||
                dbPassword.length()!=65 || !dbPassword.contains("$")){
            return false;
        }
        // 2.将用户输入的密码和数据库的盐值进行加密,得到待验证的加密密码
        // 2.1 得到盐值 & 最终正确的密码
        String[] dbPasswordArray = dbPassword.split("\\$");
        String salt = dbPasswordArray[0];
        String finalPassword = dbPasswordArray[1];
        // 2.2 使用数据库的盐值+用户输入的密码进行加密=待验证的加密密码
        String userPassword = DigestUtils.md5DigestAsHex((salt+inputPassword).getBytes());
        // 3.将待验证密的加密密码和数据的加密的密码进行对比
        if(userPassword.equals(finalPassword)){
            return true;
        }
        // 4.将结果返回给调用方
        return false;
    }
}
复制代码

注册的时候,加密存储到数据库

复制代码
    @RequestMapping("/add")
    public ResponseResult save(@RequestBody UserInfo userInfo){
        if (StrUtil.isEmpty(userInfo.getUserName()) || StrUtil.isEmpty(userInfo.getPassword())){
            return ResponseResult.fail(1,"用户或者密码不可为空");
        }
        LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserInfo::getUserName,userInfo.getUserName());
        List<UserInfo> list = userService.list(wrapper);
        if (CollUtil.isNotEmpty(list)){
            return ResponseResult.fail(1,"已注册");
        }
        userInfo.setPassword(PasswordUtil.encrypt(userInfo.getPassword()));   // 加密
        boolean save = userService.save(userInfo);
        return save ? ResponseResult.success() : ResponseResult.fail();
    }
复制代码

登陆的时候,校验密码是否正确

复制代码
@PostMapping("/login")
    public ResponseResult login(String username,String password){
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
            return ResponseResult.fail(1,"参数有误");
        }
        // 账号密码的校验
        LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(UserInfo::getUserName,username);
        UserInfo userInfo = userService.getOne(wrapper);
        if (ObjectUtils.isEmpty(userInfo)){
            return ResponseResult.fail(1,"用户名或者密码有误");
        }
        if (!PasswordUtil.decrypt(password,userInfo.getPassword())){   // 校验
            return ResponseResult.fail(1,"用户名或者密码有误");
        }
        Map<String,Object> map = new HashMap<>(){
            private static final long serialVersionUID = 1L;
            {
                put("uid",userInfo.getUid());
                // 15天时间后过期
                put("exp",System.currentTimeMillis() + 1000 * 60 * 60 * 24* 15);
            }
        };
        String token = JWTUtil.createToken(map, AppVariable.JWT_SECRET.getBytes());
        return ResponseResult.success(token);
    }
复制代码

注册接口

 登陆接口,获取token

 

简单理解就是:通过UUID加盐,然后利用MD5加密存储到数据库。校验的时候将传递过来的密码进行加密,再拼上加盐的结果,两者对比看是否相同。

 

posted @   多多指教~  阅读(420)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示