鍍金池/ 問答/Java/ Shifo密碼匹配,為什么使用明文密碼可以登錄,而使用加鹽加密的方式就不可以?

Shifo密碼匹配,為什么使用明文密碼可以登錄,而使用加鹽加密的方式就不可以?

想用Shiro實(shí)現(xiàn)自定義的密碼匹配,但無論給不給SimpleAuthenticationInfo加第三個(gè)參數(shù),都是在數(shù)據(jù)庫里存明文密碼時(shí)匹配成功。請(qǐng)問如何設(shè)置才能使用自定義的方式去匹配?

    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(),
            user.getPassword()
            ByteSource.Util.bytes(user.getCredentialsSalt()),
            getName() // realm name
    );
回答
編輯回答
孤星

1.數(shù)據(jù)庫是一定是加密后的密碼,用戶在前臺(tái)輸入用戶名和密碼,后臺(tái)對(duì)他的密碼進(jìn)行加密,然后和數(shù)據(jù)庫中的密碼進(jìn)行比對(duì),也有一種是不通過后臺(tái),直接通過前臺(tái)的javascript去加密,然后把加密的密碼去數(shù)據(jù)庫去比對(duì)。
1.更改shiro安全管理配置

<!-- 定義Shiro安全管理配置 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  

<!-- <property name="realm" ref="systemAuthorizingRealm" /> -->

    <property name="realm" ref="userRealm" />    
    <property name="sessionManager" ref="sessionManager" />  
    <property name="cacheManager" ref="shiroCacheManager" />  
</bean>  
  
<!-- 3.1 直接配置繼承了org.apache.shiro.realm.AuthorizingRealm的bean -->  
 <bean id="userRealm" class="com.thinkgem.jeesite.modules.sys.security.SystemAuthorizingRealm">   
    <!-- 配置密碼匹配器 -->   
   <property name="credentialsMatcher" ref="credentialsMatcher"/>     
</bean>  
  
 <!-- 憑證匹配器 -->  
<bean id="credentialsMatcher" class="com.thinkgem.jeesite.modules.sys.security.CustomCredentialsMatcher">  
</bean>   

<property name="realm" ref="systemAuthorizingRealm" /> ,Spring自動(dòng)注入。

2.自定義密碼驗(yàn)證

/**

  • Description: 告訴shiro如何驗(yàn)證加密密碼,通過SimpleCredentialsMatcher或HashedCredentialsMatcher
  • @Author: wjl
  • @Create Date: 2017-3-14

*/

public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {

  
@Override   
public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) {    
         
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;   
Object accountCredentials = getCredentials(info);  

// String pwd =encrypt32(String.valueOf(token.getPassword()));//md5 32位加密

String pwdType =String.valueOf(token.getPassword());// 判斷一下密碼是否是用戶輸入的,還是JCIS傳過來的  
if(pwdType.length() == 32){  
return equals(pwdType, accountCredentials); //密碼長度=32位,說明是md5加密過,是從xx傳進(jìn)來的 32位加密。  
}   
String pwdUser =encrypt32(String.valueOf(token.getPassword()));//不等于32 是用戶輸入的密碼。 如果用戶輸入的密碼長度位32那么里面會(huì)有一個(gè)bug  
return equals(pwdUser, accountCredentials);  
//將密碼加密與系統(tǒng)加密后的密碼校驗(yàn),內(nèi)容一致就返回true,不一致就返回false   
//return super.doCredentialsMatch(token, info) ;  
}  
  

3.更改密碼驗(yàn)證,注釋掉自帶的。

/** 
 * 設(shè)定密碼校驗(yàn)的Hash算法與迭代次數(shù) 
 */  

// @PostConstruct
// public void initCredentialsMatcher() {
// HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(SystemService.HASH_ALGORITHM);
// matcher.setHashIterations(SystemService.HASH_INTERATIONS);
// setCredentialsMatcher(matcher);
// // setCredentialsMatcher(new CustomCredentialsMatcher());
// }

如果不注釋就是用這種方式也可以。

/**

 * 設(shè)定密碼校驗(yàn)的Hash算法與迭代次數(shù) 
 */  
@PostConstruct  
public void initCredentialsMatcher() {    
   setCredentialsMatcher(new CustomCredentialsMatcher());    
}  
2017年12月10日 13:52