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加密存储到数据库。校验的时候将传递过来的密码进行加密,再拼上加盐的结果,两者对比看是否相同。
浙公网安备 33010602011771号