这期内容当中小编将会给大家带来有关SpringSecurity中怎么使用MD5加密密码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
成都创新互联公司专业为企业提供新民网站建设、新民做网站、新民网站设计、新民网站制作等企业网站建设、网页设计与制作、新民企业网站模板建站服务,10年新民做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
一、为什么使用加密
我们先来说一下使用加密后的密码处理流程。我们为什么要使用密文呢?也就是加密后的密码呢?如果一个用户在网站注册时写入的密码是123456,当他点击保存之后,如果不加密的话,在数据库中存的就是123456,这样有什么不好吗?答案是肯定的,想想12306密码泄露导致用户所有信息泄露,是用户密码不够复杂吗?可能是?但是最主要的原因是数据库中如果使用的是明文,黑客很容易就会进行破解,而且一旦破解了一个密码可能就会拿到一组数据,为了方便大家理解,画了张草图:而且数据库中密码为123456的用户绝对不是2个,大家可以想象后果由多可怕了吗。。。
二、MD5+salt
其实关于这个问题上网就可以收集到,这里不再赘述,大家百度下概念就好,我们这里主要说在SpringSecurity中使用MD5,我们知道单纯的MD5加密并不是安全的,而如果我们使用MD5加盐的方式去对密码进行加密,那么想要破解的话难度系数就会成倍出现,基本上是不可能破解的。大家都知道MD5是不可逆的,也就是说加密完的密码无法进行解密,要不然怎么会是安全的呢?那我们来看下如果使用了MD5加密的话,黑客在获取密码的时候会是怎样的呢?还是和上面一样给大家画个草图方便理解吧。
虽然说张三和李四在注册的时候都使用的是123456作为密码。但是在保存到数据库之前,我们首先进行了MD5+salt操作,到数据库中的是显然不同的2个密文,这时黑客拿到密文之后进行破解,破解出来以后去登录,发现只有张三能登录,而李四的并不能登录,这时为什么呢?因为在登录的时候我们会把用户输入的明文以之前的加密方式再次加密得到一个密文,然后拿这个密文和数据库之前保存的密文比较,如果相同才会放行,显然张三和李四的密文不同,所以即使张三的密码被破译了,但是李四的123456密码还是安全的。老规矩还是画个草图。。这个图也就是SpringSecurity对密码进行比较的流程。。
这样的话就可以对密码进行很好的保护,接下来我们看一下在项目中具体该如何使用吧
三、自定义PasswordEncoder
在SpringSecurity中要想使用自定义的密码加密。首先要new一个xxxPasswordEncoder,然后SpringSecurity会使用你定义的Encoder去比对密码。首先我们要编写一个类来实现PasswordEncoder接口, 我们来看下PasswordEncoder中为我们提供了什么方法。
一个是encode方法是用来对明文密码加密的方法,也就是重写PasswordEncoder之后我们自定义的加密方法就写在encode里,
另外一个是matches很明显是一个匹配密码的方法,第一个参数是要匹配的密码,第二个参数是加密后的encode密文。我们的解密方法(其实是用相同的加密方式再次加密后比较)就写在这里。来看下我自定义的MD5PasswordEncoder吧:
public class MD5PasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence rawPassword) { return MD5Util2.encode((String) rawPassword); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return encodedPassword.equals(MD5Util2.encode((String)rawPassword)); }}
MD5加密工具类:
import java.security.MessageDigest;
//md5加密工具类
public class MD5Util2 {
private static final String SALT = "lwz";
public static String encode(String password) {
password = password + SALT;
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
throw new RuntimeException(e);
}
char[] charArray = password.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}
大家可以看到在匹配的时候,是拿原来的密码进行相同的加盐方式进行加密,然后去比对之前保存的密文。
四、SpringSecurity处理MD5
其实这个就很简单了,就是在你save数据之前,调用一下加密的方法,也就是上面自定义的encoder。然后把拿到的用户明文密码填充进去。这里就不再赘述,重点看SpringSecurity处理,还是使用上篇中我们提到的UserDetails实现类,你只需要在返回User对象的时候将password从数据库中读取出来,传给SpingSecurity,它会自动匹配matches方法进行比对。所以我们的代码这样的:
@Component
public class CustomUserService implements UserDetailsService {
@Autowired
AdminService adminService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Admin admin = adminService.findAdminByUsername(username);
if (admin==null){
throw new UsernameNotFoundException("用户名不存在");
}
List
authorities = new ArrayList<>(); //用于添加用户的权限。只要把用户权限添加到authorities 就万事大吉。
//一个用户可以对应多个角色
for (Role role : admin.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new User(admin.getUsername(),admin.getPassword(),true,true,true,true,authorities);
}
}
然后把密码直接传进去:可以重写User对象返回自己的调用逻辑,这里就直接返回User,上篇提到过。
然后的处理就很简单了,我们只需要把自己的PasswordEncoder以Bean的形式告诉SpringSecurity,可以理解为:告诉SpringSecurity我要用我自定义的Encoder来处理密码,你去调用它。所以我们在LoginSecurityConfig(就是你实现了WebSecurityConfigurerAdapter抽象类的那个方法 )注册一个bean就好了,如下:
//告诉SpringSecurity我要用我自定义的Encoder来处理密码
@Bean
public PasswordEncoder passwordEncoder() {
return new MD5PasswordEncoder();
}
认证:
//认证
//密码编码:PasswordEncoder
//在Spring Security 5.0+新增了很多的加密方法~
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//从数据库中进行账号密码验证
auth.userDetailsService(customUserService());
}
上述就是小编为大家分享的SpringSecurity中怎么使用MD5加密密码了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。