shiro教程3(加密)

加密,是以某種特殊的算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法瞭解信息的內容

概念

數據加密的基本過程就是對原來為明文的文件或數據按某種算法進行處理,使其成為不可讀的一段代碼,通常稱為”密文”,使其只能在輸入相應的密鑰之後才能顯示出本來內容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。該過程的逆過程為解密,即將該編碼信息轉化為其原來數據的過程。

加密分類

對稱加密

雙方使用的同一個密鑰,既可以加密又可以解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

非對稱加密

一對密鑰由公鑰和私鑰組成(可以使用很多對密鑰)。私鑰解密公鑰加密數據,公鑰解密私鑰加密數據(私鑰公鑰可以互相加密解密)。

加密算法分類

單向加密

單向加密是不可逆的,也就是隻能加密,不能解密。通常用來傳輸類似用戶名和密碼,直接將加密後的數據提交到後臺,因為後臺不需要知道用戶名和密碼,可以直接將收到的加密後的數據存儲到數據庫

雙向加密

通常分為對稱性加密算法和非對稱性加密算法,對於對稱性加密算法,信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之後便是對數據進行 加解密了。非對稱算法與之不同,發送雙方A,B事先均生成一堆密匙,然後A將自己的公有密匙發送給B,B將自己的公有密匙發送給A,如果A要給B發送消 息,則先需要用B的公有密匙進行消息加密,然後發送給B端,此時B端再用自己的私有密匙進行消息解密,B向A發送消息時為同樣的道理。

常見算法

shiro教程3(加密)

MD5的使用

@Test
public void Md5Test() {
\t// 對單個信息加密
\tMd5Hash md5 = new Md5Hash("123456");
\tSystem.out.println(md5.toString());
\t// 加密添加鹽值 增大解密難度
\tmd5 = new Md5Hash("123456","aaa");
\tSystem.out.println(md5.toString());
\t// 加密添加鹽值 增大解密難度 2迭代兩次
\tmd5 = new Md5Hash("123456","aaa",2);
\tSystem.out.println(md5);
}

輸出的結果:

e10adc3949ba59abbe56e057f20f883e
88316675d7882e3fdbe066000273842c
a7cf41c6537065fe724cc9980f8b5635

鹽值的作用

使用MD5存在一個問題,相同的password生成的hash值是相同的,如果兩個用戶設置了相同的密碼,那麼數據庫中會存儲兩個相同的值,這是極不安全的,加Salt可以在一定程度上解決這一問題,所謂的加Salt方法,就是加點‘佐料’。其基本想法是這樣的,當用戶首次提供密碼時(通常是註冊時)由系統自動往這個密碼裡撒一些‘佐料’,然後在散列,而當用戶登錄時,系統為用戶提供的代碼上撒上相同的‘佐料’,然後散列,再比較散列值,來確定密碼是否正確。

加鹽的原理:

給原文加入隨機數生成新的MD5的值

shiro中使用MD5加密

認證方法中修改

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
\t// 獲取賬號信息
\tString principal = (String) token.getPrincipal();
\t// 正常邏輯此處應該根據賬號去數據庫中查詢,此處我們默認賬號為 root 密碼123456
\t// 驗證賬號
\tif(!"root".equals(principal)){
\t\t// 賬號錯誤
\t\treturn null;
\t}
\t//String pwd = "123456";
\t// 12345 根據 鹽值 aaa 加密獲取的密文
\t//88316675d7882e3fdbe066000273842c 1次迭代的密文
\t//a7cf41c6537065fe724cc9980f8b5635 2次迭代的密文
\tString pwd = "88316675d7882e3fdbe066000273842c";
\t// 驗證密碼
\tAuthenticationInfo info = new SimpleAuthenticationInfo(
\t\t\tprincipal, pwd,new SimpleByteSource("aaa"),"myrealm");
\treturn info;
}
shiro教程3(加密)

ini.xml文件修改

[main]
#定義憑證匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#散列算法
credentialsMatcher.hashAlgorithmName=md5
#散列次數
credentialsMatcher.hashIterations=1

#將憑證匹配器設置到realm
customRealm=com.dpb.realm.MyRealm
customRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$customRealm

測試

@Test
public void test() {
\t// 1.獲取SecurityManager工廠對象
\tFactory<securitymanager> factory =
\t\t\tnew IniSecurityManagerFactory("classpath:shiro.ini");
\t// 2.通過Factory對象獲取SecurityManager對象
\tSecurityManager securityManager = factory.getInstance();
\t// 3.將SecurityManager對象添加到當前運行環境中
\tSecurityUtils.setSecurityManager(securityManager);
\t
\t// 4.獲取Subject對象
\tSubject subject = SecurityUtils.getSubject();
\tAuthenticationToken token = new UsernamePasswordToken("root", "123456");
\t// 登錄操作
\ttry {
\t\tsubject.login(token);
\t} catch (UnknownAccountException e) {
\t\tSystem.out.println("賬號出錯...");
\t} catch(IncorrectCredentialsException e){
\t\tSystem.out.println("密碼出錯...");
\t}
\t// 獲取登錄的狀態
\tSystem.out.println(subject.isAuthenticated());

}/<securitymanager>

迭代1次

shiro教程3(加密)

shiro教程3(加密)

shiro教程3(加密)

迭代兩次

shiro教程3(加密)

shiro教程3(加密)

shiro教程3(加密)

shiro教程3(加密)


分享到:


相關文章: