密码学基础:对称加密、非对称加密、哈希算法

聊到 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 里的用途:

  1. 消息认证(HMAC) – 用密钥对消息做哈希,防止篡改。
  2. 证书指纹 – 我们常说的“证书 SHA-256 指纹”,就是哈希后的结果。
  3. 数字签名 – 先对消息哈希,再用私钥加密哈希值,别人用公钥解密并比对。
❗️ 关键点
哈希不等同于“加密”。很多新人会把 “Base64” 当成加密,但实际上 Base64 只是编码,任何人都能解码。哈希才是真正的单向变换。

对比总览

类型 密钥数量 速度 安全性基础 典型用途
对称加密 1(共享密钥) 非常快 密钥保密强度 大量数据传输,如 HTTP 内容
非对称加密 2(公钥 + 私钥) 慢(百倍级) 数学难题(大数分解/椭圆曲线离散对数) 密钥交换、数字签名、证书
哈希算法 无密钥(或需密钥做HMAC) 快 抗碰撞、单向性 完整性校验、指纹、消息认证、数字签名

你瞧瞧这个表,是不是一目了然?对称加密用来干活,非对称加密用来传钥匙,哈希用来防篡改。三者配合,才构成了 HTTPS 的信任链。

密码学三类算法关系图 密码学三类算法 · 在HTTPS中的角色 对称加密 AES / SM4 加密实际数据 非对称加密 RSA / ECC / DH 交换密钥、签名 哈希算法 SHA-256 / SM3 完整性、指纹 握手阶段:非对称加密交换对称密钥,哈希做证书认证,对称加密传输数据 三者缺一不可,共同保障 HTTPS 安全 速度:快 密钥:共享 速度:慢 密钥:公/私 速度:快 密钥:无

做水印嵌入时,我们经常会用到这些算法的组合:比如用哈希生成水印指纹、用对称加密加密水印内容、用非对称加密来传递对称密钥。后面的章节你会看到具体的实现方式。

对了,有个细节我想提醒你:“数字签名”并不是一个独立的算法,它本质上是“哈希 + 非对称加密”的合体。你先对消息算一个哈希,然后用私钥加密这个哈希,接收方用公钥解密出哈希,再比对原文的哈希是否一致。这个过程保证了消息的来源和完整性。

💡 一个小技巧
手算一次 RSA 签名流程,能帮你彻底理解非对称和哈希的关系。我在教新人的时候都会让他们用 OpenSSL 做一次:
echo "hello" | openssl dgst -sha256 -sign private.pem | openssl base64
然后试试用公钥验签,你会发现原理其实很简单。

把这些基础啃透了,你再去看 HTTPS 握手的各种细节,就不会觉得眼花缭乱了。