加密基础理论
大家好,我是这节课的主讲。咱们先聊聊最基础的东西——加密到底在干嘛?
很多人一听到加密就觉得是数学,是算法,是密码。但说白了,加密就是「让不该看的人看不懂」。你想想看,我们在网络上发消息、转账、登录,数据就像明信片一样在路上跑,谁都能瞟一眼。加密就是给明信片套个信封,再上把锁。
我做架构设计这么多年,遇到过不少团队把加密当「功能特性」来加,结果性能崩了、密钥丢了、证书过期了……嗯,这些坑我后面会一个个掰开了讲。这一章先把地基打牢:对称加密、非对称加密、哈希函数、数字签名、证书。它们是加密世界的五块砖。
加密架构概述
先问一个问题:一套完整的加密架构长什么样?
我个人习惯把它分成三层:
- 算法层:具体的加密算法、哈希算法、签名算法。这是砖块。
- 协议层:怎么用这些算法协商密钥、交换证书、加密通信。比如TLS、IPSec。这是图纸。
- 应用层:最终的产品或服务怎么调用这些协议和算法。比如HTTPS、VPN、数字版权。这是房子。
很多人只盯着算法层,觉得用AES-256就安全了。我在项目中遇到过这种情况——算法没问题,但密钥写死在代码里,一上生产就被反编译。所以架构思维比单个算法重要得多。
核心目标:机密性(别人看不懂)、完整性(别人改不了)、可用性(需要时能用)、不可否认性(做过的事赖不掉)。
对称加密与非对称加密
这是加密的两大流派。先看对称加密。
对称加密:加密和解密用同一把钥匙。最常见的算法是AES(高级加密标准)。速度快,适合加密大量数据。但问题来了——这把钥匙怎么安全地给到对方?
非对称加密:一把公钥,一把私钥。公钥公开,私钥自己藏好。你用我的公钥加密,只有我的私钥能解开。算法有RSA和ECC(椭圆曲线)。速度慢得多,但解决了密钥分发难题。
实际场景里怎么用?我举个例子:你要给一个文件加密传输。直接拿RSA加密文件?文件一大,RSA慢得你怀疑人生。所以通常是:先用对称加密(AES)随机生成一把会话密钥加密文件,再用非对称加密(RSA)把会话密钥加密传过去。这叫「混合加密」。HTTPS底层就是这么干的。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个(共享密钥) | 2个(公钥+私钥) |
| 典型算法 | AES, DES, 3DES | RSA, ECC, DSA |
| 速度 | 快(硬件加速可达GB/s) | 慢(通常慢100~1000倍) |
| 密钥分发 | 困难(需要安全信道) | 容易(公钥可公开) |
| 适用场景 | 大量数据加密 | 小数据加密、签名、密钥交换 |
我的建议:不要试图用RSA加密超过几百字节的数据,性能扛不住。用RSA加密AES密钥,再用AES加密正文,这是标准做法。
哈希函数
哈希不是加密。它把任意长度的输入变成固定长度的「指纹」。而且不可逆——你不能从指纹倒推出原文。
常见用途:
- 校验文件完整性(下载后比对哈希值)
- 存储密码(存哈希值,不存明文)
- 数字签名的基础(先对消息哈希,再对哈希签名)
主流算法是SHA-256(安全哈希算法256位)。MD5和SHA-1已经不被推荐了。我曾经在早期项目里偷懒用MD5,结果上线后服务被彩虹表扫得稀里哗啦。还好只是内部工具,不然就完了……嗯,从那以后我只用SHA-256以上。
哈希有一个重要特性:抗碰撞性。两个不同的输入产生相同的哈希,叫碰撞。优秀的哈希算法碰撞概率极低。
避坑指南:存储密码别只用哈希。加盐(salt)是必须的,否则彩虹表一跑一个准。我曾经见过一个系统连盐都不加,被拖库后明文直接暴露。
数字签名
数字签名解决两个问题:**谁发的**(身份认证)和 **发的内容有没有被改**(完整性)。
流程很简单:
- 发送方对消息做哈希,得到摘要。
- 用发送方的私钥对摘要加密,这就是签名。
- 接收方用发送方的公钥解密签名,得到原摘要。
- 接收方再对消息做哈希,对比两个摘要。一致则签名有效。
你看,这里用了哈希缩短消息长度,又用了非对称加密保证「只有私钥拥有者才能签名」。但注意:公钥怎么确保是发送方本人的?这就需要证书了。
我顺手给个OpenSSL命令例子,平时做实验常用:
# 生成私钥
openssl genrsa -out private.pem 2048
# 提取公钥
openssl rsa -in private.pem -pubout -out public.pem
# 对文件签名
openssl dgst -sha256 -sign private.pem -out sign.txt file.txt
# 验签
openssl dgst -sha256 -verify public.pem -signature sign.txt file.txt
证书基础
证书就是公钥的「身份证」。它是一个数据结构,包含:
- 主体(谁持有这个公钥)
- 颁发者(谁签发的证书)
- 公钥本身
- 有效期、序列号、签名算法等
最重要的是一句话:证书由颁发者(CA)用它的私钥签名。你验证证书时,需要先信任CA的公钥。这构成信任链。根CA自签名,中间CA由根CA签发,终端证书由中间CA签发。
我在帮客户做内部PKI时,发现他们直接把根证书放在每台服务器上,私钥居然没加密。我说这个根证书私钥暴露,整个信任体系就完了。所以证书生命周期管理——生成、分发、轮换、吊销,每一步都不能马虎。
关键理解:证书的本质是「公钥+CA签名」。浏览器验证HTTPS证书,就是沿着证书链直到根证书,检查签名是否有效。如果链断了或者根证书不受信任,就会报安全警告。
最后,我把这五块的关系画成一张图,帮你理清脉络。
好,加密基础理论的核心框架就是这样。我们后面会在这个基础上一步步搭建高可用架构。记住一句话:安全不是一条龙服务,而是每一层都加固。只要有一块短板,整个体系就废了。