哈喽!大家好,我是旷世奇才李先生
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟,回复【项目】获取我为大家准备的项目
文章目录
- 一、登录密码加盐处理方式
- 1、简介
- 2、密码加盐实操
- 三、总结
相关阅读
- 面试官:Zookeeper是什么,它有什么特性与使用场景?
- 面试官:Redis如何实现持久化的、主从哨兵又是什么?
一、登录密码加盐处理方式
1、简介
在一般项目中我们的密码存储是通过md5加密进行存储的,但是随着技术的发展,这样的加密方式也不太安全,因为相同的明文密码,通过md5加密后的密文是一样的。
如果你的密码设置的比较简单,例如“123456”,这种密码通过md5加密后的密文已经烂大街了,某些高手甚至一些网站已经进行md5加密的密文进行破解了,就是通过简单的密码加密后的密文一样,然后他们对大量的简单密码进行加密,然后再对比你的密文,就可以将一些简单的密码进行破解了。
这个时候就有人说了,那让用户把密码设置复杂一点不就行了吗,这时用户说只要密码一复杂我就记不住怎么办,我脑子不好使。。。
这个时候我们就需要通过加盐来进行简单密码的复杂加密化,即便是最简单的“123456”也能保证所有人加密出来的密文不一样,这样就算是黑客来了也得骂两句再走。。。
通过一张图我们可以简单看一下加盐的原理是什么。
可以看到我们在进行用户注册的时候根据用户随机生成一个salt,假如是“abc”,然后我们将用户输入的简单密码“123456”后面加上我们生成的salt,然后我们再进行md5加密,这样我们的密文是“123456abc”进行加密的结果,当我们用户登录的时候我们就将用户输入的密码加上salt,然后再进行加密,和数据库的password进行比对即可。
这样不管是多简单的密码,不管是有多少人设置一样的密码,数据库中存储的密文也是不一样的。
2、密码加盐实操
下面我们通过代码来实现一下用户注册的时候加盐,以及登录的时候怎么进行密码判断的。
public ResponseResult login(LoginDto dto) {
//1.正常登录 用户名和密码
if(StringUtils.isNotBlank(dto.getPhone()) && StringUtils.isNotBlank(dto.getPassword())){
//1.1 根据手机号查询用户信息
ApUser dbUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
if(dbUser == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"用户信息不存在");
}
//1.2 比对密码
String salt = dbUser.getSalt();
String password = dto.getPassword();
//将用户名和盐进行组合加密处理
String pswd = DigestUtils.md5DigestAsHex((password + salt).getBytes());
if(!pswd.equals(dbUser.getPassword())){
return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
}
//1.3 返回数据 jwt user
String token = AppJwtUtil.getToken(dbUser.getId().longValue());
Map<String,Object> map = new HashMap<>();
map.put("token",token);
dbUser.setSalt("");
dbUser.setPassword("");
map.put("user",dbUser);
return ResponseResult.okResult(map);
}else {
//2.游客登录
Map<String,Object> map = new HashMap<>();
map.put("token",AppJwtUtil.getToken(0L));
return ResponseResult.okResult(map);
}
}
可以看到我们这里用户登录的时候是将数据库中的盐和用户输入的明文密码进行了一个组合,然后将这个组合后的密码进行了加密,然后再将加密后的密码和数据库中的密文进行对比,这样就是整体的一个流程。
可以看到我们使用这种方法后无论是多简单的密码最后加密成密文以后都是不一样的,这样我们的安全等级就会提升。
三、总结
项目涉及的功能还是比较全面的,建议大家跟着视频做一遍。可以关注公众号回复【项目】领取项目,如果有用就点赞支持一下吧。
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【项目】获取我为大家准备的项目