關于shiro的一些其它知識點
一、加密
散列算法一般用于生成數據的摘要信息,是一種不可逆的算法,一般適合存儲密碼之類的數據,常見的散列算法如MD5、SHA等。一般進行散列時最好提供一個salt(鹽),比如加密密碼“admin”,產生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一
些md5 解密網站很容易的通過散列值得到密碼“admin”,即如果直接對密碼進行散列相對來說破解更容易,此時我們可以加一些只有系統知道的干擾數據,如用戶名和ID(即鹽);
這樣散列的對象是“密碼+用戶名+ID”,這樣生成的散列值相對來說更難破解。
二、shiro對加密的支持(使用shiro自身的密碼驗證,是需要配置的,否則要自己提供驗證方案)
Shiro 提供了CredentialsMatcher 的散列實現HashedCredentialsMatcher實現密碼驗證服務,它只用于密碼驗證,且可以提供自己的鹽,而不是隨機生成鹽,且生成密碼散列值的算法需要自己寫,因為能提供自己的鹽。
image.png
image.png
例子如下:
通過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;
}