密码学基础:对称加密、非对称加密、哈希算法
聊到 HTTPS 握手里的水印嵌入,你肯定会碰到一个绕不开的坎——密码学基础。说实话,我早期在接触证书与密钥协商时,对这些算法的理解也是磕磕绊绊的。
别急,我们先不深入复杂的数学公式。你只要搞清楚三种基本类型:对称加密、非对称加密、哈希算法。这三者就像工具箱里的螺丝刀、扳手和钳子,各有各的用途,搭配起来才能干活。
1. 对称加密
原理很简单:同一把钥匙既能锁门也能开门。通信双方共享同一个密钥,你用它加密数据,对方用同一个密钥解密。
常见的对称算法:
- AES(高级加密标准)—— 目前最常用,128/192/256位密钥。我习惯用 AES-256-GCM,兼顾速度和认证。
- 3DES(三重数据加密算法)—— 老古董了,现在基本不用,但有些遗留系统还在跑。
- SM4 —— 国密标准,国内项目必须支持。
我在项目中遇到过一个问题:用 AES-ECB 加密同样的明文块会得到同样的密文块,攻击者可以直接识别模式。那次的教训让我从此只用 GCM 或 CBC+随机IV。
我曾经接手过一个老项目,里面还在用 DES 加密银行卡号。你想想看,DES 的密钥只有56位,用现成的机器不到一天就能暴力破解。我二话不说直接升级成了 AES-256。
适用场景:数据传输量大、对速度有要求。比如 HTTPS 握手完成后,真正的 HTTP 数据就是用对称加密传输的。因为它快,适合大量数据。
2. 非对称加密
非对称加密的特点是一对钥匙:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,反之亦然(但一般只用公钥加密,私钥解密)。
常见算法:
- RSA – 最经典,但密钥越长性能越差。2048位是目前最低标准。
- ECC(椭圆曲线) – 256位的 ECC 能达到 RSA 3072 位的安全强度,而且快得多。我个人建议新项目优先考虑 ECC。
- DH / ECDH – 用于密钥交换,而不是直接加解密。HTTPS 里常用 ECDHE 实现前向安全。
第一次做 TLS 配置时,我贪省事用了 RSA 密钥交换。后来发现每次握手都要做一次大数运算,高并发下服务器 CPU 直接飙到 100%。换成了 ECDHE 之后,瞬间轻松了。
你可能会问:“为什么不用非对称加密直接加密全部数据?” 道理很简单——它实在太慢了。非对称加密的速度比对称加密慢数百倍甚至上千倍,只适合加密小块数据,比如对称密钥或证书签名。
3. 哈希算法
哈希不是加密,它是一类单向函数。你给它任意长度的数据,它吐出一段固定长度的“指纹”。这个过程不可逆——你无法从指纹反推出原始数据。
常见哈希算法:
- MD5 – 128位,已被破解,只能用于校验完整性(不防攻击)。
- SHA-1 – 160位,也有碰撞攻击,不再安全。
- SHA-256 / SHA-3 – 目前推荐,256位或更高,HTTPS 证书签名常用。
- SM3 – 国密哈希,256位。
哈希在 HTTPS 里的用途:
- 消息认证(HMAC) – 用密钥对消息做哈希,防止篡改。
- 证书指纹 – 我们常说的“证书 SHA-256 指纹”,就是哈希后的结果。
- 数字签名 – 先对消息哈希,再用私钥加密哈希值,别人用公钥解密并比对。
哈希不等同于“加密”。很多新人会把 “Base64” 当成加密,但实际上 Base64 只是编码,任何人都能解码。哈希才是真正的单向变换。
对比总览
| 类型 | 密钥数量 | 速度 | 安全性基础 | 典型用途 |
|---|---|---|---|---|
| 对称加密 | 1(共享密钥) | 非常快 | 密钥保密强度 | 大量数据传输,如 HTTP 内容 |
| 非对称加密 | 2(公钥 + 私钥) | 慢(百倍级) | 数学难题(大数分解/椭圆曲线离散对数) | 密钥交换、数字签名、证书 |
| 哈希算法 | 无密钥(或需密钥做HMAC) | 快 | 抗碰撞、单向性 | 完整性校验、指纹、消息认证、数字签名 |
你瞧瞧这个表,是不是一目了然?对称加密用来干活,非对称加密用来传钥匙,哈希用来防篡改。三者配合,才构成了 HTTPS 的信任链。
做水印嵌入时,我们经常会用到这些算法的组合:比如用哈希生成水印指纹、用对称加密加密水印内容、用非对称加密来传递对称密钥。后面的章节你会看到具体的实现方式。
对了,有个细节我想提醒你:“数字签名”并不是一个独立的算法,它本质上是“哈希 + 非对称加密”的合体。你先对消息算一个哈希,然后用私钥加密这个哈希,接收方用公钥解密出哈希,再比对原文的哈希是否一致。这个过程保证了消息的来源和完整性。
手算一次 RSA 签名流程,能帮你彻底理解非对称和哈希的关系。我在教新人的时候都会让他们用 OpenSSL 做一次:
echo "hello" | openssl dgst -sha256 -sign private.pem | openssl base64然后试试用公钥验签,你会发现原理其实很简单。
把这些基础啃透了,你再去看 HTTPS 握手的各种细节,就不会觉得眼花缭乱了。