MD5(信息摘要算法 5)



MD5 方法是最早获得全球认可的散列算法之一,它取代了 MD4 算法。尽管存在潜在的安全风险,但 MD5 在各种情况下都是数据基础设施的重要组成部分。

在深入研究 MD5 之前,我们需要了解散列到底是什么!

什么是散列?

散列是将标准信息字符串转换为复杂数据片段的过程。这样做是为了对信息进行加密,使其完全改变原始值,从而产生一个与原始值完全不同的散列值。

Hashing Technique

散列使用散列函数将常规数据转换为不可读的形式。这些散列函数是一系列数学运算,通常称为散列摘要或摘要,将原始数据转换为其散列值。无论输入大小如何,特定散列函数(例如 MD5 或 SHA1)的摘要大小始终相同。

散列主要有两个用例:

密码验证

为了保护密码免受攻击者的侵害,网站的用户凭据通常以散列格式存储。比较密码散列更私密,因为散列函数对于相同的输入始终返回相同的结果。

Password Verification

以下是完整流程的工作原理:

  • 用户在登录网站时创建新密码。
  • 它对密码进行散列,并将结果作为摘要保存在服务器上。
  • 用户每次尝试登录时都必须重新输入密码。
  • 为了创建摘要,它会再次使用散列算法运行通过输入的密码。
  • 如果新创建的摘要与服务器上的摘要匹配,则验证登录。

完整性验证

散列函数可用于检查某些文件是否存在数据损坏。与上述示例一样,散列函数即使在迭代参数发生变化的情况下,对于相同的输入也会始终产生相同的结果。

Integrity Verification

该过程的步骤如下:

  • 个人将文件发布到互联网。
  • 散列摘要也与文件一起上传。
  • 当用户获取文件时,散列摘要会更新。
  • 如果摘要与初始散列值匹配,则文件完整性得到保留。
  • 在建立了散列的基本基础后,您就可以检查 MD5 算法,这是本章的主要重点。

什么是 MD5 算法?

MD5(消息摘要方法 5)是一种加密散列算法,可用于从任意长度的字符串创建 128 位摘要。摘要使用 32 位十六进制数表示。

该方法由罗纳德·里维斯特于 1991 年创建,用于启用数字签名的验证。为了增强安全措施,它已集成到各种框架中。

MD5 Algorithm

由于散列函数的建议,摘要大小始终为 128 位,即使对输入字符串进行微小的更改也会导致摘要发生很大差异。这是为了减少散列冲突(或生成类似散列)的可能性。

现在,您将学习构成 MD5 算法工作原理的步骤。

MD5 算法步骤

该算法包含四个主要部分:

填充位

当您收到输入字符串时,请验证其大小是否比 512 的倍数小 64 位。为了舍入多余的字符,您必须在添加一个 (1) 到填充位之后添加零。

Padding Bits

填充长度

最终字符串需要包含更多字符才能成为 512 的倍数。为此,请获取原始输入的长度并将其表示为 64 位。将两者组合后,最后一个字符串将准备好进行散列。

Padding Length

初始化 MD 缓冲区

整个字符串被分成多个块,每个块包含 512 位。此外,需要初始化四个缓冲区 (A、B、C 和 D)。这四个 32 位缓冲区分别初始化如下:

Initialize MD Buffer

处理每个块

512 位块可以进一步细分为 16 个子块,每个子块包含 32 位。四轮运算中的每一轮都使用所有缓冲区、常量数组值和子块。

您可以将此常量数组称为 T[1] ⇒ T[64]。

子块由符号 M[0] ⇒ M[15] 标识。

MD5 的实现

现在,我们将借助不同的编程语言来实现 MD5 算法,以便您能够使用任何一种语言进行编码。

使用 Python

为了实现 MD5 算法,我们将使用 Python 的 hashlib 模块,该模块提供了对计算给定消息的哈希值的支持。因此,Python 中的代码如下所示:

import hashlib

def generate_md5(input_string):
   md5_hash = hashlib.md5(input_string.encode()).hexdigest()
   return md5_hash

# function execution
input_string = "tutorialspoint"
md5_hash = generate_md5(input_string)
print("MD5 hash for", input_string, ":", md5_hash)

输出

MD5 hash for tutorialspoint : 6c60b3cfe5124f982eb629e00a98f01f

使用 Java

现在,我们将借助 Java 及其内置库来实现 MD5。因此,我们将使用两个类 MessageDigest 和 NoSuchAlgorithmException。MessageDigest 类允许我们创建各种消息摘要算法(如 MD5)的实例,而 NoSuchAlgorithmException 在所需加密算法在环境中不可访问时引发。使用 Java 实现 MD5 的代码如下所示:

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

public class Md5Algo {
   public static String generateMD5(String input) {
      try {
         MessageDigest md = MessageDigest.getInstance("MD5");
         byte[] inputBytes = input.getBytes();
         byte[] hashBytes = md.digest(inputBytes);

         // Convert the byte array to a hexadecimal string
         StringBuilder sb = new StringBuilder();
         for (byte b : hashBytes) {
            sb.append(String.format("%02x", b));
         }
         return sb.toString();
      } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
         return null;
      }
   }

   public static void main(String[] args) {
      String input = "tutorialspoint";
      String md5Hash = generateMD5(input);
      System.out.println("MD5 hash for " + input + " : " + md5Hash);
   }
}

输出

MD5 hash for tutorialspoint : 6c60b3cfe5124f982eb629e00a98f01f

MD5 的应用

以下是我们可以使用 MD5 算法的一些常见应用:

  • 消息摘要用于验证和检查文件的完整性。
  • 数据加密和安全由 MD5 处理。
  • 它用于密码验证和消息摘要,无论消息大小。
  • 它也用于图形和游戏板。

MD5 的优点

以下是 MD5 的一些优点:

  • 易于比较 - 在摘要验证方面,与最新的哈希算法系列相比,32 位摘要的比较相对简单。
  • 保持密码安全 - 如果密码未以未加密格式保存,黑客和其他攻击者可以访问密码。数据库也受益于摘要,因为所有哈希值的大小相同。
  • 低资源消耗 - 为了将多个服务合并到一个框架中而不会引入 CPU 成本,需要相对较小的内存占用。
  • 完整性检查 - 通过分析传输前后哈希值,您可以留意任何文件损坏。一旦哈希值匹配,文件完整性检查就是有效的并防止数据损坏。

MD5 的缺点

  • 有时,对于不同的输入,MD5 会创建类似的哈希函数。
  • SHA1 比 MD5 提供更好的安全性。
  • 据说 MD5 算法不安全。目前正在使用 SHA256 代替 MD5。
  • MD5 不适用于对称或非对称算法。

MD5 算法安全吗?

任何消息摘要函数的目标都是生成看起来随机的摘要。为了使哈希函数被认为是加密安全的,需要满足两个条件:

  • 攻击者无法生成与给定哈希值匹配的消息。
  • 攻击者不可能生成具有相同哈希值的两个消息。

IETF 指出,MD5 哈希不应用于加密身份验证,因为它们不再被视为加密安全的技术。

广告