shiro密码加密
1 MD5加密
在配置文件中设置自定义Realm对象的属性开启MD5加密
@Bean
public ShiroRealm userRealm(){
ShiroRealm realm = new ShiroRealm();
//设置加密算法为md5
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName("md5");
//设置加密次数
credentialsMatcher.setHashIterations(1024);
realm.setCredentialsMatcher(credentialsMatcher);
return realm;
}
在获取前端的密码后会在Realm中自动调用SimpleAuthenticationInfo(user,user.getPwd(),this.getName());
进行加密比较,具体的比较过程在该对象的源码中。
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
UserEntity user = userService.findUserByName(userToken.getUsername());
if (user!=null){
log.info("密码:"+user.getPwd());
System.out.println("密码"+user.getPwd());
//匹配从数据库获取的到密码与前端传递的密码时候相同
return new SimpleAuthenticationInfo(user,user.getPwd(),this.getName());
}
return null;
}
仅使用MD5加密的缺点:如果两个人的密码一样则数据里的密文也一样,任然存在不安全性。
2 MD5盐值加密
盐值一般是唯一的字符串,用用户名代替或者使用随机字符串,其数据类型是byte
可以使用ByteSource
接口下的Util.bytes
将字符串装换为byte
ByteSource salt = ByteSource.Util.bytes(user.getUserName());
具体使用如下:
ShiroConfig中还是设置自定义Realm对象的属性开启MD5加密。
在Realm的重写方法中使用盐值加密匹配即可
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
UserEntity user = userService.findUserByName(userToken.getUsername());
if (user!=null){
log.info("密码:"+user.getPwd());
log.info("thisName:"+this.getName());
//盐值加密
/*
1. 以用户名作为盐值
*/
log.info("userName:"+user.getUserName());
ByteSource salt = ByteSource.Util.bytes(user.getUserName());
log.info("salt:"+salt);
//匹配从数据库获取的到密码与前端传递的密码时候相同
return new SimpleAuthenticationInfo(user,user.getPwd(),salt,this.getName());
}
return null;
}