关于shiro的一些其它知识点
一、加密
散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一
些md5 解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);
这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。
二、shiro对加密的支持(使用shiro自身的密码验证,是需要配置的,否则要自己提供验证方案)
Shiro 提供了CredentialsMatcher 的散列实现HashedCredentialsMatcher实现密码验证服务,它只用于密码验证,且可以提供自己的盐,而不是随机生成盐,且生成密码散列值的算法需要自己写,因为能提供自己的盐。
例子如下:
通过ByteSource.Util.bytes方法将用户名和随机值一起组合成盐,再与密码一起进行MD5加密,且迭代两次。由于随机值生成后保存在数据库,对外是隐藏的,不容易被破解,且保证了如果多个用户密码一样,加密后的字符串是不同的。
public static RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
/**加密算法*/
public static final String ALGORITHMNAME = "md5";
/**迭代次数*/
public static final int HASHITERATIONS = 2;
/**生成随机盐*/
public static String createCredentialsSalt(){
String salt=randomNumberGenerator.nextBytes().toHex();
return salt;
}
/**加密密码*/
public static String encryptPassword(String username,String Password,String credentialsSalt) {
String newPassword = new SimpleHash(ALGORITHMNAME, Password, ByteSource.Util.bytes(username+credentialsSalt), HASHITERATIONS).toHex();
return newPassword;
}