第一章 密码学基础:对称加密、非对称加密与哈希函数

说到密码学,很多人第一反应就是“加解密”。其实它远不止这些。我做了十年安全,最深的体会是:密码学是信任的数学基石。你想想看,互联网上两个陌生人怎么互相信任对方没改过数据?靠的就是这三类工具:对称加密、非对称加密、哈希函数。

这一章我们不讲复杂的数学公式,而是用工程师的直觉去理解它们到底解决了什么问题。

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

对称加密,说白了就是加密和解密用同一个密钥。你家里门锁的钥匙就是对称的——你用同一把钥匙锁门、开门。

常见的对称算法有 AES、DES、3DES、SM4(国密)。现在实际项目里几乎只用 AES-256,DES 早就不推荐了。

个人习惯:我一般用 AES-256-GCM 模式。GCM 模式自带认证标签,能防止数据被篡改,省得再单独加一个 HMAC。

看一个简单的 AES 加密例子(Python 用 cryptography 库):

from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os

key = AESGCM.generate_key(bit_length=256)   # 生成 256 位密钥
nonce = os.urandom(12)                      # 随机 nonce,12 字节
aesgcm = AESGCM(key)

plaintext = b"Hello, Key Boundary!"
ciphertext = aesgcm.encrypt(nonce, plaintext, None)
print(ciphertext.hex())

1.2 非对称加密 —— 公钥私钥,各司其职

非对称加密有两个钥匙:公钥可以公开,私钥只有自己知道。你拿公钥加密的数据,只有私钥能解开;反过来,私钥签名,公钥验签。

我遇到过最惊险的一次:客户的 HTTPS 证书私钥被运维误删了。幸好备份在离线 HSM 里,不然整个电商平台都得瘫痪。所以记住:私钥一旦泄露,整个信任体系就崩了。

主流算法:

  • RSA:经典但慢,2048 位起步,4096 位更安全。
  • ECC(椭圆曲线):更短的密钥达到相同安全级别,推荐 Curve25519 或 P-256。
  • SM2:国密标准,基于 ECC。

举个 ECC 加密的例子(Elliptic Curve Integrated Encryption Scheme,ECIES):

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization

private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()

# 公钥序列化后发给对方
pub_bytes = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)
避坑指南:我曾经在项目中直接用 RSA 加密大文件,结果性能惨不忍睹。正确做法是:用对称密钥加密文件,再用非对称加密那把对称密钥。这叫“混合加密”,HTTPS 就是这么做的。

1.3 哈希函数 —— 数据的数字指纹

哈希函数把任意长度的数据变成固定长度的“摘要”。它不可逆,而且哪怕只改一个比特,摘要就完全不同。

我用哈希最多的场景是:校验文件完整性、密码存储、数字签名。

算法输出长度安全性推荐场景
MD5128 位已破解,不推荐仅用于非安全校验
SHA-1160 位已削弱,避免使用历史遗留系统
SHA-256256 位安全通用场景
SHA-3可变安全新项目可选
SM3256 位安全(国密)国内合规需求
关键点:哈希不是加密。它没有密钥,不能还原原文。如果有人跟你说“哈希解密”,那一定是撞库或者彩虹表攻击。

用 Python 算个 SHA-256 看看:

import hashlib

data = b"Key Boundary Blue Book"
digest = hashlib.sha256(data).hexdigest()
print(digest)
# 输出:e3b0c44298fc1c149afbf4c8996fb924...

1.4 三者的核心逻辑与关系

我习惯把这三者画成一个框架图。你跟着过一遍,以后看任何密码系统都能对号入座。

密码学三大基础组件关系图 对称加密 · 非对称加密 · 哈希函数 对称加密 密钥:对称密钥 特性:加解密同钥 代表:AES-256-GCM 非对称加密 密钥:公钥 / 私钥 特性:加密、签名 代表:ECC, RSA 哈希函数 密钥:无(单向) 特性:不可逆 代表:SHA-256, SM3 混合加密 数字签名 混合应用示例:TLS 握手(HTTPS) 非对称加密 → 协商对称密钥 → 对称加密传输数据 → 哈希校验完整性 实际项目中三者往往组合使用,单一密码工具无法同时满足机密性、认证性和完整性。 密钥生命周期管理(生成·分发·存储·轮换·销毁) 所有密码学的安全性最终都取决于密钥本身的安全
一句话总结:对称加密管速度(快),非对称加密管安全分发(慢但安全),哈希函数管完整性(不可逆)。三者缺一不可。

1.5 实际项目中的避坑清单

我整理了一些自己踩过的坑,你以后大概率也会遇到:

  • 不要在 ECB 模式下用对称加密——相同明文块会产生相同密文块,泄露结构。我当年给客户做数据库列加密,差点用 ECB,幸好 review 时被同事发现。
  • 不要用 RSA 直接加密长数据——RSA 最多加密密钥长度减 11 字节(比如 2048 位 RSA 只能加密 245 字节),更长的数据要用混合加密。
  • 哈希不能代替密码存储的加盐——直接对密码做 SHA-256,撞库一秒出结果。一定要用 bcrypt/scrypt/Argon2 这些慢哈希,并且每用户随机盐。
  • 不要自己实现密码算法——我见过有人手写 AES,性能差还容易出侧信道漏洞。用成熟的库(OpenSSL, libsodium, cryptography)就好。
曾经踩过的坑:有个项目因为非对称加密的密钥对没有做定期轮换,私钥被暴力猜解。从那以后我强制 key rotation 周期不超过 1 年,并且私钥必须存储在 HSM 或硬件安全模块中。

1.6 本章知识结构速查

密码工具保证什么典型算法密钥管理重点
对称加密机密性AES-256, SM4密钥分发难,需要非对称或 KDC 协助
非对称加密机密性 + 认证ECC, RSA, SM2私钥必须安全存储,公钥可公开
哈希函数完整性SHA-256, SM3无需密钥,但要注意加盐防彩虹表