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

Java實現(xiàn)MD5加密的四種方式

 更新時間:2025年03月18日 11:14:57   作者:思靜魚  
MD5是一種廣泛使用的哈希算法,其輸出結(jié)果是一個128位的二進制數(shù),通常以32位十六進制數(shù)的形式表示,MD5 的底層實現(xiàn)涉及多個復雜的步驟和算法,本文給大家介紹了Java實現(xiàn)MD5加密的四種方式,需要的朋友可以參考下

MD5介紹

MD5(Message-Digest Algorithm 5)是一種廣泛使用的哈希算法,其輸出結(jié)果是一個128位的二進制數(shù),通常以32位十六進制數(shù)的形式表示。因此,MD5的輸出結(jié)果可以表示為一個32位的字符串。

MD5算法常用于數(shù)據(jù)完整性驗證、密碼加密等場景,通常將輸入的數(shù)據(jù)經(jīng)過MD5處理后,得到一個32位的摘要(digest),該摘要作為數(shù)據(jù)的唯一表示,可以用于驗證數(shù)據(jù)的完整性或作為密碼的加密存儲。需要注意的是,由于MD5算法本身存在安全性問題,已經(jīng)不再推薦用于密碼加密等安全場景,而應該使用更加安全的算法,如SHA-2、bcrypt等。

MD5(Message Digest Algorithm 5)是一種哈希函數(shù),而不是對稱加密算法。MD5 用于產(chǎn)生一個稱為消息摘要(Message Digest)的固定大小的哈希值,通常是 128 位。MD5 不是加密算法,因為哈希值是不可逆的,即無法從哈希值還原出原始數(shù)據(jù)。

對稱加密算法是一種使用相同密鑰進行加密和解密的算法,例如 DES(Data Encryption Standard)、AES(Advanced Encryption Standard)等。與對稱加密不同,哈希函數(shù)通常是單向的,只能從原始數(shù)據(jù)計算出哈希值,而無法從哈希值還原出原始數(shù)據(jù)。

安全性:MD5 已經(jīng)被認為不再安全,因為它容易受到碰撞攻擊。對于需要安全性的應用(如密碼存儲),建議使用更強的散列算法(如 SHA-256)和適當?shù)陌踩珜嵺`(如加鹽)。

性能:雖然 MD5 在性能上表現(xiàn)良好,但現(xiàn)代安全需求通常需要更強的散列算法。

MD5(Message Digest Algorithm 5)是一種廣泛使用的加密散列函數(shù),主要用于生成數(shù)據(jù)的唯一摘要值(哈希值)。MD5 的底層實現(xiàn)涉及多個復雜的步驟和算法。以下是 MD5 的底層工作原理和關(guān)鍵概念:

  1. 基本概念
    散列函數(shù):MD5 是一種散列函數(shù),用于將任意長度的輸入數(shù)據(jù)(消息)映射為固定長度的輸出(128 位,或 16 字節(jié))的哈希值。
    不可逆性:MD5 生成的哈希值理論上無法逆推出原始輸入數(shù)據(jù)。
    固定長度:無論輸入數(shù)據(jù)的長度如何,MD5 總是生成一個 128 位的哈希值。
  2. MD5 的步驟
    MD5 的底層算法包括以下主要步驟:
  3. 初始化
    MD5 使用四個 32 位的初始常量(A、B、C、D)作為計算的起始值:
    ( A = 0x67452301 )
    ( B = 0xEFCDAB89 )
    ( C = 0x98BADCFE )
    ( D = 0x10325476 )
    這些常量用于初始化 MD5 的內(nèi)部狀態(tài)。
  4. 填充
    將輸入數(shù)據(jù)填充到 512 位的倍數(shù)。填充過程包括:
    填充位:在輸入數(shù)據(jù)的末尾添加一個 1 位的標志位,表示數(shù)據(jù)結(jié)束。
    填充零:在標志位后添加零,直到數(shù)據(jù)長度接近 512 位。
    附加長度:在數(shù)據(jù)末尾附加原始數(shù)據(jù)的長度(以位為單位),以 64 位表示。填充后的數(shù)據(jù)總長度為 512 位的倍數(shù)。
  5. 數(shù)據(jù)分塊
    將填充后的數(shù)據(jù)分成 512 位的塊,每個塊被進一步分成 16 個 32 位的子塊(總共 64 個字節(jié))。
  6. 處理每個數(shù)據(jù)塊
    對于每個 512 位的數(shù)據(jù)塊,執(zhí)行以下步驟:
    擴展:將 16 個 32 位子塊擴展為 64 個 32 位的子塊,使用非線性函數(shù)進行處理。
    輪次:MD5 使用 64 輪的運算,每一輪使用不同的非線性函數(shù)(F、G、H、I)和常量(T[i])。每輪的運算包括:
    非線性函數(shù):F(x, y, z)、G(x, y, z)、H(x, y, z)、I(x, y, z)
    常量:T[i] 是一組預定義的常量,與輸入數(shù)據(jù)和輪次相關(guān)。
    位運算:使用位移和按位與、或、異或等運算來更新內(nèi)部狀態(tài)(A、B、C、D)。
    數(shù)據(jù)混合:將數(shù)據(jù)塊與當前的內(nèi)部狀態(tài)進行混合。
  7. 輸出
    將最后一個數(shù)據(jù)塊的處理結(jié)果(A、B、C、D)連接起來,生成 128 位(16 字節(jié))的哈希值。
  8. MD5 算法的詳細步驟
    填充:
    在原始消息末尾添加 1 位的 1。
    添加足夠的 0,使得消息長度(包括填充的部分)為 448 位(512 位的前 448 位),即還需填充 0 到 64 位數(shù)據(jù)塊的長度。
    添加 64 位的消息長度,作為填充的最后部分,確保最終消息長度為 512 位的倍數(shù)。
    初始化變量:
    初始化 A、B、C、D 為常量值。
    處理數(shù)據(jù)塊:
    將每個數(shù)據(jù)塊分成 16 個 32 位的子塊,使用特定的非線性函數(shù)和常量進行處理。
    進行 64 輪的運算,更新 A、B、C、D 的值。
    輸出結(jié)果:
    將 A、B、C、D 的最終值轉(zhuǎn)換為 128 位的哈希值,通常以 16 進制表示。
  9. MD5 的應用
    數(shù)據(jù)完整性檢查:通過比較文件的 MD5 哈希值,可以檢測文件是否被篡改。
    密碼存儲:在數(shù)據(jù)庫中存儲密碼的 MD5 哈希值,而不是明文密碼(注意:不建議僅使用 MD5 存儲密碼,因為它已被證明不夠安全)。
  10. 安全性
    雖然 MD5 曾被廣泛使用,但由于其安全性問題,如碰撞攻擊(即不同的輸入可以產(chǎn)生相同的哈希值),它已不再被認為是安全的。對于需要更高安全性的應用,建議使用更強的哈希函數(shù),如 SHA-256 或 SHA-3。
    總結(jié)
    MD5 是一種將輸入數(shù)據(jù)映射到固定長度哈希值的散列函數(shù)。其底層實現(xiàn)包括數(shù)據(jù)填充、分塊、處理和最終輸出四個主要步驟。盡管 MD5 在許多應用中曾被廣泛使用,但由于安全性問題,現(xiàn)如今建議使用更安全的哈希算法。

Java 中實現(xiàn) MD5 加密方式

這三種方法都能有效地生成 MD5 哈希。選擇適合你項目需求的方式,如果已經(jīng)使用了 Apache Commons Codec 或 Guava,可以直接利用它們的功能;如果只是簡單的 MD5 加密需求,使用 MessageDigest 是最直接的方法。
在 Java 中實現(xiàn) MD5 加密可以通過多種方式。

方法一:使用 MessageDigest

這是最基本的方式,使用 Java 內(nèi)置的 MessageDigest 類。

示例代碼:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5UsingMessageDigest {
    public static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        String input = "Hello, World!";
        System.out.println("MD5 Hash: " + md5(input));
    }
}

方法二:使用 Apache Commons Codec

Apache Commons Codec 是一個流行的庫,提供了便捷的工具類進行編碼和解碼。

示例代碼:

首先,確保在項目中添加 Apache Commons Codec 的依賴:

<dependency>
    <groupId>commons-codec</groupId>

    <artifactId>commons-codec</artifactId>

    <version>1.15</version> <!-- 檢查最新版本 -->
</dependency>

然后可以使用以下代碼:

import org.apache.commons.codec.digest.DigestUtils;

public class MD5UsingCommonsCodec {
    public static void main(String[] args) {
        String input = "Hello, World!";
        String md5Hash = DigestUtils.md5Hex(input);
        System.out.println("MD5 Hash: " + md5Hash);
    }
}

方法三:使用 Guava

Google 的 Guava 庫也提供了簡單的 MD5 加密功能。

示例代碼:

首先,確保在項目中添加 Guava 的依賴:

<dependency>
    <groupId>com.google.guava</groupId>

    <artifactId>guava</artifactId>

    <version>31.0.1-jre</version> <!-- 檢查最新版本 -->
</dependency>

然后可以使用以下代碼:

import com.google.common.hash.Hashing;

import java.nio.charset.StandardCharsets;

public class MD5UsingGuava {
    public static void main(String[] args) {
        String input = "Hello, World!";
        String md5Hash = Hashing.md5()
                .hashString(input, StandardCharsets.UTF_8)
                .toString();
        System.out.println("MD5 Hash: " + md5Hash);
    }
}

方法四:SPRING核心包

import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HashController {

    @GetMapping("/md5")
    public String getMD5(@RequestParam String input) {
        return DigestUtils.md5DigestAsHex(input.getBytes());
    }
}

MD5Util

package com.maxvision.common.util;

import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;

@Slf4j
public class MD5Util {
    private static String byteArrayToHexString(byte[] b) {
        StringBuilder resultSb = new StringBuilder();
        for (byte value : b) {
            resultSb.append(byteToHexString(value));
        }
        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0) {
            n += 256;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return HEX_DIGITS[d1] + HEX_DIGITS[d2];
    }

    /**
     * 用UTF8編碼進行MD5加密
     *
     * @param origin 原字符串
     * @return 加密后字符串
     */
    public static String md5Encode(String origin) {
        return md5Encode(origin, "UTF-8");
    }

    public static String md5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = origin;
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname)) {
                resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
            } else {
                resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
            }
        } catch (Exception ignored) {
        }
        return resultString;
    }

    private static final String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
}

以上就是Java實現(xiàn)MD5加密的四種方式的詳細內(nèi)容,更多關(guān)于Java MD5加密的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot項目中@RestControllerAdvice全局異常失效問題的解決

    SpringBoot項目中@RestControllerAdvice全局異常失效問題的解決

    @RestController注解是一個用于定義RESTful Web服務的控制器的特殊注解,它是@Controller和@ResponseBody注解的結(jié)合體,意味著你不需要在每個處理請求的方法上都添加@ResponseBody,本文給大家介紹了解決SpringBoot項目中@RestControllerAdvice全局異常失效問題
    2024-11-11
  • spring?Cloud微服務阿里開源TTL身份信息的線程間復用

    spring?Cloud微服務阿里開源TTL身份信息的線程間復用

    這篇文章主要為大家介紹了spring?Cloud微服務中使用阿里開源TTL身份信息的線程間復用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • mybatis-plus實現(xiàn)打印完整sql語句

    mybatis-plus實現(xiàn)打印完整sql語句

    這篇文章主要介紹了mybatis-plus實現(xiàn)打印完整sql語句方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java?工具類實現(xiàn)音頻音量提升

    Java?工具類實現(xiàn)音頻音量提升

    本文主要介紹了可以將音頻提升音量的一個java工具類示例代碼,代碼具有一定的學習價值,感興趣的小伙伴來了解一下吧,,希望能夠給你帶來幫助
    2021-11-11
  • Scala遞歸函數(shù)調(diào)用自身

    Scala遞歸函數(shù)調(diào)用自身

    這篇文章主要介紹了Scala遞歸函數(shù),Scala遞歸函數(shù)是一種函數(shù)可以調(diào)用自身的函數(shù),直到滿足某個特定的條件為止。在函數(shù)式編程的語言中,遞歸函數(shù)起著重要的作用,因為它可以用來表示循環(huán)或迭代的邏輯
    2023-04-04
  • Java多線程之簡單模擬售票功能

    Java多線程之簡單模擬售票功能

    這篇文章主要介紹了Java多線程之簡單模擬售票功能,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • Java實現(xiàn)向Word文檔添加文檔屬性

    Java實現(xiàn)向Word文檔添加文檔屬性

    這篇文章主要介紹了Java實現(xiàn)向Word文檔添加文檔屬性的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Java讀取傳輸FTP文件實現(xiàn)示例

    Java讀取傳輸FTP文件實現(xiàn)示例

    本文主要介紹了Java讀取傳輸FTP文件方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • windows下jar包開機自動重啟的步驟

    windows下jar包開機自動重啟的步驟

    這篇文章主要給大家介紹了關(guān)于windows下jar包開機自動重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java后端接口中提取請求頭中的Cookie和Token的方法

    Java后端接口中提取請求頭中的Cookie和Token的方法

    在現(xiàn)代 Web 開發(fā)中,HTTP 請求頭(Header)是客戶端與服務器之間傳遞信息的重要方式之一,本文將詳細介紹如何在 Java 后端(以 Spring Boot 為例)中提取請求頭中的 Cookie 和 Token,并提供完整的代碼示例和優(yōu)化建議,需要的朋友可以參考下
    2025-01-01

最新評論