【SpringBoot】隨機鹽值+雙重SHA256加密實戰

目錄:

1.SHA-256和隨機鹽值

2.前端實現

3.后端實現

1.SHA-256和Salt

1.1.什么是SHA-256

SHA-256是一種信息摘要算法,也是一種密碼散列函數。對于任意長度的消息,SHA256都會產生一個256bit長的散列值(哈希值),用于確保信息傳輸完整一致,稱作消息摘要。這個摘要相當于是個長度為32個字節的數組,通常用一個長度為64的十六進制字符串來表示。

SHA-256的具備以下幾個關鍵特點:

  1. 固定長度輸出:無論輸入數據的大小,SHA-256都會產生一個256位(32字節)的固定長度散列值。
  2. 不可逆性:SHA-256的設計使得從生成的散列值無法還原原始輸入數據。這種不可逆性在安全性上是非常重要的。
  3. 抗碰撞性:找到兩個不同的輸入數據具有相同的散列值(碰撞)是極其困難的。雖然理論上碰撞可能發生,但SHA-256被設計得非常抗碰撞。

除了SHA-256之外,還有一個密碼散列函數MD5,過去也常被用于密碼加密,但MD5在安全性上低于SHA-256,現在已經很少用于密碼加密了,本文不做考慮。

SHA-256 和 MD5 的比較:

特性SHA-256MD5
輸出長度256 位(64 個十六進制字符)128 位(32 個十六進制字符)
安全性
計算速度較慢
抗碰撞能力
應用場景數據完整性校驗、數字簽名、密碼存儲、區塊鏈曾用于文件校驗、密碼存儲
推薦使用

1.2.什么是隨機鹽值

鹽值(salt) 是一種在密碼學和安全計算中常用的隨機數據,用于增強密碼散列的安全性。

隨機鹽值(random salt)是一種用于增強密碼散列安全性的技術。它是一個隨機生成的數據塊,在將密碼輸入散列函數之前,將鹽值與密碼組合。通過引入隨機鹽值,可以有效地防止彩虹表攻擊和相同密碼散列值重復的問題。

鹽值的作用:

  1. 防止彩虹表攻擊: 彩虹表是一個預計算的哈希值數據庫,用于快速查找常見密碼的哈希值。通過在密碼哈希之前加入隨機鹽值,即使密碼相同,其最終的哈希值也會不同,從而使彩虹表無效。
  2. 避免散列值重復: 如果兩個用戶使用相同的密碼,在沒有鹽值的情況下,他們的哈希值會相同。加入鹽值后,即使密碼相同,生成的哈希值也會不同,這有助于防止攻擊者通過觀察哈希值來推測用戶是否使用了相同的密碼。
  3. 增加攻擊難度: 鹽值增加了密碼哈希的復雜性。即使攻擊者獲取了存儲的哈希值和鹽值,他們仍需對每個鹽值進行單獨的暴力破解,顯著增加了破解的時間和計算成本。

1.3.如何進行加密操作

本文采用的加密方式是在前端采用md加密防止明文傳輸,后端對密碼二次加密后再進行隨機鹽值的混入。

2.前端實現

引入md5.min.js

<!DOCTYPE html>
<html lang="en"xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>登錄</title><!-- jquery --><script type="text/javascript" th:src="@{/js/jquery.min.js}"></script><!-- bootstrap --><link rel="stylesheet" type="text/css" th:href="@{/bootstrap/css/bootstrap.min.css}"/><script type="text/javascript" th:src="@{/bootstrap/js/bootstrap.min.js}"></script><!-- jquery-validator --><script type="text/javascript" th:src="@{/jquery-validation/jquery.validate.min.js}"></script><script type="text/javascript" th:src="@{/jquery-validation/localization/messages_zh.min.js}"></script><!-- md5.js --><script type="text/javascript" th:src="@{/js/md5.min.js}"></script><!-- common.js --><script type="text/javascript" th:src="@{/js/common.js}"></script>
</head>
<body>
<form name="loginForm" id="loginForm" method="post" style="width:50%; margin:0 auto"><h2 style="text-align:center; margin-bottom: 20px">用戶登錄</h2><div class="form-group"><div class="row"><label class="form-label col-md-4">請輸入手機號碼</label><div class="col-md-5"><input id="mobile" minlength="11" maxlength="11" name="mobile" class="form-control" type="text" placeholder="手機號碼" required="true"/></div></div></div><div class="form-group"><div class="row"><label class="form-label col-md-4">請輸入密碼</label><div class="col-md-5"><input id="password" name="password" class="form-control" type="password" placeholder="密碼" required="true" /></div></div></div><div class="row"><div class="col-md-5"><button class="btn btn-primary btn-block" type="reset" onclick="reset()">重置</button></div><div class="col-md-5"><button class="btn btn-primary btn-block" type="submit" onclick="login()">登錄</button></div></div>
</form>
</body>
<script>function login() {$("#loginForm").validate({submitHandler: function (form) {doLogin();}});}function doLogin() {var inputPass = $("#password").val();var salt = "1a2b3c4d";var str = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);var password = md5(str);$.ajax({url: "/login/doLogin",type: "POST",data: {mobile: $("#mobile").val(),password: password},success: function (data) {layer.closeAll();if (data.code == 200) {layer.msg("成功");console.log(data);document.cookie = "userTicket=" + data.object;window.location.href = "/goods/toList";} else {layer.msg(data.message);}},error: function () {layer.closeAll();}});}
</script>
</html>

3.后端實現

3.1.導入Maven依賴

 <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>

3.2.密碼加密

3.2.1.密碼加鹽

首先使用Apache的RandomStringUtils工具類,生成16位的鹽值。然后將鹽拼接到明文后面,進行SHA256加密。

這個加密后的SHA256是個固定64長度的字符串。

// 生成一個16位的隨機數,也就是鹽
String salt = RandomStringUtils.randomAlphanumeric(16);// 將鹽拼接到明文后,并生成新的sha256碼
String sha256Hex = DigestUtils.sha256Hex(password + salt);
3.2.2.隨機鹽值混合

加鹽后的SHA256碼長度為80位,這里我們采用的鹽值混合規則:將SHA-256散列值的每四個字符中間插入一個鹽值字符,依次交替排列。

// 將鹽混到新生成的SHA-256碼中,之所以這樣做是為了后期解密,校驗密碼
StringBuilder sb = new StringBuilder(80); // SHA-256是64個字符,加16個字符的鹽,總共80個字符
for (int i = 0; i < 16; i++) {sb.append(sha256Hex.charAt(i * 4));sb.append(salt.charAt(i));sb.append(sha256Hex.charAt(i * 4 + 1));sb.append(sha256Hex.charAt(i * 4 + 2));sb.append(sha256Hex.charAt(i * 4 + 3));
}
return sb.toString();

這樣就完成了加密的操作:密碼加鹽 + 鹽值混合

3.3.密碼解密

3.3.1.提取鹽值和加鹽密碼

按照加密時采用的規則:將SHA-256散列值的每四個字符中間插入一個鹽值字符,依次交替排列。

我們可以將鹽值和加鹽后的SHA-256碼

// 提取鹽值和加鹽后的SHA-256碼
StringBuilder sb1 = new StringBuilder(64);
StringBuilder sb2 = new StringBuilder(16);for (int i = 0; i < 16; i++) {sb1.append(encrypted.charAt(i * 5));sb1.append(encrypted.charAt(i * 5 + 2));sb1.append(encrypted.charAt(i * 5 + 3));sb1.append(encrypted.charAt(i * 5 + 4));sb2.append(encrypted.charAt(i * 5 + 1));
}String sha256Hex = sb1.toString();
String salt = sb2.toString();
3.3.2.比較密碼

最后,將取出的鹽值與原始密碼再次加鹽,再次得到加鹽密碼,與sha256Hex比較即可判斷密碼是否相同。

// 比較二者是否相同
return  DigestUtils.sha256Hex(password + salt).equals(sha256Hex);

3.4.完整工具類

public class SHA256Util {/*** 加密* 生成鹽和加鹽后的SHA-256碼,并將鹽混入到SHA-256碼中,對SHA-256密碼進行加強**/public static String encryptPassword(String password) {// 生成一個16位的隨機數,也就是鹽String salt = RandomStringUtils.randomAlphanumeric(16);// 將鹽拼接到明文后,并生成新的sha256碼String sha256Hex = DigestUtils.sha256Hex(password + salt);// 將鹽混到新生成的SHA-256碼中,之所以這樣做是為了后期解密,校驗密碼StringBuilder sb = new StringBuilder(80); // SHA-256是64個字符,加16個字符的鹽,總共80個字符for (int i = 0; i < 16; i++) {sb.append(sha256Hex.charAt(i * 4));sb.append(salt.charAt(i));sb.append(sha256Hex.charAt(i * 4 + 1));sb.append(sha256Hex.charAt(i * 4 + 2));sb.append(sha256Hex.charAt(i * 4 + 3));}return sb.toString();}/*** 解密* 從混入鹽的SHA-256碼中提取鹽值和加鹽后的SHA-256碼**/public static boolean verifyPassword(String password, String encrypted) {// 提取鹽值和加鹽后的SHA-256碼StringBuilder sb1 = new StringBuilder(64);StringBuilder sb2 = new StringBuilder(16);for (int i = 0; i < 16; i++) {sb1.append(encrypted.charAt(i * 5));sb1.append(encrypted.charAt(i * 5 + 2));sb1.append(encrypted.charAt(i * 5 + 3));sb1.append(encrypted.charAt(i * 5 + 4));sb2.append(encrypted.charAt(i * 5 + 1));}String sha256Hex = sb1.toString();String salt = sb2.toString();// 比較二者是否相同return  DigestUtils.sha256Hex(password + salt).equals(sha256Hex);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42240.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

插件更新了!

最近花了點時間&#xff0c;給網頁插件添加了新功能&#xff0c;下面簡單給大家介紹一下如何使用 我們安裝好插件后&#xff0c;進入網頁就可以看到一個帶logo的按鈕了&#xff0c;我們可以點一下就可以跳出快捷操作 不同頁面點擊會出現不同的功能&#xff0c;大家可以根據自己…

dy商品評論采集

摘要 本文將詳細介紹如何通過抖音商品評論采集來獲取精準的用戶反饋&#xff0c;從而優化產品和營銷策略。通過這個指南&#xff0c;您將學會如何設置評論采集系統&#xff0c;分析用戶評論數據&#xff0c;以及如何利用這些數據來吸引更多粉絲&#xff0c;增加商品銷量。 返…

跨境傳輸需要遵守哪些準則,如何做到有效管控?

在全球化的商業環境中&#xff0c;跨國企業面臨著數據跨境傳輸的挑戰。隨著業務的擴展&#xff0c;企業需要在不同國家和地區之間高效、安全地傳輸大量數據。選擇合適的跨境傳輸方案對于保障數據安全、提高業務效率、遵守法律法規至關重要。 跨境傳輸數據需要遵守的準則和規定主…

Nginx:關于實現跨域代理

運維專題 Nginx&#xff1a;關于實現跨域代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.ne…

數據賦能(142)——開發:數據合并——技術方法、主要工具

技術方法 數據合并的技術方法主要包括以下幾種&#xff1a; 軸向連接&#xff08;Concatenation&#xff09;&#xff1a; 使用pd.concat()函數&#xff0c;沿一個軸&#xff08;通常是行或列&#xff09;將多個DataFrame對象連接在一起&#xff0c;形成一個新的DataFrame對…

html自學筆記與面試會問到問題

第一章 1.1什么是JavaScript&#xff1f; 一各跨平臺的腳本語言1.2ECMA特點&#xff1a; 由三大部分組成&#xff1a;核心語法(關鍵字、核心對象、語法)、DOM、BOM1.3 取余運算&#xff08;又叫取模運算&#xff09;&#xff1a; 取余&#xff1a;整除后&#xff0c;除不盡的…

發那科機床聯網串口配置

本文章僅針對無網口&#xff0c;需要通過串口輸出采集數據情況。跟這篇文章互為參考&#xff0c;一個理論&#xff0c;一個實戰。 Fanuc DPRNT宏程序串口采集-CSDN博客 一、禁用機器串口監控 選擇System、monit 二、設置參數可寫 在MDI模式中字符面板上按OFS/SET鍵,連按致屏…

終于搞定了通過兩路藍牙接收數據

一直想做無線傳感器&#xff0c;通過藍牙來接收數據&#xff0c;無奈因為arduino接收串口數據的一些問題&#xff0c;一直擱到現在。因為學校里給學生開了選修課&#xff0c;所以手邊有一些nano和mega可以使用&#xff0c;所以就做了用兩個nano加上兩個藍牙模塊來發射數據&…

經常用借唄和花唄對征信有影響嗎?

說起支付寶里的花唄和借唄&#xff0c;大伙兒肯定都不陌生&#xff0c;它們倆就像是支付寶里的信用貸款雙胞胎&#xff0c;名字相近&#xff0c;性格卻大相徑庭。現在&#xff0c;這倆兄弟都乖乖地接入了央行的征信大家庭&#xff0c;你的每一次使用&#xff0c;都會被記錄得清…

GEE代碼實例教程詳解:湖泊水位變化監測

簡介 本篇博客將介紹如何使用Google Earth Engine (GEE) 對湖泊水位變化進行監測。通過MODIS數據集&#xff0c;我們可以識別2001年和2023年的湖泊范圍&#xff0c;并計算湖泊的高程變化。 背景知識 MODIS數據集 MODIS/061/MOD09Q1數據集提供了MODIS的地表反射數據&#xf…

DDD架構

1.DDD架構的概念&#xff1a; 領域驅動設計&#xff08;Domain-Driven Design, DDD&#xff09;是一種軟件設計方法&#xff0c;旨在將軟件系統的設計和開發焦點集中在領域模型上&#xff0c;以解決復雜業務問題 2.DDD架構解決了什么問題: 在以前的mvc架構種&#xff0c;三層結…

產品經理-交互設計動手實踐(11)

業內有很多畫交互的工具&#xff0c;這里不過多介紹&#xff0c;互聯網公司最常用的工具是Axure,墨刀,藍湖,小瀑 它是一個專業的快速原型設計工具&#xff0c;使用它能夠快速創建線框圖、流程圖、原型和規格說明文檔。 它能快速、高效地創建原型&#xff0c;同時支持多人協作設…

華為HCIP Datacom H12-821 卷30

1.單選題 以下關于OSPF協議報文說法錯誤的是? A、OSPF報文采用UDP報文封裝并且端口號是89 B、OSPF所有報文的頭部格式相同 C、OSPF協議使用五種報文完成路由信息的傳遞 D、OSPF所有報文頭部都攜帶了Router-ID字段 正確答案&#xff1a;A 解析&#xff1a; OSPF用IP報…

iOS 開發中不常見的專業術語

樂此不疲地把簡單的問題復雜化&#xff0c;并把這種XX行為叫作專業 APM 在 iOS 開發中&#xff0c;APM 代表 Application Performance Management&#xff08;應用性能管理&#xff09;。APM 是一套監控和管理應用程序性能的工具和技術&#xff0c;旨在確保應用程序運行平穩、…

【人工智能】-- 法律與倫理

個人主頁&#xff1a;歡迎來到 Papicatch的博客 課設專欄 &#xff1a;學生成績管理系統 專業知識專欄&#xff1a; 專業知識 文章目錄 &#x1f349;引言 &#x1f349;倫理問題 &#x1f348;隱私泄露問題 &#x1f34d;人工智能與隱私泄露的緊密關聯 &#x1f34d;數…

上海慕尼黑電子展開展,啟明智顯攜物聯網前沿方案亮相

隨著科技創新的浪潮不斷涌來&#xff0c;上海慕尼黑電子展在萬眾矚目中盛大開幕。本次展會匯聚了全球頂尖的電子產品與技術解決方案&#xff0c;成為業界矚目的焦點。啟明智顯作為物聯網彩屏顯示領域的佼佼者攜產品亮相展會&#xff0c;為參展者帶來了RTOS、LINUX全系列方案及A…

測試工作流程

基礎 測試流程 1)需求研讀&#xff1a; 通讀需求了解需求整體內容&#xff0c;然后精讀需求理解需求的每?個業務邏輯&#xff0c;每?句話的意思。在研讀需求過程中的記錄問題&#xff0c;然后通過百度&#xff0c;AI?具&#xff0c;CSDN社區&#xff0c;咨詢朋友&#xf…

鴻蒙 arkts 實現手機號中間四位隱藏, 可以使用 substring [ 簡單適用新手 ]

1, 看效果 2, 直接cv代碼就可以 Preview Entry Component struct Setting {Statephone:string 15555555555maskPhoneNumber(phone:string){const start phone.substring(0,3)const end phone.substring(7)return ${start}****${end}}build() {Column(){Text(this.maskPhon…

Leetcode2542-最大子序列的分數

1.問題轉換 首先明確題意&#xff0c;要選取的值和num1&#xff0c;num2兩個數組都有關&#xff0c;但是num1中選取的是k個數&#xff0c;num2中選取的是1個數&#xff0c;顯然num2中的數所占的權重較大&#xff08;對結果影響較大&#xff09;&#xff0c;所以我們就可以對nu…

【Java探索之旅】多態:向上下轉型、多態優缺點、構造函數陷阱

文章目錄 &#x1f4d1;前言一、向上轉型和向下轉型1.1 向上轉型1.2 向下轉型 二、多態的優缺點2.1 多態優點2.2 多態缺陷 三、避免避免構造方法中調用重寫的方法四、好的習慣&#x1f324;?全篇總結 &#x1f4d1;前言 在面向對象編程中&#xff0c;向上轉型和向下轉型是常用…