Shiro(4)-Shiro密碼加密
阿新 • • 發佈:2018-11-01
md5加密
在線上系統的資料庫中儲存的密碼不應該是明文,而是密碼加密後的字串,並且要求加密演算法是不可逆的。
著名的加密演算法有MD5、SHA1等。其中MD5是目前比較可靠的不可逆的加密方式。
而在Shiro中,如果我們需要對密碼進行加密,並且能讓Shiro能夠自動的對使用者輸入的密碼進行加密之後,再與資料庫中的加密後的密碼進行匹配需要讓Shiro的自定義Realm去使用帶有加密
機制的CredentialsMatcher密碼匹配類。
<bean id="userRealm" class="cn.QEcode.realm.UserRealm">
<!-- 配置密碼匹配器 -->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!-- 加密演算法為MD5 -->
<property name="hashAlgorithmName" value="MD5"></property>
<!-- 加密次數 -->
<property name="hashIterations" value="2"></property>
</bean>
</property>
</bean>
這裡配置了credentialsMatcher,那麼UserRealm在對密碼進行匹配時,會先對使用者輸入的密碼進行兩次的md5加密,再與資料庫中的密碼匹配.
加鹽
一般情況下,我們不會直接對密碼進行md5加密,畢竟有的人會把密碼設得極為簡單,比如123,111之類,而這類密碼就算是用md5加密後,還是很容易就會被破解的,所以我們在加密的時候會加上鹽值.
鹽值:其實就是一個字串,一般是一個使用者特有的屬性,如email.
加鹽:在加密的時候,不是對密碼進行加密,而是對密碼+鹽值進行加密.
//用郵箱作為鹽值
ByteSource credentialsSalt = ByteSource.Util.bytes(user.getEmail());
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),getName());
info.setCredentialsSalt(credentialsSalt);
這樣Shiro在驗證的時候就會對密碼加鹽,然後進行兩次MD5加密,再與資料庫中的密碼進行匹配.
注意
當然,因為我們在驗證的時候使用了md5加密,所以我們在新增密碼到資料庫的時候,也要對密碼進行加密.而且當用戶的email改變的時候,記得也要重新修改密碼.
String password = new Md5Hash(password,email,2).toString();