密码学入门:哈希、对称与非对称加密

好,我们进入第二讲。密码学这东西,说简单也简单,说复杂能让你掉头发。我个人习惯把密码学工具分成三大类:哈希、对称加密、非对称加密。这三类各有各的脾气,搞混了,系统就漏风了。

哈希函数:单向的“数字指纹”

哈希函数是什么?说白了,就是给任意数据算出一个固定长度的“摘要”。你输入“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 网关签名时就是这样做的。

密码学工具箱:一张图看明白

密码学三大类:哈希、对称、非对称 密码学工具箱总览 哈希函数 对称加密 非对称加密 单向·抗碰撞·雪崩 高速·密钥分发难题 公钥/私钥·慢但安全 SHA-2 / SHA-3 / BLAKE2 AES-256-GCM / ChaCha20 RSA-2048 / ECC (P-256) 📌 三者在身份认证 & Secrets 联动中各司其职

实战避坑:我曾经踩过的密码学烂泥

  • 不要自己实现加密算法。你以为写对了?侧信道攻击、 padding oracle 攻击分分钟教你做人。用成熟的库,比如 OpenSSL、libsodium。
  • 哈希要加盐。我曾经审计一个系统,密码直接用 SHA256 存,没有盐。结果相同的密码产生相同的哈希,离线破解效率极高。加一个随机盐,每个用户哈希都不一样了。
  • 密钥生命周期管理。对称密钥需要定期轮换。我在一个银行业务中,他们用了同一个 AES 密钥两年没换,我们强制推行了每 90 天轮换一次的策略。
  • 不要忽视随机数质量。非对称加密的私钥生成依赖随机数。如果随机数种子可预测,攻击者能还原私钥。Linux 上要用 /dev/urandom 或者 getrandom()。

💡 一个小习惯:我每次设计认证协议时,都会画一个小表格,列出用到了哪类密码学原语、为什么选它、密钥存在哪里、轮换策略是什么。坚持下来,能挡掉 80% 的设计漏洞。

怎么结合到身份认证?引子

这一章是基础武器库。后面你会看到:哈希用来存密码摘要;对称加密用来加密令牌(比如 JWT 的 payload);非对称加密用来做数字签名(证明是谁签发的凭证)。三者联合,就是身份认证和 Secrets 保护的基石。