Skip to content

03 文件也有身份证 - MD5 和 SHA256

一个实际场景

从网上下载了一个安装包,但是安装出错,想要确实是不是安装包下载不完整;

  • 如何进行文件一致性校验
  • 充分利用内容的哈希值信息
  • 一般镜像下载网站均会提供文件的 MD5 值或 SHA256 值

什么是哈希值

用于唯一标识数据的固定长度的数字值,能够以较小内容表征大量内容;

  • 常以 2^n 次方 0/1-bit 表征哈希值;
  • 通常用于验证通过不安全通道发送的数据的完整性;
  • MD5 和 SHA256 是两种常用的哈希算法;

MD5 (Message Digest Algorithm 5)

MD5 是一种广泛使用的哈希函数,能够生成一个 128 位的哈希值(通常表示为 32 个十六进制字符)。尽管 MD5 在过去被广泛使用,但由于其安全性问题(容易受到碰撞攻击),现在通常不推荐用于安全敏感的应用。

SHA-256 (Secure Hash Algorithm 256-bit)

SHA-256 是 SHA-2 系列中的一种哈希算法,能够生成一个 256 位的哈希值(通常表示为 64 个十六进制字符)。SHA-256 被认为是目前最安全的哈希算法之一,广泛用于加密和数据完整性验证。

MD5 和 SHA256 的异同

  • 相同点
    • 常用于数字签名、数据完整性检查和密码学应用;
    • 单向哈希,无法从结果反推原始数据;
    • 同一文件生成的值相同;
  • 不同点
    • MD5 的哈希值长度为 128 位,SHA256 的哈希值长度为 256 位;
    • MD5 值的计算速度更快,SHA256 值的安全性更高;

MD5 的计算原理

  • 将文件内容转换为二进制;
  • 对文件内容进行填充,使长度为 (512m+448)-bit;
  • 将填充后的文件内容进行分块处理;
  • 基于逻辑运算、位运算和加法运算的 64 轮迭代哈希值计算;
  • 将 128 位二进制哈希值转换为 32 位十六进制数值输出;

Linux 计算哈希值

  • MD5 值计算方法:md5sum [文件名]
  • SHA256 值计算方法:sha256sum [文件名]
  • 输出为该文件的哈希值信息
  • -c:从文件中读取 MD5/SHA256 哈希值,并检查文件的完整性。
bash
  ~ md5sum lol.exe # 计算 lol.exe 文件的 MD5 值
d41d8cd98f00b204e9800998ecf8427e  lol.exe
  ~ sha256sum lol.exe # 计算 lol.exe 文件的 SHA256 值
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  lol.exe

Windows 计算哈希值

Get-FileHash (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn

  • 计算 MD5 值:Get-FileHash -Path [文件名] -Algorithm MD5
  • 计算 SHA256 值:Get-FileHash -Path [文件名] -Algorithm SHA256
  • 输出为该文件的哈希值信息
powershell
> Get-FileHash /etc/apt/sources.list | Format-List

Algorithm : SHA256
Hash      : 3CBCFDDEC145E3382D592266BE193E5BE53443138EE6AB6CA09FF20DF609E268
Path      : /etc/apt/sources.list

> Get-FileHash -Path lol.exe -Algorithm MD5 | Format-List

Algorithm : MD5
Hash      : D41D8CD98F00B204E9800998ECF8427E
Path      : lol.exe

> Get-FileHash -Path lol.exe -Algorithm SHA256 | Format-List

Algorithm : SHA256
Hash      : E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
Path      : lol.exe

比较 MD5 和 SHA-256

  • 安全性:SHA-256 比 MD5 更安全,因为 SHA-256 的哈希值更长,且更难受到碰撞攻击。
  • 性能:MD5 的计算速度通常比 SHA-256 快,但在现代硬件上,这种差异通常可以忽略不计。
  • 应用场景:对于安全敏感的应用(如密码存储、数字签名等),应使用 SHA-256 或更强的哈希算法。对于非安全敏感的应用(如数据完整性验证),MD5 仍然可以使用,但应谨慎考虑其安全性问题。

MD5 唯一吗

不唯一。原理分析:

  • MD5 是一个 128-bit 0/1 字符串,总共存在 2^128 种可能值;
  • 计算机上不同内容的文件数量无穷多
  • 存在多对一的映射,因此理论上,存在不同文件内容具有相同 MD5 值的情况

MD5 可用吗

可用。原理分析:

  • 任意找两个文件,两者 MD5 值相同的概率几乎为 0,在实际应用中,可认为 MD5 值相同即为同一文件;
  • 相比 MD5 算法,SHA256 的安全性更高,在高安全性场景下,推荐使用 SHA256;

总结

  • MD5:生成 128 位哈希值,速度快,但安全性较低,不推荐用于安全敏感的应用。
  • SHA-256:生成 256 位哈希值,安全性高,广泛用于加密和数据完整性验证。
bash
  ~ md5sum motrix.reg # 计算 motrix.reg 文件的 MD5 值
d29bc55f07c13925fc8e8599cfd824ce  motrix.reg
  ~ md5sum motrix.reg > motrix.reg.md5 # 将 motrix.reg 文件的 MD5 值输出到 motrix.reg.md5 文件
  ~ md5sum -c motrix.reg.md5 # 验证 motrix.reg 文件的 MD5 值是否正确
motrix.reg: OK
  ~ echo "newline" >> motrix.reg # 在 motrix.reg 文件的末尾添加 newline 内容
  ~ md5sum -c motrix.reg.md5 # 再次验证 motrix.reg 文件的 MD5 值是否正确,发现不一致
motrix.reg: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
bash
  ~ sha256sum motrix.reg # 计算 motrix.reg 文件的 SHA256 值
70199c2823d86790e3034af0f0c6a82426206a69d33e0c193609ac8c5c10dad9  motrix.reg
  ~ sha256sum motrix.reg > motrix.reg.sha256 # 将 motrix.reg 文件的 SHA256 值输出到 motrix.reg.sha256 文件
  ~ sha256sum -c motrix.reg.sha256 # 验证 motrix.reg 文件的 SHA256 值是否正确
motrix.reg: OK
  ~ sed -i  's/newline//' motrix.reg # 删除 motrix.reg 文件的 newline 内容
  ~ sha256sum -c motrix.reg.sha256 # 再次验证 motrix.reg 文件的 SHA256 值是否正确,发现不一致
motrix.reg: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
powershell
~\Desktop
get-filehash .\motrix.reg -Algorithm md5 | Format-List

Algorithm : MD5
Hash      : D29BC55F07C13925FC8E8599CFD824CE
Path      : C:\Users\Administrator\Desktop\motrix.reg


~\Desktop
get-filehash .\motrix.reg -Algorithm sha256 | Format-List

Algorithm : SHA256
Hash      : 8C3F6F7ACD49069776CE47AA331EB058549FE9A8BA70C7387AEE63CD437B80D1
Path      : C:\Users\Administrator\Desktop\motrix.reg