最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java MD5二次加密的應用

 更新時間:2023年02月14日 11:42:48   作者:全村最野的狗  
MD5的全稱是message-digest algorithm 5 信息-摘要算法。這篇文章主要為大家詳細介紹了Java中MD5二次加密的應用,感興趣的小伙伴可以了解一下

MD5二次加密的應用

  • 當前端傳送密碼到后端時候,需要進行兩次MD5加密,登錄和注冊時的加解密流程是怎么樣的?

前端和后端加密都可以規(guī)定使用密碼的某幾位作為鹽進行加解密操作,而這種約定俗成的鹽選取操作只有程序員自己知道,所以安全性較高,不需要前后端傳送鹽。 或者是前端和后端開發(fā)人員在開發(fā)的時候商量好這個第一層加密的鹽,分別在前端和后端存儲起來,這樣前端在每次發(fā)送密碼的時候都使用md5配合鹽進行加密,服務器因為知道鹽,所以可以自然的解密出來。

答:

  • 無論是注冊還是登錄,密碼的第一次md5加密是在前端完成的,第二次加密都是在后端完成的,
  • 對每一個用戶的密碼進行兩次md5加密會使用到兩個salt,第一個salt是公共的(前后端共享),被final static修飾,第二個salt則是專門為每一個用戶隨機生成的,會存到數(shù)據(jù)庫user表中的salt字段中(這是為了方便日后登錄時進行密碼驗證操作)。
  • 再次強調(diào) MD5 只是哈希,而不是加密。MD5 是沒有可能解密的,因為一個 MD5 可能對應無數(shù)種可能的明文。

當用戶第一次注冊時

  • 前端先使用全局公共的salt1將inputPass(用戶輸入的密碼)先轉換成fromPass(過渡密碼),隨后傳給服務器,
  • 服務器隨機生成一個用戶專屬的salt2,使用md5和salt2將fromPass轉換成dbPass(存儲在數(shù)據(jù)庫中的密碼),
  • 轉換結束后,會將用戶的注冊信息(包含用戶名和經(jīng)過二次加密后的密碼)以及專屬salt2存到數(shù)據(jù)庫中。

當用戶使用用戶名和密碼進行登錄時

  • 前端會先使用公共的salt1對inpuPass進行第一次加密,得到fromPass并且傳給服務器,
  • 服務器根據(jù)用戶名查找到其對應的專屬salt2和password(用戶首次注冊時二次加密后的密碼),利用這個salt2對用戶的已經(jīng)被公共鹽加密過的密碼進行二次加密,
  • 與數(shù)據(jù)庫中取出的密碼進行比較,若一致,則登錄成功,否則登錄失敗。

如果從對數(shù)據(jù)庫中取出來的密碼進行一層解密(即將密碼第二次加密后的狀態(tài)還原為第一次加密后的狀態(tài)),為什么驗證密碼的時候,不是直接將這個解密后的密碼同前端傳過來的被加密后的密碼進行比較,從而得出密碼是否正確?

答:因為md5是利用hash進行加密的,這是一個不可逆的過程,即使知道hash的結果但是反向推導出hash函數(shù)的輸入?yún)?shù)幾乎是不可能的,所以。

以下是服務端實現(xiàn)兩次md5加密的方法,inputPassToFromPass和inputPassToDBPass方法僅僅用于測試,在真實的業(yè)務場景中,前端傳過來密碼的永遠不可能是明文密碼,一定是經(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可以隨機的放在輸入密碼的各個部分當中
        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"));
    }
}

到此這篇關于詳解Java MD5二次加密的應用的文章就介紹到這了,更多相關Java MD5二次加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis insert方法主鍵回填和自定義操作

    Mybatis insert方法主鍵回填和自定義操作

    這篇文章主要介紹了Mybatis insert方法主鍵回填和自定義操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例

    Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例

    這篇文章主要介紹了Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • Spring的@Value如何從Nacos配置中心獲取值并自動刷新

    Spring的@Value如何從Nacos配置中心獲取值并自動刷新

    這篇文章主要介紹了Spring的@Value如何從Nacos配置中心獲取值并自動刷新,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring Boot與Docker部署詳解

    Spring Boot與Docker部署詳解

    本篇文章主要介紹了Spring Boot與Docker部署詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 如何基于sqlite實現(xiàn)kafka延時消息詳解

    如何基于sqlite實現(xiàn)kafka延時消息詳解

    這篇文章主要給大家介紹了關于如何基于sqlite實現(xiàn)kafka延時消息的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • mybatis注解與xml常用語句匯總

    mybatis注解與xml常用語句匯總

    最近一直在用mybatis,由于需要使用到了動態(tài)sql,遇到了一些問題,現(xiàn)在來總結一下,經(jīng)驗教訓。下面這篇文章主要給大家總結介紹了mybatis注解與xml常用語句的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • IDEA提示內(nèi)存不足 low memory的完美解決方法(親測好用)

    IDEA提示內(nèi)存不足 low memory的完美解決方法(親測好用)

    這篇文章主要介紹了IDEA提示內(nèi)存不足 low memory的完美解決方法(親測好用),這里以IDEA2022版本為例,在IDE中 幫助(help)–>change memory setting(改變內(nèi)存設置),具體設置辦法文中給大家詳細講解,需要的朋友可以參考下
    2023-01-01
  • Java中ReentrantLock4種常見的坑

    Java中ReentrantLock4種常見的坑

    本文主要介紹了Java中ReentrantLock?4種常見的坑,ReentrantLock默認情況下為非公平鎖,下文關于其更多詳情需要的小伙伴可以參考一下
    2022-05-05
  • Java使用Geodesy進行地理計算的技術指南

    Java使用Geodesy進行地理計算的技術指南

    在地理信息系統(tǒng) (GIS) 和導航應用中,精確的地理計算是基礎,Geodesy 是一個流行的 Java 庫,用于處理地理位置、距離、方向等相關計算,本博客將介紹 Geodesy 的核心功能,并提供詳細的實踐樣例,幫助開發(fā)者快速上手,需要的朋友可以參考下
    2025-02-02
  • Spring中BeanUtils.copyProperties的坑及解決

    Spring中BeanUtils.copyProperties的坑及解決

    這篇文章主要介紹了Spring中BeanUtils.copyProperties的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

乌兰察布市| 枣阳市| 焉耆| 宁津县| 比如县| 伊宁县| 永宁县| 平潭县| 长春市| 中超| 宁夏| 莱芜市| 潼南县| 青川县| 嘉祥县| 海丰县| 静乐县| 达孜县| 郓城县| 大埔县| 平果县| 靖宇县| 金堂县| 嵊泗县| 高淳县| 丹巴县| 扬州市| 文山县| 临猗县| 广水市| 麟游县| 和平区| 新源县| 锡林浩特市| 贞丰县| 成安县| 那曲县| 阿坝| 潮安县| 闽侯县| 岳阳县|