日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shiro进行散列算法操作

發(fā)布時(shí)間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro进行散列算法操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

shiro最閃亮的四大特征:認(rèn)證,權(quán)限,加密,會(huì)話管理

為了提高應(yīng)用系統(tǒng)的安全性,這里主要關(guān)注shiro提供的密碼服務(wù)模塊;

1.加密工具類的熟悉

首先來個(gè)結(jié)構(gòu)圖,看看shiro提供了哪些加密工具類:

2.通過shiro進(jìn)行散列算法操作,常見的有兩個(gè)MD5,SHA-1

簡(jiǎn)單的散列操作:代碼如下

<span style="font-size:18px;">public static void test1() { // 假設(shè)是用戶輸入的密碼 String password = "123456"; // 加入的鹽(百度百科有) String salt = "jack"; // 這是最原始的MD5加密 (可在網(wǎng)上破解) Md5Hash originalMd5 = new Md5Hash(password); System.out.println(originalMd5.toString());// 輸出加密后的密碼 // 這種也是原始md5加密(可在網(wǎng)上破解) SimpleHash originalMd52 = new SimpleHash("MD5", password);// 構(gòu)造函數(shù)中的 "MD5"的意思是進(jìn)行md5加密,大小寫無關(guān) System.out.println(originalMd52.toString()); // sha-1 原始加密方法(可在網(wǎng)上破解) SimpleHash originalSha1 = new SimpleHash("SHA-1", password);// System.out.println(originalSha1.toString()); // 要加大破解難度,這時(shí)候加個(gè)'鹽'來加密是爽歪歪的 // 第1種MD5加鹽加密操作 Md5Hash newPassword = new Md5Hash(password, salt, 1);// 第三個(gè)參數(shù) "1"的意思是循環(huán)加密多少次 System.out.println(newPassword.toString()); // 第2種MD5加鹽加密操作 SimpleHash sh = new SimpleHash("MD5", password, salt, 1);// 第四個(gè)參數(shù) "1"的意思是循環(huán)加密多少次 System.out.println(sh.toString()); // 第2種SHA-1加鹽加密操作 SimpleHash sh2 = new SimpleHash("SHA-1", password, salt, 1);// 第四個(gè)參數(shù) "1"的意思是循環(huán)加密多少次 System.out.println(sh2.toString()); }</span>

不過我們平常是得把散列的加密方式配置到ini文件中,實(shí)際項(xiàng)目上我們不可能把用戶的賬號(hào)和密碼寫在ini配置文件中,而是通過數(shù)據(jù)庫(kù)查詢進(jìn)行處理的,所以要用到自定義,其實(shí)就是加上數(shù)據(jù)庫(kù)的操作而已。配置文件如下:shiro_hash.ini?? 注意:ini文件是以;開始的

<span style="font-size:18px;">[main] ;認(rèn)證適配器 hashedCredentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher ;加密的方式_MD5 hashedCredentialsMatcher.hashAlgorithmName=MD5;;循環(huán)加密多少次 hashedCredentialsMatcher.hashIterations=1自定義的realm 認(rèn)證 HashRealm=com.ywj.TestShiro.HashRealm ;自定義的realm的認(rèn)證適配器 HashRealm.credentialsMatcher=$hashedCredentialsMatcher ;加入securityManager中 securityManager.realms=$HashRealm; </span>

自定義的Realm:

<span style="font-size:18px;">import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; public class HashRealm extends AuthorizingRealm { @Override public void setName(String name) { super.setName("HashRealm");// 自定義一個(gè)名字 } // 認(rèn)證不關(guān)這塊的事,先空著先 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // TODO Auto-generated method stub return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 獲取token里的賬號(hào) String username = String.valueOf(token.getPrincipal()); // 假設(shè)這里是邏輯是從數(shù)據(jù)庫(kù)獲取用戶信息不存在 if(StringUtils.isBlank(username) || "a".equals(username)) { return null;// 返回一個(gè)空,就是沒這個(gè)用戶存在 } //String salt = "jack"; String password = "4da71e0c7f2fa0ff8a25ecc4f5dab6d4";// 假設(shè)這個(gè)是數(shù)據(jù)庫(kù)里查詢出來的用戶密碼MD5加密后的 // 返回認(rèn)證信息 return new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes(salt), this.getName()); } }<span style="color:#ff6666;"> </span></span>

?http://blog.csdn.net/u013845177/article/details/77620957

轉(zhuǎn)載于:https://www.cnblogs.com/leibao/p/8488713.html

總結(jié)

以上是生活随笔為你收集整理的shiro进行散列算法操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。