第1章:密码学基础回顾

各位同学,咱们这门课叫《密钥派生与证书链安全》。在深入那些复杂协议之前,我强烈建议先把地基夯实。这一章,我们就快速过一遍密码学里最核心的几个概念。别担心,我不会堆公式,咱们用工程师的视角来聊。

本章核心脉络:对称加密 → 非对称加密 → 哈希函数 → 消息认证码。这四个模块,是理解后面所有密钥派生和证书逻辑的基石。

1.1 对称加密:一把钥匙开一把锁

对称加密,说白了就是加密和解密用同一个密钥。你想想看,就像你家的门锁,用一把钥匙锁上,再用同一把钥匙打开。简单、高效,适合加密大量数据。

我个人习惯把对称加密分成两类:流密码和分组密码。流密码像是一个密钥流生成器,逐字节加密;分组密码则是把数据切成固定大小的块,一块一块地处理。

目前工业界最常用的,还是分组密码。比如 AES(高级加密标准)。我记得在2010年左右,很多老旧系统还在用 DES,后来因为安全强度不够,被强制迁移到 AES。那段时间我参与过一个金融系统的改造项目,光是替换加密库就折腾了两个月。

算法 密钥长度 分组大小 状态
AES 128 / 192 / 256 位 128 位 推荐使用
DES 56 位 64 位 已废弃
3DES 112 / 168 位 64 位 逐步淘汰
SM4 128 位 128 位 国标,国内常用

避坑指南:我曾经见过一个团队,直接用 AES 的 ECB 模式加密用户头像。结果因为同一张图片的相同像素块被加密成相同密文,攻击者一眼就能看出图片轮廓。记住:永远不要在生产环境使用 ECB 模式。推荐用 GCM 或 CTR 模式。

1.2 非对称加密:公钥与私钥的默契

非对称加密就更有意思了。它有一对密钥:公钥可以公开,私钥必须保密。用公钥加密的数据,只有对应的私钥能解开。反过来,用私钥签名的数据,任何人都可以用公钥验证。

你想想看,这解决了什么问题?密钥分发问题。对称加密里,你得想办法把密钥安全地传给对方。而非对称加密,你只需要公开公钥,别人就能给你发密文了。

目前主流的非对称算法有 RSA、ECC(椭圆曲线)和 SM2(国密)。我个人更偏爱 ECC,因为它在同等安全强度下,密钥更短,计算更快。比如 256 位的 ECC 密钥,安全强度相当于 3072 位的 RSA 密钥。

# 一个简单的 RSA 密钥生成示例(Python + cryptography 库)
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# 生成私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

# 提取公钥
public_key = private_key.public_key()

# 序列化私钥(PEM 格式)
pem_private = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)
print(pem_private.decode())

小提示:非对称加密虽然强大,但速度比对称加密慢好几个数量级。实际应用中,我们通常用非对称加密来传输对称密钥,然后用对称密钥加密实际数据。这就是所谓的「混合加密」。

1.3 哈希函数:数据的指纹

哈希函数,你可以把它想象成一个榨汁机。你把任意长度的数据扔进去,它给你榨出一杯固定长度的「果汁」。而且这个榨汁过程是单向的——你没法从果汁还原出原来的水果。

好的哈希函数有三个特性:

  • 抗碰撞性:很难找到两个不同的输入,产生相同的输出。
  • 抗原像性:给定输出,无法反推出输入。
  • 抗第二原像性:给定一个输入和它的哈希值,很难找到另一个输入产生相同的哈希值。

我在项目中遇到过最典型的哈希应用,就是文件完整性校验。下载一个大文件时,网站通常会提供一个 SHA-256 哈希值。你下载完后自己算一遍,比对一下,就知道文件有没有被篡改。

算法 输出长度 安全状态
MD5 128 位 已破解,不要用
SHA-1 160 位 已破解,不要用
SHA-256 256 位 推荐使用
SHA-3 可配置 新一代标准
SM3 256 位 国标,国内推荐

避坑指南:我曾经审计过一个密码存储系统,他们用 MD5 对用户密码做哈希。结果呢?彩虹表一查,大部分密码直接暴露。记住:存储密码要用专门的密码哈希函数,比如 bcrypt、scrypt 或 Argon2,而不是普通的哈希函数。

1.4 消息认证码:防篡改的封条

消息认证码(MAC),它的作用是确保消息在传输过程中没有被篡改,并且消息确实来自声称的发送者。你可以把它理解成一种「带密钥的哈希」。

具体做法是:发送方用共享密钥和消息一起计算出一个 MAC 值,然后把消息和 MAC 一起发给接收方。接收方用同样的密钥重新计算 MAC,比对一下就知道消息是否完整。

常见的 MAC 算法有 HMAC(基于哈希的 MAC)和 CMAC(基于分组密码的 MAC)。HMAC 是最常用的,比如 HMAC-SHA256。

# HMAC-SHA256 示例(Python)
import hmac
import hashlib

key = b"shared_secret_key"
message = b"Hello, this is a secure message."

# 计算 HMAC
mac = hmac.new(key, message, hashlib.sha256).digest()
print("HMAC (hex):", mac.hex())

# 验证 HMAC
expected_mac = mac  # 假设这是从发送方收到的
is_valid = hmac.compare_digest(mac, expected_mac)
print("MAC 验证结果:", is_valid)

小提示:HMAC 和数字签名有什么区别?HMAC 需要双方共享同一个密钥,适合点对点通信。数字签名使用非对称密钥,适合一对多的场景,比如软件发布者签名,所有用户都可以用公钥验证。

1.5 知识体系总览

为了让你更直观地理解这四个模块之间的关系,我画了一张图。你可以看到,对称加密和非对称加密负责「机密性」,哈希函数负责「完整性」,消息认证码则兼顾「完整性和认证」。

密码学基础四模块关系图 密码学基础四模块 对称加密 非对称加密 哈希函数 消息认证码 功能定位 对称/非对称加密 → 机密性 | 哈希函数 → 完整性 | 消息认证码 → 完整性 + 认证 消息认证码 = 哈希函数 + 共享密钥

嗯,到这里,密码学基础的四块基石就铺好了。对称加密和非对称加密解决「别人看不懂」,哈希函数解决「别人改不了」,消息认证码解决「别人冒充不了」。后面的章节,我们会基于这些概念,一步步搭建起密钥派生和证书链的完整体系。