文章目录
前言
由于将用户的账号密码明文存储在数据库中具有不安全性,比如容易泄露,用户觉得不靠谱等,所以我们需要将用户的密码加密存储在数据库中。
- Hash加密
hash 算法(散列算法、摘要算法)即把任意长度的输入映射为固定长度的输出,比如密码 Evanniubi 变成五位的输出kchpl,这种算法不可逆,且存在信息损失,虽然随着时间推移,出现了字典法、彩虹表法等优化手段,但本质上想要破解还是靠穷举与瞎蒙,而且对于复杂密码来说,破解成本极高。
- 加盐加密
加盐,是提高 hash 算法的安全性的一个常用手段。其意义在于利用你的账户生成“盐”,通过这个盐生成密码并用hash加密。
为什么更安全?- 黑客就算拿到数据库中的密码也无法使用。
- 即使用户使用相同的密码,由于各个用户的盐不同,所以也无法破解用户的密码。
代码部分
我们首先要在user表中添加salt字段,存储每个用户生成的“盐”。
在SpringBoot的Pojo文件夹下的User同样增加Salt字段以及get,set方法。
-
引入Service层
大型的项目中,一般不由控制层直接调用Mapper层,所以需要提供一个Service层,让它担当Controller层与Mapper层的媒介,接收Controller层的请求,处理Mapper层的数据。所以我们在项目文件下创建Service文件夹,创建UserService.java文件,注解@Service,代表Service层,并在其中对UserMapper进行@autowired 。@Service public class UserService { @Autowired private UserMapper userMapper; public boolean checkUser(User user){ User u = userMapper.selectUser(user); if(u == null){ return false;//如果账号密码输入不正确,返回false } return true; } public boolean isExist(String username){ User user = userMapper.isExist(username); if(user != null){ return true;//从数据库可以查找出用户 } return false; } }
-
用户注册
前面说过,每个用户生成唯一的盐,所以我们得保证用户是唯一的,这样就需要用户注册的时候验证数据库中是否存在该账号。<select id="isExist" resultType="com.demo.demo.Pojo.User"> select * from user where username = #{ username} </select>
@PostMapping("/register") public String register(@RequestBody User user){ if(userService.isExist(user.getUsername())){ return "用户名已存在"; } // 根据用户名生成盐 String salt = new SecureRandomNumberGenerator().nextBytes().toString();