欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java MD5二次加密的應(yīng)用

 更新時(shí)間:2023年02月14日 11:42:48   作者:全村最野的狗  
MD5的全稱是message-digest algorithm 5 信息-摘要算法。這篇文章主要為大家詳細(xì)介紹了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)文章

最新評(píng)論