1. 程式人生 > >shiro學習三

shiro學習三

相同 col 比對 spa apache 次數 cred protect string

由於密碼的特殊性:

通常需要對密碼 進行散列,常用的有md5、sha,

對md5密碼,如果知道散列後的值可以通過窮舉算法,得到md5密碼對應的明文。

建議對md5進行散列時加salt(鹽),進行加密相當 於對原始密碼+鹽進行散列。

正常使用時散列方法:

在程序中對原始密碼+鹽進行散列,將散列值存儲到數據庫中,並且還要將鹽也要存儲在數據庫中。

如果進行密碼對比時,使用相同 方法,將原始密碼+鹽進行散列,進行比對。

加密代碼示例:

//原始 密碼
        String source = "111111";
        //
        String salt = "qwerty";
        
//散列次數 int hashIterations = 2; //上邊散列1次:f3694f162729b7d0254c6e40260bf15c //上邊散列2次:36f2dfa24d0a9fa97276abbe13e596fc Md5Hash md5Hash = new Md5Hash(source, salt, hashIterations); //構造方法中: //第一個參數:明文,原始密碼 //第二個參數:鹽,通過使用隨機數 //第三個參數:散列的次數,比如散列兩次,相當 於md5(md5(‘‘))
String password_md5 = md5Hash.toString(); System.out.println(password_md5); //第一個參數:散列算法 SimpleHash simpleHash = new SimpleHash("md5", source, salt, hashIterations); System.out.println(simpleHash);

實際開發時realm要進行md5值(明文散列後的值)的對比。

1、進行realm配置

[main]
#憑證匹配器
credentialsMatcher
=org.apache.shiro.authc.credential.HashedCredentialsMatcher #散列算法 credentialsMatcher.hashAlgorithmName=md5 #散列次數 credentialsMatcher.hashIterations=1 #將憑證匹配器設置給realm customRealm=shiro.realm.CustomRealmMd5 customRealm.credentialsMatcher=$credentialsMatcher securityManager.realms=$customRealm

2、在realm中進行比對

    //用於認證
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //token是用戶輸入的,
        //第一步,從token中取出身份信息
        String userCode = (String) token.getPrincipal();
        //第二部,根據用戶輸入的userCode從數據庫查詢
        //。。。。
        
        //未查到
        /*if(!userCode.equals("")){
            return null;
        }*/
        
        //模擬從數據庫中查到密碼
        String password = "36f2dfa24d0a9fa97276abbe13e596fc";//查到加密後的散列值
        String salt = "qwerty";



        //查詢不到返回null
        //查到了返回認證信息AuthenticationInfo
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userCode, password, ByteSource.Util.bytes(salt),this.getName());


        return authenticationInfo;
    }

shiro學習三