1. 密码学基础回顾:对称加密与非对称加密的核心区别、哈希函数的作用、数字签名与证书体系

各位同学好,我是你们这门课的老朋友。在正式开始选型实战之前,咱们得先把地基夯实。密码学这东西,说白了就是一套「攻防游戏」的规则。你如果不理解这些基础概念,后面选算法、搭架构,很容易踩坑。

我见过不少项目,上来就拍脑袋选了个「最安全」的算法,结果性能扛不住,或者密钥管理乱成一锅粥。所以,这一章咱们不聊虚的,就聊聊那些你每天都会用到,但可能没细想过的核心概念。

1.1 对称加密 vs 非对称加密:一把钥匙和两把钥匙的区别

这是密码学里最基础,也最容易被混淆的一对概念。我习惯用一个比喻来理解:

  • 对称加密:就像你家大门。你和你老婆各有一把一模一样的钥匙。你用这把钥匙锁门,她用这把钥匙开门。方便,但问题来了——如果钥匙丢了,或者被复制了,那门就形同虚设。
  • 非对称加密:更像一个带锁的邮箱。任何人都可以把信塞进去(用你的公钥加密),但只有你有钥匙能打开(用你的私钥解密)。公钥公开,私钥保密。

它们的核心区别,我整理成了一张表,方便你对比:

特性 对称加密 非对称加密
密钥数量 1 个(共享密钥) 2 个(公钥 + 私钥)
密钥分发 困难,需要安全通道 容易,公钥可公开
计算速度 快(硬件加速友好) 慢(慢 100-1000 倍)
典型算法 AES, ChaCha20, SM4 RSA, ECDSA, SM2
主要用途 大量数据加密 密钥交换、数字签名
我的经验: 实际项目中,没人会用非对称加密去加密一个 1GB 的视频文件。那太慢了。正确的做法是「混合加密」:用非对称加密交换一个临时对称密钥,然后用这个对称密钥去加密实际数据。HTTPS 就是这么干的。

1.2 哈希函数:数据的「指纹」

哈希函数,你肯定不陌生。它能把任意长度的数据,压缩成一个固定长度的「摘要」。这个摘要,就像人的指纹一样,理论上具有唯一性。

哈希函数有几个关键特性,我特别强调一下:

  • 单向性:从哈希值反推原始数据,在计算上是不可能的。你想想看,如果哈希能逆推,那密码存储就彻底完蛋了。
  • 抗碰撞性:找到两个不同的输入,产生相同的哈希值,这几乎不可能。嗯,这里要注意,像 MD5 和 SHA-1 已经被证明有碰撞风险了,千万别再用在生产环境。
  • 雪崩效应:输入哪怕只改一个比特,输出的哈希值也会天翻地覆。

哈希函数在安全领域无处不在。我举几个最常见的场景:

  1. 密码存储:数据库里存的不是你的密码明文,而是密码的哈希值。即使数据库泄露,攻击者也拿不到你的原始密码。
  2. 数据完整性校验:下载一个大文件时,网站通常会提供一个 SHA-256 哈希值。你下载完后自己算一遍,如果一致,说明文件没被篡改。
  3. 数字签名的基础:签名前,先对消息做哈希,再对哈希值签名。这样效率更高,也更安全。
避坑指南: 我曾经在一个项目中看到有人直接用 MD5 做密码哈希。我当场就让他改了。MD5 的碰撞攻击在 2004 年就已经被公开,现在用 GPU 跑 MD5 碰撞简直是秒出。记住,密码哈希要用专门的算法,比如 bcrypt、scrypt 或 Argon2,而不是普通的 SHA-256。

1.3 数字签名与证书体系:解决「你是谁」和「你说了算不算」的问题

数字签名,本质上是用非对称加密的「反向」操作。你用私钥签名,别人用你的公钥验签。它解决了两个核心问题:

  • 身份认证:证明这个数据确实是你发的。
  • 不可否认性:你签了名,就不能事后抵赖说「这不是我发的」。

但这里有个问题:你怎么证明你手里的公钥,真的是我的?万一有人伪造了一个公钥,说那是我的呢?

这就引出了 PKI(公钥基础设施) 和 数字证书。

数字证书,说白了就是一张「电子身份证」。它由权威的 CA(证书颁发机构) 签发。证书里包含了:

  • 持有者的身份信息(比如域名、公司名)
  • 持有者的公钥
  • CA 的数字签名
  • 有效期、序列号等

你信任 CA,CA 担保了「这个公钥属于这个实体」。这样就形成了一个信任链。

为了让你更直观地理解,我画了一张图,展示了数字签名的完整流程:

数字签名与验证流程 发送方(签名者) 原始消息 M SHA-256 消息摘要 H 发送方私钥 RSA 签名 数字签名 S 发送 (M || S) 接收方(验证者) 流程说明 1. 对消息做哈希 2. 用私钥签名哈希 3. 发送消息+签名 4. 接收方做哈希 5. 用公钥验签 6. 对比两个哈希 一致则验证通过

你看,整个流程清晰明了。接收方拿到消息和签名后,用发送方的公钥解密签名,得到哈希值 H1。同时,自己对消息做哈希,得到 H2。如果 H1 == H2,说明消息确实是发送方签发的,且未被篡改。

核心要点: 数字签名不是加密数据,而是「签名」数据。它保证的是完整性和不可否认性,而不是机密性。如果你既要保密又要签名,那就先加密,再对密文签名,或者先签名再加密,但顺序有讲究,我们后面会讲到。

好了,这一章的基础概念就回顾到这里。这些内容虽然基础,但它们是整个密码学大厦的基石。后面的章节,我们会基于这些概念,深入到具体的算法选型、性能调优和工程实践中去。