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 @ 2024-02-02 14:26  多多指教~  阅读(97)  评论(0编辑  收藏  举报