shiro學習三
阿新 • • 發佈:2017-08-06
相同 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學習三