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

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

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

因?yàn)殚_(kāi)學(xué)等各種原因,導(dǎo)致更新的速度越來(lái)越慢,當(dāng)然在此期間也進(jìn)行了一些其他技術(shù)的學(xué)習(xí),今天給大家?guī)?lái)的就是我們的通過(guò)MD5進(jìn)行數(shù)據(jù)庫(kù)加密。

MD5概述:

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

MD5主要特點(diǎn):

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

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

MD5的性質(zhì):

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

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

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

MD5用途:

1.防止被篡改:

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

2.防止直接看到明文:

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

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

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

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

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

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

依賴(lài)導(dǎo)入:

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

然后在我們新建的SpringBoot項(xiàng)目里面進(jìn)行我們的一個(gè)測(cè)試

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));
    }

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

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

我們?cè)诳刂茖荧@取到我們用戶(hù)的數(shù)據(jù),把它當(dāng)做一個(gè)包命名為UserDTO,單獨(dú)封裝起來(lái),方便我們隨時(shí)對(duì)我們的數(shù)據(jù)進(jìn)行處理和查找。我們?cè)赨serDTO里面對(duì)密碼進(jìn)行加密之前要獲取我們的數(shù)據(jù),也就是我們的密碼。 

@Override
    public User register(UserDTO userDTO) {
        // 用戶(hù)密碼 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ù)庫(kù)
        } else {
            throw new ServerException(Constants.CODE_600, "用戶(hù)已存在");
        }
        return one;
    }

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

那我們?cè)谧?cè)的時(shí)候進(jìn)行了數(shù)據(jù)加密,那我們登錄不解密就寄了,咋們就會(huì)登錄不了,這不是亂寫(xiě)嘛,別急,馬上進(jìn)行解密實(shí)現(xiàn)登錄操作。

沒(méi)想到吧,是跟注冊(cè)差不多的操作。那有人問(wèn)你這里注釋寫(xiě)的是MD5加密,你的解密去哪里了呢?這不是胡扯嘛!??!

其實(shí)我們的SecureUtil不僅可以進(jìn)行加密,也可以進(jìn)行解密,所以我們?cè)诘卿浀臅r(shí)候要獲取我們的用戶(hù)密碼,就是直接進(jìn)行解密操作,供我們的操作使用。所以說(shuō)Hutool這個(gè)工具實(shí)在是真的強(qiáng)大,幫我們解決很多復(fù)雜的程序。

下面給大家分享一下AES

AES算法簡(jiǎn)介

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

AES算法原理

1.密鑰

密鑰是AES算法實(shí)現(xiàn)加密和解密的根本。對(duì)稱(chēng)加密算法之所以對(duì)稱(chēng),是因?yàn)檫@類(lèi)算法對(duì)明文的加密和解密需要使用同一個(gè)密鑰。
AES支持三種長(zhǎng)度的密鑰:128位,192位,256位
平時(shí)大家所說(shuō)的AES128,AES192,AES256,實(shí)際上就是指的AES算法對(duì)不同長(zhǎng)度密鑰的使用。

2.填充

要想了解填充的概念,我們先要了解AES的分組加密特性。什么是分組加密呢?我們來(lái)看看下面這張圖:AES算法在對(duì)明文加密的時(shí)候,并不是把整個(gè)明文一股腦加密成一整段密文,而是把明文拆分成一個(gè)個(gè)獨(dú)立的明文塊,每一個(gè)明文塊長(zhǎng)度128bit。

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

假如一段明文長(zhǎng)度是192bit,如果按每128bit一個(gè)明文塊來(lái)拆分的話,第二個(gè)明文塊只有64bit,不足128bit。這時(shí)候怎么辦呢?就需要對(duì)明文塊進(jìn)行填充(Padding)。

依然是我們的SecureUtil來(lái)進(jìn)行加密解密處理

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

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

?小結(jié)

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

相關(guān)文章

  • Mybatis批量刪除數(shù)據(jù)操作方法

    Mybatis批量刪除數(shù)據(jù)操作方法

    MyBatis的作用我想不用多說(shuō),今天說(shuō)說(shuō)MyBatis中的批量刪除操作。 非常不錯(cuò),感興趣的朋友一起看看吧
    2016-09-09
  • vue2向springboot傳值接收不到的解決方法

    vue2向springboot傳值接收不到的解決方法

    本文主要介紹了vue2向springboot傳值接收不到的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • IDEA配置Maven教程的超詳細(xì)講解版

    IDEA配置Maven教程的超詳細(xì)講解版

    IntelliJ IDEA是當(dāng)前最流行的Java IDE(集成開(kāi)發(fā)環(huán)境)之一,也是業(yè)界公認(rèn)最好用的Java開(kāi)發(fā)工具之一,這篇文章主要給大家介紹了關(guān)于IDEA配置Maven教程的超詳細(xì)講解版,需要的朋友可以參考下
    2023-11-11
  • Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解

    Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解

    這篇文章主要介紹了Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 淺析Java中靜態(tài)代理和動(dòng)態(tài)代理的應(yīng)用與區(qū)別

    淺析Java中靜態(tài)代理和動(dòng)態(tài)代理的應(yīng)用與區(qū)別

    代理模式在我們生活中很常見(jiàn),而Java中常用的兩個(gè)的代理模式就是動(dòng)態(tài)代理與靜態(tài)代理,這篇文章主要為大家介紹了二者的應(yīng)用與區(qū)別,需要的可以參考下
    2023-08-08
  • Spring mvc是如何實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的前后端的連接操作的?

    Spring mvc是如何實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的前后端的連接操作的?

    今天給大家?guī)?lái)的是關(guān)于Spring mvc的相關(guān)知識(shí),文章圍繞著Spring mvc是如何實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的前后端的連接操作的展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java手寫(xiě)線程池之向JDK線程池進(jìn)發(fā)

    Java手寫(xiě)線程池之向JDK線程池進(jìn)發(fā)

    在前面的文章自己動(dòng)手寫(xiě)乞丐版線程池中,我們寫(xiě)了一個(gè)非常簡(jiǎn)單的線程池實(shí)現(xiàn),這個(gè)只是一個(gè)非常簡(jiǎn)單的實(shí)現(xiàn),在本篇文章當(dāng)中我們將要實(shí)現(xiàn)一個(gè)和JDK內(nèi)部實(shí)現(xiàn)的線程池非常相似的線程池,需要的可以了解一下
    2022-10-10
  • SpringCloud使用Feign實(shí)現(xiàn)動(dòng)態(tài)路由操作

    SpringCloud使用Feign實(shí)現(xiàn)動(dòng)態(tài)路由操作

    這篇文章主要介紹了SpringCloud使用Feign實(shí)現(xiàn)動(dòng)態(tài)路由操作,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Java SE求解漢諾塔問(wèn)題的示例代碼

    Java SE求解漢諾塔問(wèn)題的示例代碼

    漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),又稱(chēng)河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java SE求解這一問(wèn)題,感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • 深入Java冒泡排序與選擇排序的區(qū)別詳解

    深入Java冒泡排序與選擇排序的區(qū)別詳解

    本篇文章是對(duì)Java冒泡排序與選擇排序的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論