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加密存储到数据库。校验的时候将传递过来的密码进行加密,再拼上加盐的结果,两者对比看是否相同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)