shiro配置盐值加密
一:在shiro配置文件ShiroConfig.java中配置密码凭证匹配器
/**
* 密码凭证匹配器,作为自定义认证的基础
* @return
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName("MD5");//散列算法:这里使用MD5算法
hashedCredentialsMatcher.setHashIterations(10);//散列的次数
return hashedCredentialsMatcher;
}
二:将密码凭证匹配器注入我们的realm中
在shiro配置文件ShiroConfig.java中:
/***
* 注入我们自定义的realm
* @return
*/
@Bean
public MyRealm myRealm() {
MyRealm myRealm = new MyRealm();
//将密码凭证匹配器注入自定义的Realm
myRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myRealm;
}
三:传参添加盐值
在自定义MyRealm的认证方法中,最后一句第三个参数传入盐值:
四:测试
1.先根据密码生成加密后的密码,可以通过下面的工具类来生成:
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
/**
* md5加密工具类
*/
public class MD5Util {
// 散列次数
private static final int HASHITERATIONS = 10;//觉得3次不够,就增加次数
// 内置salt
private static final String PUBLIC_SALT = "quyi";//随机生成的UUID当做公盐使用
/**
* @param source 要用公共盐加密的字符串
* @return 用共盐加密的密码
*/
private static String md5_public_salt(String source) {
return new Md5Hash(source, PUBLIC_SALT, HASHITERATIONS).toString();
}
/**
* @param source 原始密码
* @param salt 传入的私盐
* @return 二次加密后的密码
*/
public static String md5_private_salt(String source, String salt) {
//再对加密的后密文用私盐加密一次
return new Md5Hash(md5_public_salt(source), salt, HASHITERATIONS).toString();
}
//调用方法生成密码打印出来
public static void main(String[] args) {
String s = md5_public_salt("123");
System.out.println(s);
}
}
这里我用的盐值是固定的,正式开发中可以用动态生成的字符串,比如user表中多一个盐值字段存放每个用户的盐值,用户注册的时候随机生成一个uuid作为盐值保存起来。
2.将打印出来的加密之后的密码替换到数据库中,这里我用的是假数据,意会就行:
3.这个时候我们可以使用密码去登陆调试。