密码学与 PKI
哈希、加盐、证书、TLS、Kerberos。
加密与 TLS:从哈希到证书链
这一课你将能做到
- 区分对称加密、非对称加密、哈希的适用场景,说清楚口令为什么要用 BCrypt
- 用 openssl 生成密钥与证书、验证一条真实站点的证书链
- 给 Spring Boot 配上 HTTPS,并按检查项评估自己平台的 TLS 配置
为什么要学
TLS 是现代互联网的信任基石,但你每天配的 server.ssl.* 背后发生了什么?面试里「HTTPS 为什么安全」几乎必问;实战里证书链配错、密码套件太弱、口令存明文,都是高频事故。不懂加密,你看不出 JWT 弱密钥的危害,也看不出为什么 MD5 存密码等于裸奔。
人话:哈希是「榨汁机」(不可还原),对称加密是「保险箱+同一把钥匙」,非对称加密是「信箱」(公开地址投递、私钥才能取)。
先建立图像
TLS 握手中的角色分工:
客户端 服务器
│ ── ClientHello(支持的套件+随机数) ──▶│
│◀─ ServerHello + 证书链 ─────────────│ ①证书链验证:根CA→中间CA→站点证书
│ ◀─ 用证书里的公钥协商会话密钥 ────────│ ②非对称加密只用于握手
│ ════ 之后全部用会话密钥对称加密 ═════▶│ ③业务数据走对称加密(快)
三类工具各司其职:
| 工具 | 可逆? | 用途 | 例子 |
|---|---|---|---|
| 哈希(SHA-256) | 不可逆 | 完整性校验、口令存储 | 文件校验、BCrypt 存密码 |
| 对称(AES) | 可逆,同钥 | 大量数据加密 | TLS 会话数据、磁盘加密 |
| 非对称(RSA/Ed25519) | 可逆,公私钥对 | 密钥交换、签名 | TLS 握手、JWT 签名 |
跟着做
步骤 1:生成密钥对与自签证书
# 生成 EC 私钥 + 自签证书(有效期 365 天,仅测试用)
openssl ecparam -genkey -name prime256v1 -out server.key
openssl req -new -x509 -key server.key -out server.crt \
-days 365 -subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
步骤 2:本地验证证书在服务端可用
# 用 openssl 起一个 TLS 服务(自建环境演示)
openssl s_server -port 8443 -key server.key -cert server.crt -www &
# 客户端连接(-CAfile 指向自签证书,自签链需要手动信任)
openssl s_client -connect localhost:8443 -CAfile server.crt
# 观察输出:Verify return code: 0 (ok)
步骤 3:验证真实站点证书链
openssl s_client -connect httpbin.org:443 -showcerts
# 看 Certificate chain 段:0 站点证书 → 1 中间CA → (根CA预置在系统)
# Verify return code: 0 (ok) 表示链完整可信
# 不加 -CAfile 的自签站点会报 self signed certificate
步骤 4:检查 TLS 配置强弱
# 安装 testssl.sh 检查自建靶机的 TLS
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
./testssl.sh/testssl.sh https://localhost
# 关注:协议版本(TLS1.0/1.1 应禁用)、弱套件、证书链完整性