亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實現(xiàn)MD5加密算法方法例子

 更新時間:2023年10月16日 15:12:23   作者:爪哇程序人生  
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)MD5加密算法方法的相關(guān)資料,MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上,需要的朋友可以參考下

1. MD5 加密算法

1.1 MD5 算法介紹

MD5 消息摘要算法,英文:MD5 Message-Digest Algorithm ,一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。

MD5 是單向加密不可逆的,也就是常說的非對稱加密,常用于用戶密碼的加密,這樣即使密碼泄露也不知道對應(yīng)的明文信息,有效的保護系統(tǒng)和用戶的隱私信息。

MD5 算法產(chǎn)生的是一個 128 位的散列值,128 位是指的二進制中的 128 位,具體占 16 字節(jié)(每個字節(jié)可以表示為 8 位二進制數(shù))。

MD5 加密最終會將 128 位數(shù)字轉(zhuǎn)換成十六進制表示,每個字節(jié)( 8 位)轉(zhuǎn)成 2 位十六進制數(shù),最終得到 32 個字符,其中每兩個字符代表一個十六進制數(shù),因此最終 MD5 加密結(jié)果字符長度為 32 位。

1.2 算法加鹽

由于 MD5 算法是單向的,不能被反向解析,但是可以通過正向加密后的字典表(Lookup 表和 Rainbow 表)對比的方式進行暴力破解。

對于此種情況可以使用自定義偏移常量(鹽值)的方法來降低加密結(jié)果被破解的可能。

2. Java 中實現(xiàn) MD5 加密

2.1 JDK 提供的 MD5 算法

Java 中進行 MD5 加密使用的是 JDk 中的 java.security 包中的 MessageDigest 類,其中的 getInstance() 方法可以根據(jù)算法名稱獲取對應(yīng)的算法實例。

// 獲取 MD5 算法實例對象
MessageDigest md = MessageDigest.getInstance("MD5");

2.2 字符串的 MD5 加密

根據(jù) JDK 提供的算法,可以對任意的字符內(nèi)容進行 MD5 加密處理,加密處理的流程為:

  • 獲取 MD5 算法實例

  • 獲取需要加密的字符內(nèi)容對應(yīng)的的字節(jié)信息,可指定編碼方式

  • 對得到的字節(jié)信息使用 MD5 算法處理,得到加密后的字節(jié)

  • 將加密后的字節(jié)轉(zhuǎn)化為 16 進制字符串

  • 返回加密后的字符串信息

public static String md5(String data) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] md5 = md.digest(data.getBytes(StandardCharsets.UTF_8));
        
        // 將處理后的字節(jié)轉(zhuǎn)成 16 進制,得到最終 32 個字符
        StringBuilder sb = new StringBuilder();
        for (byte b : md5) {            
             sb.append(String.format("%02x", b));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}
  • MessageDigest 類可以獲取 MD5 實例

  • md.digest() 計算字符串內(nèi)容的摘要,并得到計算后的 hash value

  • StandardCharsets.UTF_8 用來指定計算時使用的編碼格式,如果不指定則會使用系統(tǒng)默認編碼格式,系統(tǒng)之間不統(tǒng)一會造成中文亂碼

  • sb.append(String.format(“%02x”, b)) 用于將字節(jié)信息轉(zhuǎn)為十六進制

最后,可以在 main 方法中驗證 MD5 算法的有效性

public static void main(String[] args) {
    String password = "testPsd";
    String passwordMd5Str = md5(password);
    System.out.println("加密前: " + password);
    System.out.println("加密后: " + passwordMd5Str);
}

輸出結(jié)果為

加密前: testPsd
加密后: 52c165118aae94580335f628dc8b202b

2.3 加鹽處理

使用鹽值可以進一步提升 MD5 加密算法安全性,降低破解風(fēng)險。

public static String md5(String data) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");

        // 加鹽處理,需要將對應(yīng)的鹽記錄,用于驗證密碼
        int randomNum = new SecureRandom().nextInt(1000);
        
        byte[] md5 = md.digest((data + randomNum).getBytes(StandardCharsets.UTF_8));

        StringBuilder sb = new StringBuilder();
        for (byte b : md5) {
            //sb.append(Integer.toHexString(b & 0xff));
            // 字符串格式轉(zhuǎn)成 16 進制
             sb.append(String.format("%02x", b));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

2.4 文件的 MD5 值計算

MD5 算法除了用于對字符內(nèi)容進行加密,還可以用來對文件進行 MD5 校驗。

文件進行 MD5 校驗即針對每個文件可以計算出一個 MD5 值來作為該文件的唯一編碼,如果文件在傳輸過程中發(fā)生了修改,那么最終得到文件的 MD5 值會發(fā)生變化。

根據(jù)上述 MD5 校驗方法可以驗證文件的有效性,保證文件在傳輸過程中不會被篡改。

public static String md5ForFile(String filePath) {
    MessageDigest md = null;
    byte[] fileBytes = new byte[0];

    try {
        md = MessageDigest.getInstance("MD5");
        fileBytes = Files.readAllBytes(Paths.get(filePath));
    }catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }catch (IOException e) {
        e.printStackTrace();
    }

    byte[] md5 = md.digest(fileBytes);
    StringBuilder sb = new StringBuilder();
    for (byte b : md5) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

在 main 方法中驗證 MD5 算法的有效性

public static void main(String[] args) {
    String filePath = "C:\桌面\test.jpg";
    String fileMd5Str = md5ForFile(filePath);
    System.out.println("加密后: " + fileMd5Str);
}

輸出結(jié)果為

加密后: 75f590a718ee6e8f65c0e7bf780a9e79

附:MD5用途

1.防止被篡改:

1)比如發(fā)送一個電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。

2)比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。

3)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ù)字簽名”。

MD5安全性

普遍認為MD5是很安全,因為暴力破解的時間是一般人無法接受的。實際上如果把用戶的密碼MD5處理后再存儲到數(shù)據(jù)庫,其實是很不安全的。因為用戶的密碼是比較短的,而且很多用戶的密碼都使用生日,手機號碼,身份證號碼,電話號碼等等?;蛘呤褂贸S玫囊恍┘臄?shù)字,或者某個英文單詞。如果我把常用的密碼先MD5處理,把數(shù)據(jù)存儲起來,然后再跟你的MD5結(jié)果匹配,這時我就有可能得到明文。

總結(jié)

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

相關(guān)文章

  • SpringBoot整合Mybatis-Plus、Jwt實現(xiàn)登錄token設(shè)置

    SpringBoot整合Mybatis-Plus、Jwt實現(xiàn)登錄token設(shè)置

    Spring Boot整合Mybatis-plus實現(xiàn)登錄常常需要使用JWT來生成用戶的token并設(shè)置用戶權(quán)限的攔截器,本文就來詳細的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • 集群環(huán)境中使用ehcache_動力節(jié)點Java學(xué)院整理

    集群環(huán)境中使用ehcache_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了集群環(huán)境中使用ehcache的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringBoot靜態(tài)資源映射規(guī)則淺析

    SpringBoot靜態(tài)資源映射規(guī)則淺析

    這篇文章主要介紹了SpringBoot靜態(tài)資源映射規(guī)則,今天在玩SpringBoot的demo的時候,放了張圖片在resources目錄下,啟動區(qū)訪問的時候,突然好奇是識別哪些文件夾來展示靜態(tài)資源的, 為什么有時候放的文件夾不能顯示,有的卻可以
    2023-02-02
  • Java將List轉(zhuǎn)換為String的幾種方式

    Java將List轉(zhuǎn)換為String的幾種方式

    我們大家在實際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,下面這篇文章主要給大家介紹了關(guān)于Java將List轉(zhuǎn)換為String的幾種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Java設(shè)計模式之代理模式(Proxy模式)介紹

    Java設(shè)計模式之代理模式(Proxy模式)介紹

    這篇文章主要介紹了Java設(shè)計模式之代理模式(Proxy模式)介紹,本文講解了為什么要使用代理模式、如何使用代理模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Java AQS的實現(xiàn)原理詳解

    Java AQS的實現(xiàn)原理詳解

    這篇文章主要借助了ReentrantLock來帶大家搞清楚AQS的實現(xiàn)原理,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • Java中數(shù)組的常見操作合集

    Java中數(shù)組的常見操作合集

    這篇文章主要為大家詳細介紹了Java中數(shù)組的一些常見操作,例如:數(shù)組遍歷、數(shù)組獲取最大值元素、數(shù)組反轉(zhuǎn)等,感興趣的小伙伴可以了解一下
    2022-10-10
  • Java導(dǎo)出Word文檔的四種方法

    Java導(dǎo)出Word文檔的四種方法

    在日常的開發(fā)工作中,我們時常會遇到導(dǎo)出Word文檔報表的需求,比如公司的財務(wù)報表、醫(yī)院的患者統(tǒng)計報表、電商平臺的銷售報表等等,所以本文給大家介紹了Java導(dǎo)出Word文檔的四種方法,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Java定義隊列結(jié)構(gòu),并實現(xiàn)入隊、出隊操作完整示例

    Java定義隊列結(jié)構(gòu),并實現(xiàn)入隊、出隊操作完整示例

    這篇文章主要介紹了Java定義隊列結(jié)構(gòu),并實現(xiàn)入隊、出隊操作,結(jié)合完整實例形式分析了java數(shù)據(jù)結(jié)構(gòu)中隊列的定義、入隊、出隊、判斷隊列是否為空、打印隊列元素等相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • elasticsearch索引創(chuàng)建create?index集群matedata更新

    elasticsearch索引創(chuàng)建create?index集群matedata更新

    這篇文章主要介紹了elasticsearch索引創(chuàng)建create?index及集群matedata更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04

最新評論