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

SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例

 更新時間:2023年04月13日 08:35:38   作者:慕言要努力  
本文主要介紹了SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

因為開學(xué)等各種原因,導(dǎo)致更新的速度越來越慢,當(dāng)然在此期間也進行了一些其他技術(shù)的學(xué)習(xí),今天給大家?guī)淼木褪俏覀兊耐ㄟ^MD5進行數(shù)據(jù)庫加密。

MD5概述:

MD5消息摘要算法,屬Hash算法一類。MD5算法對輸入任意長度的消息進行運行,產(chǎn)生一個128位的消息摘要(32位的數(shù)字字母混合碼)。

MD5主要特點:

不可逆,相同數(shù)據(jù)的MD5值肯定一樣,不同數(shù)據(jù)的MD5值不一樣

 (一個MD5理論上的確是可能對應(yīng)無數(shù)多個原文的,因為MD5是有限多個的而原文可以是無數(shù)多個。比如主流使用的MD5將任意長度的“字節(jié)串映射為一個128bit的大整數(shù)。也就是一共有2^128種可能,大概是3.4*10^38,這個數(shù)字是有限多個的,而但是世界上可以被用來加密的原文則會有無數(shù)的可能性)

MD5的性質(zhì):

  • 壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的(相當(dāng)于超損壓縮)。
  • 容易計算:從原數(shù)據(jù)計算出MD5值很容易。
  • 抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
  • 弱抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
  • 強抗碰撞:想找到兩個不同的數(shù)據(jù),使它們具有相同的MD5值,是非常困難的。

雖說MD5有不可逆的特點但是由于某些MD5破解網(wǎng)站,專門用來查詢MD5碼,其通過把常用的密碼先MD5處理,并將數(shù)據(jù)存儲起來,然后跟需要查詢的MD5結(jié)果匹配,這時就有可能通過匹配的MD5得到明文,所以有些簡單的MD5碼是反查到加密前原文的。

為了讓MD5碼更加安全,涌現(xiàn)了很多其他方法,如加鹽。 鹽要足夠長足夠亂 得到的MD5碼就很難查到。

MD5用途:

1.防止被篡改:

  • 比如發(fā)送一個電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
  • 比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
  • SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.

2.防止直接看到明文:

現(xiàn)在很多網(wǎng)站在數(shù)據(jù)庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算不法分子得到數(shù)據(jù)庫的用戶密碼的MD5值,也無法知道用戶的密碼。(比如在UNIX系統(tǒng)中用戶的密碼就是以MD5(或其它類似的算法)經(jīng)加密后存儲在文件系統(tǒng)中。當(dāng)用戶登錄的時候,系統(tǒng)把用戶輸入的密碼計算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)

3.防止抵賴(數(shù)字簽名):

這需要一個第三方認證機構(gòu)。例如A寫了一個文件,認證機構(gòu)對此文件用MD5算法產(chǎn)生摘要信息并做好記錄。若以后A說這文件不是他寫的,權(quán)威機構(gòu)只需對此文件重新產(chǎn)生摘要信息,然后跟記錄在冊的摘要信息進行比對,相同的話,就證明是A寫的了。這就是所謂的“數(shù)字簽名”。

  • 比如發(fā)送一個電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
  • 比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
  • SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.SpringBoot使用:

首先,還是會利用到我們的hutool:Hutool參考文檔 

我們發(fā)現(xiàn),hutool工具類里面的SecureUtil可以對我們的MD5進行使用,那么我們就可以更好更簡單的去實現(xiàn)我們的MD5加密了

依賴導(dǎo)入:

        <!-- hutool  -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.20</version>
        </dependency>

然后在我們新建的SpringBoot項目里面進行我們的一個測試

private static final String PASSWORD = "123456";
 
    @Test
    public void testMd5() {
        String res1 = SecureUtil.md5(PASSWORD);
        String res2 = SecureUtil.md5(PASSWORD);
        System.out.println(res1);
        System.out.println(res2);
        System.out.println(res1.equals(res2));
    }

最后在我們的控制臺里面輸出,并得到一下結(jié)果

那我們?nèi)绾问褂玫轿覀兊臄?shù)據(jù)庫呢?按照思路,我們應(yīng)該從用戶的注冊就開始進行對我們的密碼進行加密處理,所以我們需要在我們的Service進行編碼處理程序。 

我們在控制層獲取到我們用戶的數(shù)據(jù),把它當(dāng)做一個包命名為UserDTO,單獨封裝起來,方便我們隨時對我們的數(shù)據(jù)進行處理和查找。我們在UserDTO里面對密碼進行加密之前要獲取我們的數(shù)據(jù),也就是我們的密碼。 

@Override
    public User register(UserDTO userDTO) {
        // 用戶密碼 md5加密
        userDTO.setPassword(SecureUtil.md5(userDTO.getPassword()));
        userDTO.setNickname(userDTO.getUsername());
        userDTO.setSex("男");
        userDTO.setAvatarUrl("https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png");
        User one = getUserInfo(userDTO);
        if (one == null) {
            one = new User();
            BeanUtil.copyProperties(userDTO, one, true);
            save(one);//存到數(shù)據(jù)庫
        } else {
            throw new ServerException(Constants.CODE_600, "用戶已存在");
        }
        return one;
    }

在前端執(zhí)行成功之后,我們數(shù)據(jù)庫里面的數(shù)據(jù)就發(fā)生了變化

那我們在注冊的時候進行了數(shù)據(jù)加密,那我們登錄不解密就寄了,咋們就會登錄不了,這不是亂寫嘛,別急,馬上進行解密實現(xiàn)登錄操作。

沒想到吧,是跟注冊差不多的操作。那有人問你這里注釋寫的是MD5加密,你的解密去哪里了呢?這不是胡扯嘛?。。?/p>

其實我們的SecureUtil不僅可以進行加密,也可以進行解密,所以我們在登錄的時候要獲取我們的用戶密碼,就是直接進行解密操作,供我們的操作使用。所以說Hutool這個工具實在是真的強大,幫我們解決很多復(fù)雜的程序。

下面給大家分享一下AES

AES算法簡介

AES算法全稱Advanced Encryption Standard,又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院 (NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級加密標(biāo)準(zhǔn)已然成為對稱密鑰加密中最流行的算法之一。
AES支持三種長度的密鑰:128位,192位,256位。

AES算法原理

1.密鑰

密鑰是AES算法實現(xiàn)加密和解密的根本。對稱加密算法之所以對稱,是因為這類算法對明文的加密和解密需要使用同一個密鑰。
AES支持三種長度的密鑰:128位,192位,256位
平時大家所說的AES128,AES192,AES256,實際上就是指的AES算法對不同長度密鑰的使用。

2.填充

要想了解填充的概念,我們先要了解AES的分組加密特性。什么是分組加密呢?我們來看看下面這張圖:AES算法在對明文加密的時候,并不是把整個明文一股腦加密成一整段密文,而是把明文拆分成一個個獨立的明文塊,每一個明文塊長度128bit。

這些明文塊經(jīng)過AES加密器的復(fù)雜處理,生成一個個獨立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結(jié)果。

假如一段明文長度是192bit,如果按每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit。這時候怎么辦呢?就需要對明文塊進行填充(Padding)。

依然是我們的SecureUtil來進行加密解密處理

最后控制臺輸出結(jié)果為:

好了,以上就是我近期學(xué)習(xí)的結(jié)果,可以進行數(shù)據(jù)庫數(shù)據(jù)加密解密。

?小結(jié)

到此這篇關(guān)于SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例的文章就介紹到這了,更多相關(guān)SpringBoot Md5加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論