詳解Java MD5二次加密的應(yīng)用
MD5二次加密的應(yīng)用
- 當(dāng)前端傳送密碼到后端時候,需要進行兩次MD5加密,登錄和注冊時的加解密流程是怎么樣的?
前端和后端加密都可以規(guī)定使用密碼的某幾位作為鹽進行加解密操作,而這種約定俗成的鹽選取操作只有程序員自己知道,所以安全性較高,不需要前后端傳送鹽。 或者是前端和后端開發(fā)人員在開發(fā)的時候商量好這個第一層加密的鹽,分別在前端和后端存儲起來,這樣前端在每次發(fā)送密碼的時候都使用md5配合鹽進行加密,服務(wù)器因為知道鹽,所以可以自然的解密出來。
答:
- 無論是注冊還是登錄,密碼的第一次md5加密是在前端完成的,第二次加密都是在后端完成的,
- 對每一個用戶的密碼進行兩次md5加密會使用到兩個salt,第一個salt是公共的(前后端共享),被final static修飾,第二個salt則是專門為每一個用戶隨機生成的,會存到數(shù)據(jù)庫user表中的salt字段中(這是為了方便日后登錄時進行密碼驗證操作)。
- 再次強調(diào) MD5 只是哈希,而不是加密。MD5 是沒有可能解密的,因為一個 MD5 可能對應(yīng)無數(shù)種可能的明文。
當(dāng)用戶第一次注冊時
- 前端先使用全局公共的salt1將inputPass(用戶輸入的密碼)先轉(zhuǎn)換成fromPass(過渡密碼),隨后傳給服務(wù)器,
- 服務(wù)器隨機生成一個用戶專屬的salt2,使用md5和salt2將fromPass轉(zhuǎn)換成dbPass(存儲在數(shù)據(jù)庫中的密碼),
- 轉(zhuǎn)換結(jié)束后,會將用戶的注冊信息(包含用戶名和經(jīng)過二次加密后的密碼)以及專屬salt2存到數(shù)據(jù)庫中。
當(dāng)用戶使用用戶名和密碼進行登錄時
- 前端會先使用公共的salt1對inpuPass進行第一次加密,得到fromPass并且傳給服務(wù)器,
- 服務(wù)器根據(jù)用戶名查找到其對應(yīng)的專屬salt2和password(用戶首次注冊時二次加密后的密碼),利用這個salt2對用戶的已經(jīng)被公共鹽加密過的密碼進行二次加密,
- 與數(shù)據(jù)庫中取出的密碼進行比較,若一致,則登錄成功,否則登錄失敗。
如果從對數(shù)據(jù)庫中取出來的密碼進行一層解密(即將密碼第二次加密后的狀態(tài)還原為第一次加密后的狀態(tài)),為什么驗證密碼的時候,不是直接將這個解密后的密碼同前端傳過來的被加密后的密碼進行比較,從而得出密碼是否正確?
答:因為md5是利用hash進行加密的,這是一個不可逆的過程,即使知道hash的結(jié)果但是反向推導(dǎo)出hash函數(shù)的輸入?yún)?shù)幾乎是不可能的,所以。
以下是服務(wù)端實現(xiàn)兩次md5加密的方法,inputPassToFromPass和inputPassToDBPass方法僅僅用于測試,在真實的業(yè)務(wù)場景中,前端傳過來密碼的永遠不可能是明文密碼,一定是經(jīng)過inputPassToFromPass()方法加密后的密碼
import org.springframework.stereotype.Component; import org.springframework.util.DigestUtils; import java.nio.charset.StandardCharsets; /** * MD5工具類 */ @Component public class MD5Util { public static String md5(String str) { return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8)); } private static final String salt = "1a2b3c4d"; /** * 第一次加密 **/ public static String inputPassToFromPass(String inputPass) { // salt可以隨機的放在輸入密碼的各個部分當(dāng)中 String str = salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4); return md5(str); } /** * 第二次加密, 使用的鹽需要重新生成(這個鹽會存放到數(shù)據(jù)庫中,成為用戶的一個屬性), **/ public static String formPassToDBPass(String formPass, String salt) { String str = salt.charAt(0) + salt.charAt(2) + formPass + salt.charAt(5) + salt.charAt(4); return md5(str); } /** * 將第一次加密和第二次加密調(diào)用 */ public static String inputPassToDBPass(String inputPass, String salt) { String fromPass = inputPassToFromPass(inputPass); String dbPass = formPassToDBPass(fromPass, salt); return dbPass; } public static void main(String[] args) { System.out.println(inputPassToFromPass("123456")); System.out.println(formPassToDBPass(inputPassToFromPass("123456"), "abcdefgh")); System.out.println(inputPassToDBPass("123456", "abcdefgh")); } }
到此這篇關(guān)于詳解Java MD5二次加密的應(yīng)用的文章就介紹到這了,更多相關(guān)Java MD5二次加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringBoot加載application.properties配置文件的坑
這篇文章主要介紹了SpringBoot加載application.properties配置文件的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08hadoop client與datanode的通信協(xié)議分析
本文主要分析了hadoop客戶端read和write block的流程. 以及client和datanode通信的協(xié)議, 數(shù)據(jù)流格式等2012-11-11Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實現(xiàn)多環(huán)境打包
這篇文章主要介紹了Java隨手筆記8之包、環(huán)境變量和訪問控制及maven profile實現(xiàn)多環(huán)境打包的相關(guān)資料,需要的朋友可以參考下2015-11-11mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進行判斷的示例詳解
這篇文章主要介紹了mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進行判斷的示例詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09mybatis-config.xml文件中的mappers標簽使用
在MyBatis配置中,<mapper>標簽關(guān)鍵用于指定SQL?Mapper的XML文件路徑,主要有三種指定方式:resource、url和class,Resource方式從類的根路徑開始,適合放在項目內(nèi)部保障移植性,URL方式指定絕對路徑,移植性差,適用于外部路徑2024-10-10springboot實現(xiàn)敏感字段加密存儲解密顯示功能
這篇文章主要介紹了springboot實現(xiàn)敏感字段加密存儲,解密顯示,通過mybatis,自定義注解+AOP切面,Base64加解密方式實現(xiàn)功能,本文通過代碼實現(xiàn)給大家介紹的非常詳細,需要的朋友可以參考下2022-02-02Java反射機制在Spring IOC中的應(yīng)用詳解
這篇文章主要介紹了Java反射機制在Spring IOC中的應(yīng)用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09