0Pricing
Cloud & IT Cert Prep · 课时

哈希与数据完整性

学习 SHA-256、MD5 和 HMAC 如何生成固定长度的摘要,以验证数据在传输或存储过程中未被篡改。

哈希与数据完整性 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。

什么是哈希函数

密码哈希函数是一种数学算法,可以接受任意大小的输入,并生成固定长度的输出,该输出称为哈希值、摘要或指纹。哈希函数是单向的:已知哈希值时,在计算上应当无法实际求出原始输入。哈希函数还是确定性的:相同的输入始终产生相同的哈希值。哈希函数是数据完整性验证、数字签名、密码存储以及许多其他安全机制的基础。

安全哈希函数的属性

安全的密码哈希函数必须具备四项关键属性。原像抗性:给定哈希输出后,在计算上无法实际找到能够生成该输出的任何输入。第二原像抗性:给定一个输入后,无法实际找到具有相同哈希值的其他输入。抗碰撞性:无法实际找到两个能够产生相同哈希输出的不同输入。雪崩效应:即使只更改输入中的一个比特,也会导致完全不同的哈希输出,从而能够检测出篡改。

# Avalanche effect demonstration
echo -n 'Hello' | sha256sum
# 185f8db32...  (completely different when one char changes)
echo -n 'Hello!' | sha256sum
# 334d016f7...  (entirely different hash)

# Same input ALWAYS produces same hash (deterministic)
echo -n 'Security+' | sha256sum
echo -n 'Security+' | sha256sum
# Both outputs are identical

MD5:已破解且已弃用

MD5(消息摘要 5)会生成 128 位哈希值,曾经得到广泛使用。然而,研究人员在 2004 年证明了针对 MD5 的碰撞攻击,这意味着可以找到两个产生相同哈希值的不同输入。对于完整性验证而言,这是灾难性的:攻击者可以替换一个恶意文件,而该文件具有与原文件相同的 MD5 哈希值。对于密码安全而言,MD5 已被完全破解,不得用于完整性验证、数字签名或密码哈希。如今它有时仍用于非安全校验和(旧式文件验证),但这仅适合检测意外损坏。

SHA 系列:SHA-1、SHA-256、SHA-3

安全哈希算法(SHA)系列是 Security+ 中最重要的一组哈希函数。SHA-1(160 位)曾多年作为标准,但在 2017 年被实际碰撞攻击破解(Google 的 SHAttered 项目),现已弃用。SHA-256(SHA-2 系列的一部分,输出长度为 256 位)是数字签名、TLS 证书和文件完整性验证的当前行业标准。SHA-3(Keccak)是 NIST 推出的替代算法,可以抵抗针对 SHA-2 结构的攻击,不过 SHA-256 仍是大多数应用的主流选择。

# Common hash computations
echo -n 'password123' | sha256sum
# a665a4592...64 hex chars = 256 bits

echo -n 'password123' | sha512sum  
# b109f3bb...128 hex chars = 512 bits (SHA-512)

# File integrity check
sha256sum /path/to/downloaded_file.iso > file.sha256
sha256sum -c file.sha256
# file.iso: OK

用于密码存储的哈希函数

以明文存储密码永远不可接受。当用户创建密码时,数据库中存储的是哈希值,而不是密码本身。当用户登录时,系统会对其输入的密码进行哈希处理,并与已存储的哈希值进行比较。然而,标准 SHA-256 对密码存储而言速度过快——攻击者可以使用 GPU,针对被盗的密码数据库每秒测试数十亿个哈希值。专门用于密码哈希的函数,如 bcrypt、PBKDF2 和 Argon2,会增加计算成本(工作因子)和内存要求,使大规模破解变得不切实际。

# bcrypt hash example (Python-style pseudocode)
import bcrypt
password = b'mySecretPassword'
# Hash with work factor of 12 (2^12 = 4096 iterations)
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
# Stored in DB: $2b$12$H0qS/LkPkAiH8KlxJb3lFuK...

# Verify (never compare raw hashes for bcrypt)
bcrypt.checkpw(password, hashed)  # Returns True

加盐:击败彩虹表

彩虹表是一种预先计算的查找表,用于将常见密码映射到对应的哈希值,使攻击者能够立即查找哈希值并找出原始密码。为击败彩虹表,密码哈希必须进行加盐。Salt 是在哈希处理前添加到密码中的随机值,即使两个用户使用相同的密码,也能使每个用户的哈希值保持唯一。Salt 会与哈希值一起存储(不需要保密)。即使攻击者获得了整个密码数据库,预先计算的彩虹表也毫无用处,因为每个哈希值使用的 Salt 都不同。

# Salt demonstration
# Without salt: same password = same hash (rainbow table attack works)
# SHA256('password123') = always the same hash

# With salt: same password + random salt = unique hash
# SHA256('password123' + 'aBc8xZ') = unique hash for this user
# SHA256('password123' + 'mK2pYq') = completely different hash

# The salt is stored in the database alongside the hashed value
# Format: $salt$hash or combined as in bcrypt output

HMAC:为哈希添加身份验证

HMAC(基于哈希的消息身份验证码)是一种使用哈希函数和密钥生成身份验证码的构造。与普通哈希值不同,只有知道该密钥的参与方才能计算和验证 HMAC。它同时提供完整性(检测更改)和身份验证(证明消息来自拥有该密钥的一方)。HMAC-SHA256 广泛用于 API 身份验证(为 API 请求签名)、JWT 令牌和 TLS MAC 操作。它可以阻止拦截消息的攻击者用精心构造的替代消息进行替换。

# Compute HMAC-SHA256 with OpenSSL
openssl dgst -sha256 -hmac 'my-secret-api-key' -hex api_request.json
# Output: HMAC-SHA256(api_request.json)= 3d4e2f...

# Only someone with 'my-secret-api-key' can generate or verify this HMAC
# Used in AWS Signature V4 for API authentication
# Used in JWT HS256 algorithm for token integrity

数字签名中的哈希函数

哈希函数在数字签名中发挥着核心作用。为大型文档签名时,您不会使用私钥加密整个文档(这样做会极其缓慢)。相反,您需要:(1)计算文档的哈希值(速度快,并生成较小的固定长度摘要);然后(2)使用私钥为这个小哈希值签名。签名本质上就是经过加密的哈希值。验证时遵循相同的模式:解密签名以获取哈希值,独立地计算文档的哈希值,然后进行比较。所有现代 PKI 证书都必须使用 SHA-256;新证书禁止使用 SHA-1。

文件完整性监控(FIM)

文件完整性监控(FIM)使用哈希函数检测关键系统文件是否发生未经授权的更改。在建立基线时,FIM 工具会计算所有受监控文件的哈希值,并安全地存储这些哈希值。它会定期(或持续)重新计算文件的哈希值,并与基线进行比较。任何不匹配都表示文件已被修改,这可能是恶意软件或未经授权的管理员操作所导致的。Tripwire、AIDE(Linux)以及 Windows 自带的完整性检查工具等 FIM 工具都使用 SHA-256 哈希值。PCI-DSS 等合规框架要求使用 FIM 来保护持卡人数据环境。

# AIDE (Advanced Intrusion Detection Environment) - Linux FIM
# Initialize baseline database
aide --init
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# Check for changes (run via cron daily)
aide --check
# Output shows any files that were added, changed, or deleted
# File: /etc/passwd changed
# MD5 : old_hash != new_hash

校验和与密码哈希的区别

区分校验和和密码哈希非常重要。CRC32 等校验和用于检测数据在传输过程中发生的意外损坏,它们速度快且简单,但攻击者可以轻易伪造。密码哈希(SHA-256)则旨在具备抗碰撞性,即使面对对抗性篡改,也能发现数据被改动。当您只需要验证下载内容是否在传输过程中损坏时,应使用校验和;当您需要验证文件是否遭到对手的蓄意篡改时,应使用密码哈希。

实际中的哈希碰撞攻击

哈希碰撞攻击会产生现实影响。2017 年,研究人员创建了两个具有相同 SHA-1 哈希值的不同 PDF 文件,证明 SHA-1 证书可以被伪造。2008 年,研究人员利用 MD5 碰撞创建了一个看似合法的伪造 CA 证书。正因如此,浏览器会拒绝 MD5 和 SHA-1 证书,证书颁发机构也必须至少使用 SHA-256。了解碰撞攻击有助于您解释算法弃用决策的原因,也能理解为什么“但它仍然会生成哈希值”不足以成为继续使用已破解算法的理由。

快速检查

测试您对本课 CompTIA Security+ (SY0-701) 知识点的理解程度。

课程回顾

本课中您学到了:哈希函数会生成固定长度的摘要,用于完整性验证;MD5 和 SHA-1已被破解并弃用;SHA-256是当前标准;加盐可以击败彩虹表攻击;HMAC使用共享密钥为哈希添加身份验证。接下来我们将学习密钥交换与混合加密。

常见问题解答

「哈希与数据完整性」课时是免费的吗?

是的 — 「哈希与数据完整性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。

「哈希与数据完整性」这节课中我会学到什么?

学习 SHA-256、MD5 和 HMAC 如何生成固定长度的摘要,以验证数据在传输或存储过程中未被篡改。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cloud & IT Cert Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「哈希与数据完整性」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?

能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 对称加密算法
  2. 非对称加密与密钥对
  3. 哈希与数据完整性
  4. 密钥交换与混合加密
← 返回 Cloud & IT Cert Prep