网络安全基础:加密算法、数字签名、证书认证
说实话,很多做网络编程的朋友,一听到「加密」「证书」这几个词就头大。我当年也一样。
记得我第一次写一个需要 HTTPS 通信的客户端,被 SSL 握手流程搞得晕头转向。后来踩了几个坑,才慢慢理清楚。今天咱们就把这块硬骨头啃下来。
一、加密算法:你的数据是怎么藏起来的?
加密算法分两大类:对称加密和非对称加密。说白了,一个用同一把钥匙开锁,一个用两把不同的钥匙。
1. 对称加密
加密和解密用同一个密钥。速度快,适合大量数据。常见的算法有 AES、DES、3DES。
我在项目中用过 AES-256,加密一个 1MB 的文件,毫秒级搞定。但有个致命问题——密钥怎么安全地传给对方?
核心要点:对称加密的密钥分发是最大的安全短板。
2. 非对称加密
用一对密钥:公钥加密,私钥解密。公钥随便发,私钥自己藏好。
常见的算法有 RSA、ECC。RSA 我用的最多,2048 位密钥基本够用。
我的经验:非对称加密速度慢,别用它加密大文件。一般用它加密对称密钥,再用对称密钥加密数据。这叫「混合加密」。
二、数字签名:怎么证明这数据是你发的?
你想想看,你收到一份文件,怎么确定是张三发的,而不是李四伪造的?
数字签名就是干这个的。流程是这样的:
- 发送方用哈希算法(比如 SHA-256)对数据生成摘要
- 用私钥对摘要加密,得到数字签名
- 把数据和签名一起发出去
- 接收方用公钥解密签名,得到摘要
- 再对数据做同样的哈希,对比两个摘要
如果一致,说明数据没被篡改,而且确实是私钥持有者发的。
我曾经踩过的坑:有一次我忘了对签名做 Base64 编码,直接发了二进制数据,结果对方解析乱码。嗯,这里要注意,签名通常是二进制,传输前要编码成可打印字符。
三、证书认证:你凭什么相信这把公钥?
公钥是公开的,但你怎么确定这把公钥真的是对方的?万一中间人给你一把假公钥呢?
证书就是解决这个问题的。证书由权威机构(CA)签发,里面包含了:
- 持有者的身份信息(域名、组织名等)
- 持有者的公钥
- CA 的数字签名
- 有效期、序列号等
你拿到证书后,用 CA 的公钥验证签名。如果验证通过,就说明证书里的公钥是可信的。
四、知识体系结构图
下面这张图,把加密、签名、证书的关系理清楚了:
五、实战:用 OpenSSL 生成自签名证书
我自己做测试时,经常用自签名证书。下面是一套完整的命令:
# 1. 生成私钥(RSA 2048位)
openssl genrsa -out server.key 2048
# 2. 生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
# 3. 自签名证书(有效期365天)
openssl x509 -req -days 365 -in server.csr \
-signkey server.key -out server.crt
# 4. 查看证书内容
openssl x509 -in server.crt -text -noout
避坑指南:我曾经在生产环境忘了设置 -days 参数,结果证书默认只有30天有效期。30天后服务全挂了。嗯,生产环境建议用 3650 天(10年),或者用自动续签工具。
六、证书链验证是怎么回事?
你浏览器访问 HTTPS 网站时,浏览器会做证书链验证。流程是这样的:
- 服务器发来它的证书(叶子证书)
- 浏览器用 CA 的公钥验证叶子证书的签名
- 如果叶子证书的签发者不是根 CA,就继续往上查
- 直到找到浏览器内置信任的根证书
- 全部验证通过,建立安全连接
说白了,这就是一个「信任链」。你信任根 CA,根 CA 信任中间 CA,中间 CA 信任网站。一环扣一环。
我曾经踩过的坑:有一次我部署了一个中间证书缺失的服务器,结果 Android 客户端连不上,但 PC 浏览器能连。因为 PC 浏览器缓存了中间证书,而 Android 没有。从那以后,我每次部署都会检查证书链是否完整。
七、总结一下
加密算法、数字签名、证书认证,这三者构成了现代网络安全的基础。我个人的理解是:
- 加密算法:解决数据保密问题
- 数字签名:解决身份验证和数据完整性
- 证书认证:解决公钥信任问题
三者缺一不可。你想想看,如果没有证书认证,你连对方的公钥都不敢信,那加密和签名就全白搭了。
好了,这一章的内容就到这里。代码和命令我都贴出来了,建议你亲手跑一遍。只有自己生成过证书、签过名,才能真正理解这些概念。