1. 程式人生 > >Shiro(4)-Shiro密碼加密

Shiro(4)-Shiro密碼加密

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();