0%

消息摘要算法

消息摘要算法详解

消息摘要算法是密码学中的重要组成部分,主要用于验证数据的完整性,确保数据在传输或存储过程中未被篡改。这类算法通过对原始数据进行处理,生成一个固定长度的 “摘要”(也称为哈希值或散列值),该摘要具有唯一性和不可逆性,成为数据的 “数字指纹”。

消息摘要算法的核心特性

  • 单向性:从原始数据生成摘要很容易,但无法从摘要反推原始数据。
  • 唯一性:不同的原始数据几乎不可能生成相同的摘要(哈希碰撞概率极低)。
  • 固定长度:无论原始数据大小如何,生成的摘要长度固定。
  • 敏感性:原始数据的微小变化会导致摘要发生巨大改变。

三大系列消息摘要算法

MD 算法(Message Digest)

MD 算法是早期的消息摘要算法系列,由 Ronald L. Rivest 设计,主要代表为MD5

MD5 的特点
  • 生成128 位的信息摘要(二进制),转换为十六进制后为 32 位字符串。
  • 运算速度快,但安全性已被攻破(存在实际的碰撞案例)。
  • 目前更多用于非安全性要求极高的场景,如文件校验、数据一致性验证等。
MD5 的 Java 实现示例
1
2
3
4
5
6
String inputText = "123456";
MessageDigest m = MessageDigest.getInstance("md5");
// 摘要处理
byte[] s = m.digest(inputText.getBytes(StandardCharsets.UTF_8));
// 转换为十六进制字符串
return new String(Hex.encodeHex(s,false));

注意:由于 MD5 的安全性问题,在涉及密码存储、数字签名等安全敏感场景中,已不推荐使用 MD5。

SHA 算法(Secure Hash Algorithm)

SHA 算法由美国国家安全局(NSA)设计,是在 MD4 基础上演进而来的更安全的系列算法,目前广泛应用于各类安全领域。

主要分类及特点
  • SHA-1:生成 160 位摘要,安全性较 MD5 有所提升,但也已被破解,逐渐被淘汰。
  • SHA-2 系列:包含 SHA-224(224 位)、SHA-256(256 位)、SHA-384(384 位)、SHA-512(512 位),其中 SHA-256 是目前应用最广泛的版本。
  • SHA-3 系列:是全新设计的算法,与 SHA-2 无直接关联,提供更高的安全性和灵活性。
SHA-1 的 Java 实现示例
1
2
3
4
5
6
String inputText = "123456";
MessageDigest m = MessageDigest.getInstance("SHA-1");
// 摘要处理
byte[] s = m.digest(inputText.getBytes(StandardCharsets.UTF_8));
// 转换为十六进制字符串
return new String(Hex.encodeHex(s,false));

推荐使用:在实际应用中,优先选择 SHA-256 及以上强度的 SHA 算法,以满足现代安全需求。

MAC 算法(Message Authentication Code)

MAC 算法是一种结合了密钥的消息摘要算法,也称为 “带密钥的哈希函数”,它整合了 MD 和 SHA 的优势,并加入了密钥验证机制,提供了更高的安全性。

主要类型及特点
  • 常见算法包括 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512 等(前缀 “Hmac” 表示 Hash-based Message Authentication Code)。
  • 不仅能验证数据完整性,还能验证数据的发送者身份(通过密钥验证)。
  • 安全性依赖于所使用的哈希算法和密钥的安全性。
HmacMD5 的 Java 实现示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String data = "123456";

KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
// 产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 获得密钥字节数组
byte[] key = secretKey.getEncoded();
// 实例化Mac对象
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
// 用密钥初始化Mac
mac.init(secretKey);
// 计算摘要
byte[] bytes = mac.doFinal(data.getBytes());
// 转换为十六进制字符串
System.out.println(new String(Hex.encodeHex(bytes, false)));

应用场景:MAC 算法常用于 API 接口认证、数据传输中的身份验证等场景,因为它能同时保证数据完整性和发送者合法性。

消息摘要算法的典型应用场景

  • 文件校验:下载文件后,通过比对文件的摘要与官方提供的摘要,验证文件是否完整或被篡改。
  • 密码存储:不直接存储明文密码,而是存储密码的摘要,验证时只需比对输入密码的摘要与存储的摘要。
  • 数据传输完整性验证:在数据传输时附加摘要,接收方通过重新计算摘要来判断数据是否被篡改。
  • 数字签名:结合非对称加密算法,对摘要进行加密,实现抗抵赖性(如 SHA+RSA 组合)。

欢迎关注我的其它发布渠道