1. 密码学基础回顾:对称加密与非对称加密的核心区别,哈希函数的作用,数字签名与证书体系
各位好,我是老周。今天咱们开始第一课。
说实话,密码学这东西,很多人一听就头大。觉得全是数学公式、抽象概念。但我做了十几年安全架构,我的体会是——你不需要成为数学家,但必须理解这几块基石是怎么咬合的。
咱们先搭个框架,把对称加密、非对称加密、哈希、签名、证书这五样东西的关系理清楚。后面讲性能调优时,你才知道该在哪个环节下刀。
核心观点:密码学的本质不是「加密」,而是「在不可信信道上建立可信通信」。对称加密解决速度,非对称加密解决密钥分发,哈希解决完整性,签名解决身份,证书解决信任链。
1.1 对称加密:快,但密钥怎么给?
对称加密,说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。
我最早接触这玩意儿是在做嵌入式设备时。设备之间要传配置数据,用 AES-128 加密,速度飞快。但问题来了——密钥怎么安全地发给对方?
| 算法 | 密钥长度 | 速度 | 典型场景 |
|---|---|---|---|
| AES | 128 / 192 / 256 bit | 极快(硬件加速) | 文件加密、VPN、磁盘加密 |
| ChaCha20 | 256 bit | 快(无硬件加速时优于 AES) | 移动端、IoT 设备 |
| SM4 | 128 bit | 快 | 国密标准,国内商用 |
| 3DES | 168 bit | 慢(已淘汰) | 遗留系统兼容 |
我的经验:性能敏感场景优先选 AES-128-GCM。GCM 模式自带认证,省掉额外算 HMAC 的开销。我曾经帮一个视频流平台做优化,从 AES-256-CBC 切到 AES-128-GCM,吞吐量提升了 40%,而且安全性没降。
对称加密的致命伤是什么?密钥分发。你想想看,如果两个人相隔千里,怎么安全地共享同一个密钥?靠电话念?靠快递寄U盘?都不靠谱。这就引出了非对称加密。
1.2 非对称加密:慢,但解决了密钥分发
非对称加密,公钥加密,私钥解密。公钥随便发,私钥自己藏好。
我记得第一次在项目中用 RSA 做密钥交换时,被性能吓了一跳。2048 位的 RSA,一次私钥操作要好几毫秒。相比之下,AES 加密 1MB 数据也就几十微秒。差了上百倍。
| 算法 | 密钥长度 | 相对速度 | 安全性 |
|---|---|---|---|
| RSA | 2048 / 4096 bit | 慢 | 基于大整数分解 |
| ECC (ECDH / ECDSA) | 256 / 384 bit | 快(同等安全强度下) | 基于椭圆曲线离散对数 |
| SM2 | 256 bit | 快 | 国密标准,基于 ECC |
| DSA | 2048 bit | 中等 | 仅用于签名,已边缘化 |
避坑指南:我曾经见过一个团队,用 RSA-4096 做每一次 API 请求的加密。结果服务器 CPU 直接飙到 100%。非对称加密只适合做握手和密钥交换,千万别拿它加密业务数据。
那实际中怎么用?混合加密。用非对称加密交换对称密钥,然后用对称加密加密实际数据。TLS 握手就是这么干的。
1.3 哈希函数:不是加密,是「指纹」
哈希函数,很多人误以为它是加密。其实不是。加密可逆,哈希不可逆。
哈希的作用就三个字:防篡改。你下载一个文件,网站给你一个 SHA-256 值。你算一下,对得上,说明文件没被改过。
哈希的核心特性:
- 单向性:从哈希值反推原文,理论上不可能
- 抗碰撞性:找不到两个不同输入有相同输出
- 定长输出:不管输入多大,输出固定长度(SHA-256 就是 256 bit)
- 雪崩效应:输入改一个 bit,输出完全变样
| 算法 | 输出长度 | 安全性状态 | 推荐场景 |
|---|---|---|---|
| SHA-256 | 256 bit | 安全 | 通用场景,TLS 1.3 |
| SHA-3 | 可变 | 安全 | 新系统,抗量子攻击潜力 |
| SM3 | 256 bit | 安全 | 国密标准 |
| MD5 / SHA-1 | 128 / 160 bit | 已破解 | 仅用于校验,不用于安全 |
我的习惯:存储密码时,不要只做一次哈希。一定要加盐(salt),而且用慢哈希算法,比如 bcrypt 或 Argon2。我曾经审计过一个系统,直接用 MD5 存密码,结果拖库后 5 分钟就破解了 80% 的密码。
1.4 数字签名:证明「是你签的」
数字签名,说白了就是用私钥给哈希值加密。
流程很简单:
- 发送方对消息做哈希,得到摘要
- 用私钥加密这个摘要,得到签名
- 接收方用公钥解密签名,得到摘要 A
- 接收方自己对消息做哈希,得到摘要 B
- 如果 A == B,说明消息没被改,且确实是私钥持有者签的
这里有个关键点:签名不是加密消息本身,而是加密消息的哈希。为什么?因为非对称加密太慢,哈希很短(比如 32 字节),加密它很快。
避坑指南:我曾经遇到一个项目,他们用 RSA 直接加密整个消息体来做「签名」。结果消息体 10KB,RSA 加密一次要几十毫秒,并发一高直接挂掉。正确的做法是先哈希,再签名。
1.5 证书体系:谁来证明公钥是真的?
好,现在问题来了。你拿到了对方的公钥,怎么确定这个公钥真的是对方的?
这就是证书体系(PKI)要解决的问题。
证书就是一个数字身份证,里面包含:
- 持有者的身份信息(域名、组织名等)
- 持有者的公钥
- 证书颁发机构(CA)的签名
- 有效期、序列号等元数据
信任链是这样的:
- 根 CA 自签名(信任的起点)
- 根 CA 签发中间 CA
- 中间 CA 签发终端证书
- 你的浏览器/操作系统内置了根 CA 证书
一句话总结:证书体系就是「你信任 CA,CA 担保这个公钥是张三的,所以你可以信任这个公钥」。没有证书体系,非对称加密就是空中楼阁。
| 证书类型 | 验证级别 | 典型用途 |
|---|---|---|
| DV(域名验证) | 低 | 个人网站、测试环境 |
| OV(组织验证) | 中 | 企业官网、API 服务 |
| EV(扩展验证) | 高 | 金融、政务等高安全场景 |
我的建议:内部系统可以用自签名证书,但一定要自己维护 CA 和证书吊销列表(CRL)。我见过一个公司,所有内部服务都用自签名证书,但证书过期了没人管,结果线上服务全部中断。嗯,那个周末我是在机房度过的。
小结
好了,这一章的内容就这些。咱们把五块基石都过了一遍:
- 对称加密:快,但密钥分发难
- 非对称加密:慢,但解决了密钥分发
- 哈希函数:不可逆,防篡改
- 数字签名:私钥签名,公钥验签,防抵赖
- 证书体系:CA 担保公钥的真实性