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