第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 知识体系总览
为了让你更直观地理解这四个模块之间的关系,我画了一张图。你可以看到,对称加密和非对称加密负责「机密性」,哈希函数负责「完整性」,消息认证码则兼顾「完整性和认证」。
嗯,到这里,密码学基础的四块基石就铺好了。对称加密和非对称加密解决「别人看不懂」,哈希函数解决「别人改不了」,消息认证码解决「别人冒充不了」。后面的章节,我们会基于这些概念,一步步搭建起密钥派生和证书链的完整体系。