网络安全基础:加密算法、数字签名、证书认证

说实话,很多做网络编程的朋友,一听到「加密」「证书」这几个词就头大。我当年也一样。

记得我第一次写一个需要 HTTPS 通信的客户端,被 SSL 握手流程搞得晕头转向。后来踩了几个坑,才慢慢理清楚。今天咱们就把这块硬骨头啃下来。

一、加密算法:你的数据是怎么藏起来的?

加密算法分两大类:对称加密和非对称加密。说白了,一个用同一把钥匙开锁,一个用两把不同的钥匙。

1. 对称加密

加密和解密用同一个密钥。速度快,适合大量数据。常见的算法有 AES、DES、3DES。

我在项目中用过 AES-256,加密一个 1MB 的文件,毫秒级搞定。但有个致命问题——密钥怎么安全地传给对方?

核心要点:对称加密的密钥分发是最大的安全短板。

2. 非对称加密

用一对密钥:公钥加密,私钥解密。公钥随便发,私钥自己藏好。

常见的算法有 RSA、ECC。RSA 我用的最多,2048 位密钥基本够用。

我的经验:非对称加密速度慢,别用它加密大文件。一般用它加密对称密钥,再用对称密钥加密数据。这叫「混合加密」。

二、数字签名:怎么证明这数据是你发的?

你想想看,你收到一份文件,怎么确定是张三发的,而不是李四伪造的?

数字签名就是干这个的。流程是这样的:

  1. 发送方用哈希算法(比如 SHA-256)对数据生成摘要
  2. 用私钥对摘要加密,得到数字签名
  3. 把数据和签名一起发出去
  4. 接收方用公钥解密签名,得到摘要
  5. 再对数据做同样的哈希,对比两个摘要

如果一致,说明数据没被篡改,而且确实是私钥持有者发的。

我曾经踩过的坑:有一次我忘了对签名做 Base64 编码,直接发了二进制数据,结果对方解析乱码。嗯,这里要注意,签名通常是二进制,传输前要编码成可打印字符。

三、证书认证:你凭什么相信这把公钥?

公钥是公开的,但你怎么确定这把公钥真的是对方的?万一中间人给你一把假公钥呢?

证书就是解决这个问题的。证书由权威机构(CA)签发,里面包含了:

  • 持有者的身份信息(域名、组织名等)
  • 持有者的公钥
  • CA 的数字签名
  • 有效期、序列号等

你拿到证书后,用 CA 的公钥验证签名。如果验证通过,就说明证书里的公钥是可信的。

四、知识体系结构图

下面这张图,把加密、签名、证书的关系理清楚了:

网络安全基础:加密·签名·证书 对称加密 AES / DES / 3DES 同一密钥加密解密 速度快,密钥分发难 → 用于加密数据内容 非对称加密 RSA / ECC 公钥加密,私钥解密 速度慢,密钥安全 → 用于加密对称密钥 数字签名 私钥签名,公钥验签 防篡改 + 防抵赖 哈希 + 非对称加密 → 用于验证身份 证书认证(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 网站时,浏览器会做证书链验证。流程是这样的:

  1. 服务器发来它的证书(叶子证书)
  2. 浏览器用 CA 的公钥验证叶子证书的签名
  3. 如果叶子证书的签发者不是根 CA,就继续往上查
  4. 直到找到浏览器内置信任的根证书
  5. 全部验证通过,建立安全连接

说白了,这就是一个「信任链」。你信任根 CA,根 CA 信任中间 CA,中间 CA 信任网站。一环扣一环。

我曾经踩过的坑:有一次我部署了一个中间证书缺失的服务器,结果 Android 客户端连不上,但 PC 浏览器能连。因为 PC 浏览器缓存了中间证书,而 Android 没有。从那以后,我每次部署都会检查证书链是否完整。

七、总结一下

加密算法、数字签名、证书认证,这三者构成了现代网络安全的基础。我个人的理解是:

  • 加密算法:解决数据保密问题
  • 数字签名:解决身份验证和数据完整性
  • 证书认证:解决公钥信任问题

三者缺一不可。你想想看,如果没有证书认证,你连对方的公钥都不敢信,那加密和签名就全白搭了。

好了,这一章的内容就到这里。代码和命令我都贴出来了,建议你亲手跑一遍。只有自己生成过证书、签过名,才能真正理解这些概念。

公众号:蓝海资料掘金营,微信 deep3321