SpringBoot整合Shiro(三)

關于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;
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容