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

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

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

最新評論