MD5加密

计算字符串的MD5哈希值,常用于数据校验、签名等场景
MD5简介
MD5(Message-Digest Algorithm 5)是一种广泛应用的哈希算法,常用于数据完整性校验、数字签名、文件校验等场景。其输出为128位(16字节)哈希值,通常以32位十六进制字符串表示。
算法特点
  • 固定输出长度:无论输入消息的长度如何,MD5 始终产生 128 位的散列值
  • 不可逆性:由于是单向散列函数,不能通过散列值反推出原始消息
  • 唯一性:不同的输入消息几乎不可能产生相同的 MD5 散列值
  • 快速性:计算速度较快
算法原理
MD5 是输入不定长度信息,输出固定长度 128-bits 的算法,经过程序流程,生成四个 32 位数据,最后联合起来成为一个 128-bits 散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算,得出结果。 一个 MD5 运算由类似的 64 次循环构成,分成 4 组 16 次。F 一个非线性函数;一个函数运算一次。Mi 表示一个 32-bits 的输入数据,Ki 表示一个 32-bits 常数,用来完成每次不同的计算。
安全性说明
由于 MD5 存在一些安全性问题,已经不再被推荐用于密码存储或数字签名等安全领域,因为它容易受到碰撞攻击,即两个不同的输入消息可能产生相同的散列值。
常见用途
  • 文件或数据的完整性校验
  • 数字签名、消息摘要
  • 简单的唯一标识生成
代码示例
Python:
import hashlib

data = "Hello, MD5!"
md5_hash = hashlib.md5(data.encode()).hexdigest()
print(md5_hash)
        
Java:
import java.security.MessageDigest;

public class MD5Example {
    public static void main(String[] args) throws Exception {
        String data = "Hello, MD5!";
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] md5Bytes = md.digest(data.getBytes());

        StringBuilder result = new StringBuilder();
        for (byte b : md5Bytes) {
            result.append(String.format("%02x", b));
        }

        System.out.println(result.toString());
    }
}
        
JavaScript:
const crypto = require('crypto');

const data = 'Hello, MD5!';
const md5_hash = crypto.createHash('md5').update(data).digest('hex');
console.log(md5_hash);
        
PHP:
$data = 'Hello, MD5!';
$md5_hash = md5($data);
echo $md5_hash;
        
注意事项
  • MD5为不可逆加密,无法通过哈希值还原原文
  • 不建议用于高安全场景的密码存储,因已被证明可被碰撞攻击
  • 在安全应用中,应考虑使用更强大的散列算法,如 SHA-256 或 SHA-3