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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初次使用Shiro进行加密密码的算法实例

發布時間:2025/3/19 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初次使用Shiro进行加密密码的算法实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

Apache Shiro 是一個強大易用的 Java 安全框架,用以執行身份驗證、授權、密碼和會話管理,而且可以方便地被 Spring Boot 所集成。
大部分 Web 應用的用戶密碼一般通過散列算法 + 鹽的形式持久化在數據庫中。在使用 Shiro 進行身份驗證時,可以在 Shiro 配置類中配置密碼散列匹配器,來對數據庫中保存的密碼進行驗證。

實現

1.在接收到密碼的地方

String username = request.getUsername(); String password = request.getPassword(); String salt = SequenceUtil.getInst().getRandomCode(6); String encryptPassword = ShiroHelper.SHA1(password,username+salt);

初次使用SequenceUtil.getInst().getRandomCode(6);生成鹽值,存到數據庫。

以后登錄驗證時屏蔽這段代碼,使用數據庫存的鹽值去生成加密的密碼。

其中SequenceUtil代碼為:

import org.apache.commons.lang3.RandomStringUtils; public class SequenceUtil {private static SequenceUtil instance;public synchronized static SequenceUtil getInst() {if (instance == null) {instance = new SequenceUtil();}return instance;}public synchronized String getRandomCode(int num){String code = null;try {code = RandomStringUtils.random(num, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");} catch (Exception e) {}return code;} }

通過RandomStringUtils的random方法從第二個參數中隨機選取num個。

2.在ShiroHelper中

import org.apache.shiro.SecurityUtils; import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject;public class ShiroHelper {public? static final String SHIRO_USER = "badao";private static final String NAMES_DELIMETER = ",";/*** 散列算法*/public static final String ALGORITHM_SHA1 = "SHA-1";/*** 循環次數*/public final static int HASH_ITERATIONS = 10;/*** shiro密碼加密工具類** @param credentials 密碼* @param saltSource? 密碼鹽* @return*/public static String SHA1(String credentials, String saltSource) {return new SimpleHash(ALGORITHM_SHA1, credentials, saltSource, HASH_ITERATIONS).toHex();}/*** 獲取隨機鹽值** @param length 字節長度,一個字節2位16進制數表示* @return*/public static String getRandomSalt(int length) {return new SecureRandomNumberGenerator().nextBytes(length).toHex();}/*** 獲取當前 Subject** @return Subject*/public static Subject getSubject() {return SecurityUtils.getSubject();}/*** 獲取封裝的 ShiroUser** @return ShiroUser*/public static ShiroDefaultEntity getUser() {if (isGuest()) {return null;} else {return (ShiroDefaultEntity) getSubject().getPrincipals().getPrimaryPrincipal();}}/*** 從shiro獲取session*/public static Session getSession() {return getSubject().getSession();}/*** 獲取shiro指定的sessionKey*/@SuppressWarnings("unchecked")public static <T> T getSessionAttr(String key) {Session session = getSession();return session != null ? (T) session.getAttribute(key) : null;}/*** 設置shiro指定的sessionKey*/public static void setSessionAttr(String key, Object value) {Session session = getSession();session.setAttribute(key, value);}/*** 移除shiro指定的sessionKey*/public static void removeSessionAttr(String key) {Session session = getSession();if (session != null)session.removeAttribute(key);}/*** 驗證當前用戶是否屬于該角色?,使用時與lacksRole 搭配使用** @param roleName 角色名* @return 屬于該角色:true,否則false*/public static boolean hasRole(String roleName) {return getSubject() != null && roleName != null&& roleName.length() > 0 && getSubject().hasRole(roleName);}/*** 與hasRole標簽邏輯相反,當用戶不屬于該角色時驗證通過。** @param roleName 角色名* @return 不屬于該角色:true,否則false*/public static boolean lacksRole(String roleName) {return !hasRole(roleName);}/*** 驗證當前用戶是否屬于以下任意一個角色。** @param roleNames 角色列表* @return 屬于:true,否則false*/public static boolean hasAnyRoles(String roleNames) {boolean hasAnyRole = false;Subject subject = getSubject();if (subject != null && roleNames != null && roleNames.length() > 0) {for (String role : roleNames.split(NAMES_DELIMETER)) {if (subject.hasRole(role.trim())) {hasAnyRole = true;break;}}}return hasAnyRole;}/*** 驗證當前用戶是否屬于以下所有角色。** @param roleNames 角色列表* @return 屬于:true,否則false*/public static boolean hasAllRoles(String roleNames) {boolean hasAllRole = true;Subject subject = getSubject();if (subject != null && roleNames != null && roleNames.length() > 0) {for (String role : roleNames.split(NAMES_DELIMETER)) {if (!subject.hasRole(role.trim())) {hasAllRole = false;break;}}}return hasAllRole;}/*** 驗證當前用戶是否擁有指定權限,使用時與lacksPermission 搭配使用** @param permission 權限名* @return 擁有權限:true,否則false*/public static boolean hasPermission(String permission) {return getSubject() != null && permission != null&& permission.length() > 0&& getSubject().isPermitted(permission);}/*** 與hasPermission標簽邏輯相反,當前用戶沒有制定權限時,驗證通過。** @param permission 權限名* @return 擁有權限:true,否則false*/public static boolean lacksPermission(String permission) {return !hasPermission(permission);}/*** 已認證通過的用戶,不包含已記住的用戶,這是與user標簽的區別所在。與notAuthenticated搭配使用** @return 通過身份驗證:true,否則false*/public static boolean isAuthenticated() {return getSubject() != null && getSubject().isAuthenticated();}/*** 未認證通過用戶,與authenticated標簽相對應。與guest標簽的區別是,該標簽包含已記住用戶。。** @return 沒有通過身份驗證:true,否則false*/public static boolean notAuthenticated() {return !isAuthenticated();}/*** 認證通過或已記住的用戶。與guset搭配使用。** @return 用戶:true,否則 false*/public static boolean isUser() {return getSubject() != null && getSubject().getPrincipal() != null;}/*** 驗證當前用戶是否為“訪客”,即未認證(包含未記住)的用戶。用user搭配使用** @return 訪客:true,否則false*/public static boolean isGuest() {return !isUser();}/*** 輸出當前用戶信息,通常為登錄帳號信息。** @return 當前用戶信息*/public static String principal() {if (getSubject() != null) {Object principal = getSubject().getPrincipal();return principal.toString();}return "";}}

?

總結

以上是生活随笔為你收集整理的初次使用Shiro进行加密密码的算法实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。