因为新项目没有继续用Shiro框架,再加上人比较懒,所以就没有再写新的关于 Shiro 的文章。但是今天发现已经有几个朋友在 GitHub 上的给示例项目加星,也有留言咨询的。我很高兴这篇文章能够帮到大家,也再次让我感受到把在工作中学到的东西写出来,和大家分享是这么一件令人高兴的事,用知乎上的话说这是一件长半衰期的事。我会继续写下去的
前言
上一篇文章,我们用 Spring Boot2 框架搭建了一个 web 项目,并且使用 Shiro 作为安全管理框架实现了用户的身份认证,也就是登录。这篇文章首先简要介绍了密码储存的演进史,然后结合代码介绍了在 Shiro 中怎么使用 MD5、MD5 加盐、 Bcrypt 等三种逐渐进步的方法加密密码。
密码存储演进史
在上一篇文章中我们保存在系统的用户密码还是明文,这显然是很不合理和不专业的做法。作为一名工程师 专业自然是必须的。
常用的做法是使用加密算法对用户密码加密然后存储数据库,当用户登录时,对用户密码使用相同的算法进行加密,然后与数据库中的密文进行比对。作为一个合格专业的系统有两点需要保证:
- 用户账号不易被破解
- 系统不能保存用户密码原文
关于密码存储演进史这篇文章讲的很好,朋友们可以看一下。从文章中我们知道密码储存大概分为几个阶段:
- 明文储存
- 单向 hash(md5、sha256)
- 单向 has h加盐
- 慢加密算法(Bcrypt、Scrypt)
单项hash算法
注册用户
因为要演示使用 Shiro 对密码进行加密,上一节中的那种保存密码的方式非常不方便。在这一节我们添加一个用户注册的接口,使用用户对象保存用户名和用户密码并且用一个集合保存系统已注册的用户。
新建用户类,并重写toString
方法。
package top.zhaodongxx.domain;
/**
* @author zhaodong zhaodongxx@outlook.com
* @version v1.0
* @since 2018/7/19 10:40
*/
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
在 ShiroService
类中添加新增用户的方法 addUser
,我们使用 SimpleHash
类使用 MD5 加密算法对密码进行加密,然后在提供一个通过用户名查询用户的方法,用于后面的登录验证。
package top.zhaodongxx.service;
import org.apache.shiro.crypto.hash.SimpleHash;