淺談Shiro框架中的加密演算法,以及校驗
在涉及到密碼儲存問題上,應該加密/生成密碼摘要儲存,而不是儲存明文密碼。為什麼要加密:網路安全問題是一個很大的隱患,使用者資料洩露事件層出不窮,比如12306賬號洩露。
Shiro提供了base64和16進位制字串編碼/解碼的API支援,方便一些編碼解碼操作,想了解自己百度API操作用法。
看一張圖,瞭解Shiro提供的加密演算法:
本文重點講shiro提供的第二種:不可逆加密。
雜湊演算法一般用於生成資料的摘要資訊,是一種不可逆的演算法,一般適合儲存密碼之類的資料,常見的雜湊演算法如MD5、SHA等。一般進行雜湊時最好提供一salt(鹽),比如加密密碼“admin”,產生的雜湊值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些md5解密網站很容易的通過雜湊值得到密碼“admin”,即如果直接對密碼進行雜湊相對來說破解更容易,此時我們可以加一些只有系統知道的干擾資料,如使用者名稱和ID(即鹽);這樣雜湊的物件是“密碼+使用者名稱+ID”,這樣生成的雜湊值相對來說更難破解。
常見的演算法有:MD5,SHA演算法:
MD5演算法是1991年釋出的一項數字簽名加密演算法,它當時解決了MD4演算法的安全性缺陷,成為應用非常廣泛的一種演算法。作為Hash函式的一個應用例項。
SHA誕生於1993年,全稱是安全雜湊演算法(Secure Hash Algorithm),由美國國家安全域性(NSA)設計,之後被美國標準與技術研究院(NIST)收錄到美國的聯邦資訊處理標準(FIPS)中,成為美國國家標準,SHA(後來被稱作SHA-0)於1995被SHA-1(RFC3174)替代。SHA-1生成長度為160bit的摘要資訊串,雖然之後又出現了SHA-224、SHA-256、SHA-384和SHA-512等被統稱為“SHA-2”的系列演算法,但仍以SHA-1為主流。
資料庫User設計:
- CREATE TABLE `sys_users` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `username` varchar(100) DEFAULT NULL,
- `password` varchar(100) DEFAULT NULL,
- `salt` varchar(100) DEFAULT NULL,
- `locked` tinyint(1) DEFAULT '0',
- PRIMARY KEY (`id`),
- UNIQUE KEY `idx_sys_users_username` (`username`)
- ) ENGINE=InnoDBAUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
- 說明:id主鍵欄位
- username 登入的使用者名稱
- passowrd 登入的密碼
- salt 鹽
- locked 鎖定 預設為0(false)表示沒有鎖
使用者表User:
- package com.lgy.model;
- import org.springframework.util.CollectionUtils;
- import org.springframework.util.StringUtils;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- public class User implements Serializable {
- private static final long serialVersionUID = -651040446077267878L;
- private Long id; //編號
- private Long organizationId; //所屬公司
- private String username; //使用者名稱
- private String password; //密碼
- private String salt; //加密密碼的鹽
- private List<Long> roleIds; //擁有的角色列表
- private Boolean locked = Boolean.FALSE;
- public User() {
- }
- public User(String username, String password) {
- this.username = username;
- this.password = password;
- }
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public Long getOrganizationId() {
- return organizationId;
- }
- public void setOrganizationId(Long organizationId) {
- this.organizationId = organizationId;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getSalt() {
- return salt;
- }
- public void setSalt(String salt) {
- this.salt = salt;
- }
- //證書憑證
- public String getCredentialsSalt() {
- return username + salt;
- }
- public List<Long> getRoleIds() {
- if(roleIds == null) {
- roleIds = new ArrayList<Long>();
- }
- return roleIds;
- }
- public void setRoleIds(List<Long> roleIds) {
- this.roleIds = roleIds;
- }
- public String getRoleIdsStr() {
- if(CollectionUtils.isEmpty(roleIds)) {
- return "";
- }
- StringBuilder s = new StringBuilder();
- for(Long roleId : roleIds) {
- s.append(roleId);
- s.append(",");
- }
- return s.toString();
- }
- public void setRoleIdsStr(String roleIdsStr) {
- if(StringUtils.isEmpty(roleIdsStr)) {
- return;
- }
- String[] roleIdStrs = roleIdsStr.split(",");
- for(String roleIdStr : roleIdStrs) {
- if(StringUtils.isEmpty(roleIdStr)) {
- continue;
- }
- getRoleIds().add(Long.valueOf(roleIdStr));
- }
- }
- public Boolean getLocked() {
- return locked;
- }
- public void setLocked(Boolean locked) {
- this.locked = locked;
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- User user = (User) o;
- if (id != null ? !id.equals(user.id) : user.id != null) return false;
- return true;
- }
- @Override
- public int hashCode() {
- return id != null ? id.hashCode() : 0;
- }
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", organizationId=" + organizationId +
- ", username='" + username + '\'' +
- ", password='" + password + '\'' +
- ", salt='" + salt + '\'' +
- ", roleIds=" + roleIds +
- ", locked=" + locked +
- '}';
-
相關推薦
淺談Shiro框架中的加密演算法,以及校驗
在涉及到密碼儲存問題上,應該加密/生成密碼摘要儲存,而不是儲存明文密碼。為什麼要加密:網路安全問題是一個很大的隱患,使用者資料洩露事件層出不窮,比如12306賬號洩露。Shiro提供了base64和16進位制字串編碼/解碼的API支援,方便一些編碼解碼操作,想了解自己
使用bcryptjs對密碼加密時,其校驗原理是怎樣的?
Question 剛開始接觸這種加密方式,而又對加密原理不瞭解時,很容易產生這種疑問❔: 對一個密碼,bcryptjs每次生成的hash都不一樣,那麼它是如何進行校驗的? Basic
淺談遠程登錄時,ssh的加密原理
回車 直接 phrase 允許 輸入密碼 tar continue 兩種 left 登錄方式主要有兩種: 1、基於用戶密碼的登錄方式: 加密原理: 當服務器知道用戶請求登錄時,服務器會把自己的公鑰發給用戶,ssh會將服務器的公鑰存放在客戶端的~/.ssh/
淺談C#語言中的各種數據類型,與數據類型之間的轉換
優化配置 line com 歸類 浮點 初學者 結構 ali 順序 什麽是數據類型? 數據類型,百度百科是這樣解釋的:數據類型在數據結構中的定義是一個值的集合以及定義在這個值集上的一組操作。這樣的解釋對於一個初學者來說未必太過於深奧。 簡單點說,數據類型就是不同長度的數據的
淺談網路爬蟲中深度優先演算法和簡單程式碼實現
學過網站設計的小夥伴們都知道網站通常都是分層進行設計的,最上層的是頂級域名,之後是子域名,子域名下又有子域名等等,同時,每個子域名可能還會擁有多個同級域名,而且URL之間可能還有相互連結,千姿百態,由此構成一個複雜的網路。 當一個網站的URL非常多的時候,我們務必要設計好URL,否則在後期的理解
淺談網路爬蟲中廣度優先演算法和程式碼實現
前幾天給大家分享了網路爬蟲中深度優先演算法的介紹及其程式碼實現過程,沒來得及上車的小夥伴們可以戳這篇文章——淺談網路爬蟲中深度優先演算法和簡單程式碼實現。今天小編給大家分享網路爬蟲中廣度優先演算法的介紹及其程式碼實現過程。 廣度優先演算法和深度優先演算法恰好相反,這裡繼續以上圖的二叉樹為例。
淺談web工程中BeanUtils的封裝MyBeanUtils,populate方法使用 【接收前端form表單資料】
宣告本測試使用JDK9,Tomcat9.0.10 ,IDEA2018.2 ; 淺談 BeanUtils 的封裝 , BeanUtils 類中方法 populate (Object be
淺談Spring框架,自動注入物件IoC/DI的過程(二)
在上一篇部落格中,我已經寫到怎麼用自動注入的物件了。可能我說的不是太清楚,有些朋友還不是很明白,那麼這次我們結合service層呼叫DAO層的方法,再詳細說說怎麼隨心所欲的使用物件。 先看一下程式碼:
Shiro框架中有三個核心概念:Subject ,SecurityManager和Realms。
2.1.2 SecurityManagerSubject的“幕後”推手是SecurityManager。Subject代表了當前使用者的安全操作,SecurityManager則管理所有使用者的安全操作。它是Shiro框架的核心,充當“保護傘”,引用了多個內部巢狀安全元件,它們形成了物件圖。但是,一旦S
【淺談JavaEE框架】Spring中@Autowired標籤與@Resource標籤的區別
@Autowired Spring 2.5 引入了 @Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。 要實現我們要精簡程式的目的。 @Autowired預設
【遊戲開發】淺談遊戲開發中常見的設計原則
依賴關系 unity 說過 srp des log gof https 類繼承 俗話說得好:“設計模式,常讀常新~”。的確,每讀一遍設計模式都會有些新的體會和收獲。馬三不才,才讀了兩遍設計模式(還有一遍是在學校學的),屬於菜鳥級別的。這次準備把閱
淺談Nginx服務器的安裝,升級、配置、LNMP平臺搭建、nginx+fastcgi、nginx高級技術-地址重寫及優化
perl 新的 大文件 文件的 add 並發連接數 文件配置 redirect ntp Nginx服務器:是俄羅斯人編寫的十分輕量級的HTTP服務器,是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP代理服務器 一、安裝Nginx軟件: 準備工
淺談網絡中的IP地址
網絡ip 思科 華為 IP地址是現在生活中不可或缺的,互聯網的運用,使我們的生活變得多元化,充滿樂趣。想了解這一切,需要先從根本了解,今天淺談以下IP地址,從以下幾個方面介紹; 一.IP地址的作用:在一定範圍,唯一的標示,一個上網的設備;(凡是需要上網的設備,必須得有IP地址)
JAVAEE企業級應用開發淺談之MVC 中的V-VIEW視圖
插入 第一次 開發 優點 就會 mil 是否 javaee 方便 Step1.情景概要 Hello,小夥伴們,好久不見,之前跟大家分享了三層架構與MVC思想,相信大家對於這兩塊內容有了相對清晰的個人認識了,既然我們講到了MVC,這裏我們接著這塊內容繼續往下深入,今天我們來看
淺談tomcat優化(內存,並發,緩存,安全,網絡,系統等)
mps config 兩種 問題 adding back get ces hit 一.Tomcat內存優化Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數JAVA_OPT
前端知識 | 淺談在React中使用echarts
har family spa microsoft -- nbsp date text break 方法一:echarts-for-react 是一個非常簡單的針對於 React 的 Echarts 封裝插件。和使用所有其他插件一樣,首先,我們需要 install 它:第一步
學習之路(五)淺談:三種語句結構,vim編輯器快捷鍵及使用方法,find命令使用
vim編輯器循環;forwhileuntil for 變量 in 列表; do 循環體 done e.g for I in ‘seq 1 $FILE‘ ; doecho "Hello,‘head -n $I
淺談常用視頻加密原理及加密的幾種應用形式
課程 所有 客戶 直接 無限 最終 技術 網頁 現在 一、視頻加密視頻加密是對某些自有版權的視頻進行加密處理,用戶只有在一定的條件下才能獲得視頻的觀看權。比如對於教育視頻加密後,只有學員才能觀看,每個學員都有自己的唯一賬號。或者說設定在一定的時間內可以無限次觀看,還有就是不
淺談Exchange 2010中客戶端訪問服務器陣列ClientAccessArray
忽略 介紹 con 單獨 mark cit type cto 創建 除了 RPC 客戶端訪問服務之外,Exchange 2010 還向 Exchange 組織引入了一個新的邏輯結構:客戶端訪問服務器陣列(Client Access Server Array)。當在某個 Ac
極限工坊淘小咖淺談:實體餐飲業的變革,線上擁抱線下,小程序的新零售
利用 網上 積分 新希望 都是 微信小程序 新的 附近 第三方服務 隨著互聯網的極速發展,人們的日常生活節奏逐漸加快,實體商家的經營的商鋪營業額已經到達率了瓶頸期,一些經常關註互聯網的商家早已經察覺小程序這是個新的風口,而互聯網的發展,也已經讓實體商家不得不做起線上+線下的