密码学入门:哈希、对称与非对称加密
好,我们进入第二讲。密码学这东西,说简单也简单,说复杂能让你掉头发。我个人习惯把密码学工具分成三大类:哈希、对称加密、非对称加密。这三类各有各的脾气,搞混了,系统就漏风了。
哈希函数:单向的“数字指纹”
哈希函数是什么?说白了,就是给任意数据算出一个固定长度的“摘要”。你输入“Hello”,出来一串字符,比如 8b1a9953c4611296a827abf8c47804d7。你改一个字母,出来的摘要面目全非。而且从摘要反向推不回原文,这就是单向性。
哈希的三个核心性质
- 单向性:从摘要推原文,几乎不可能。
- 抗碰撞性:很难找到两个不同输入有相同摘要。
- 雪崩效应:输入改一点,输出翻天覆地。
我在项目里见过一个坑:有人用 MD5 存密码。MD5 早就不安全了,那碰撞已经能人为构造。我曾经在渗透测试时,轻松用彩虹表破掉了那套系统的管理员密码。所以你想想看,现在推荐的是 SHA-256 或更强的 SHA-3。
🔑 实际应用:密码存储、文件完整性校验、数字签名中的摘要生成。
对称加密:加密和解密用同一把钥匙
对称加密的思路很直白:你和我共用一把密钥,我用它加密,你用它解密。优点是快,特别快。缺点是密钥怎么安全地给到对方?
常见的对称加密算法有:
| 算法 | 密钥长度 | 分组大小 | 模式举例 |
|---|---|---|---|
| AES | 128 / 192 / 256 | 128 | CBC, GCM |
| ChaCha20 | 256 | 流加密 | Poly1305 |
| DES (不安全) | 56 | 64 | ECB |
⚠️ 注意:千万不要在正式环境用 DES 或 3DES。ECB 模式也不要碰——加密同样的原文会产生同样的密文,攻击者一眼就能看出模式。
我记得有一次帮客户做密钥管理系统设计,他们想用同一个 AES 密钥加密所有用户的会话。我说不行,一旦一个密钥泄露,所有历史通信都能解密。后来我们改为每个会话派生一个临时密钥,主密钥只用来派生子密钥。
非对称加密:公钥加密,私钥解密
非对称加密就厉害了。每个人有一个公钥(公开)和一个私钥(自己藏好)。别人用你的公钥加密数据,只有你能用私钥解开。这不就解决了密钥分发问题?
常见的算法:RSA、ECC(椭圆曲线)、Ed25519。RSA 简单但慢,密钥太长(2048位起步)。ECC 能用更短的密钥达到同样安全等级,所以现在移动端、IoT 设备里 ECC 越来越流行。
核心对比:对称 vs 非对称
- 速度:对称加密快 1000 倍以上,适合加密大量数据。
- 密钥管理:对称需要安全通道送密钥;非对称只公开公钥就行。
- 实际组合:先用非对称加密协商一个临时对称密钥(例如 TLS 握手中的 ECDHE),然后用这个对称密钥加密后续所有流量。
你想想,如果我用 RSA 加密一段 1MB 的视频,得跑半天。所以实际中都是混合加密:用非对称交换一个对称密钥,然后对称加密数据。我在做 API 网关签名时就是这样做的。
密码学工具箱:一张图看明白
实战避坑:我曾经踩过的密码学烂泥
- 不要自己实现加密算法。你以为写对了?侧信道攻击、 padding oracle 攻击分分钟教你做人。用成熟的库,比如 OpenSSL、libsodium。
- 哈希要加盐。我曾经审计一个系统,密码直接用 SHA256 存,没有盐。结果相同的密码产生相同的哈希,离线破解效率极高。加一个随机盐,每个用户哈希都不一样了。
- 密钥生命周期管理。对称密钥需要定期轮换。我在一个银行业务中,他们用了同一个 AES 密钥两年没换,我们强制推行了每 90 天轮换一次的策略。
- 不要忽视随机数质量。非对称加密的私钥生成依赖随机数。如果随机数种子可预测,攻击者能还原私钥。Linux 上要用
/dev/urandom或者getrandom()。
💡 一个小习惯:我每次设计认证协议时,都会画一个小表格,列出用到了哪类密码学原语、为什么选它、密钥存在哪里、轮换策略是什么。坚持下来,能挡掉 80% 的设计漏洞。
怎么结合到身份认证?引子
这一章是基础武器库。后面你会看到:哈希用来存密码摘要;对称加密用来加密令牌(比如 JWT 的 payload);非对称加密用来做数字签名(证明是谁签发的凭证)。三者联合,就是身份认证和 Secrets 保护的基石。