3. 非对称加密基础:RSA、ECC、密钥对生成,加密与签名应用
聊到密钥边界监控,绕不开非对称加密。说白了,它就是密码学里「一个公开,一个私藏」的那套玩法。我早期做数据安全产品时,发现很多团队成员把RSA和ECC混为一谈,结果密钥长度选不对,性能问题直接捅到线上。所以这一章,我们扎实过一遍。
3.1 核心思想:公钥与私钥
非对称加密有两个钥匙:公钥公开分发,私钥自己保管。公钥加密的数据只能用私钥解密,反过来私钥签名可以用公钥验证。你想想看,这不就是天然的身份验证和保密通信机制吗?
关键区别(对称 vs 非对称)
- 对称加密:一把钥匙开锁,加密解密用同一个密钥
- 非对称加密:两把钥匙,公钥加密、私钥解密,或私钥签名、公钥验签
- 性能:非对称慢2-3个数量级,所以实际场景常用混合加密(非对称传对称密钥)
3.2 RSA:最经典的非对称算法
RSA基于大整数因子分解难题。我当年第一次在项目中实现RSA时,还在纠结1024位够不够用。现在明确告诉你:1024位已不安全,生产环境至少2048位,推荐4096位。
3.2.1 密钥对生成(RSA)
生成过程不复杂,但有几个坑。我用伪代码写一下核心逻辑:
1. 随机选两个大素数 p, q(长度相近)
2. 计算 n = p × q(n 的位数就是密钥长度)
3. 计算 φ(n) = (p-1) × (q-1)
4. 选一个公钥指数 e,常用 65537(性能好且安全)
5. 计算私钥 d ≡ e⁻¹ mod φ(n)
6. 公钥:(n, e);私钥:(n, d)
嗯,这里要注意:p和q必须随机生成,且不能太接近。我曾经见过一个库用固定种子生成p和q,结果两个质数差值很小,攻击者用费马分解法秒破。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 密钥长度 | 2048 / 4096 位 | 位数越高越安全,但加解密越慢 |
| 公钥指数 e | 65537 (0x10001) | 支持快速幂运算,且安全性好 |
| 私钥指数 d | 与 n 同量级 | 需安全存储,泄漏等于私钥暴露 |
避坑指南:我曾经在项目中遇到有人直接传 pem 字符串给加密函数,结果密钥格式不对导致崩溃。RSA 密钥建议用 PKCS#1 或 PKCS#8 标准格式存储,解析时校验长度和结构。
3.3 ECC:椭圆曲线密码学
ECC 用更短的密钥达到同等安全强度。举个例子:RSA 2048 位的安全级别,ECC 只需要 256 位。为什么会这样?因为 ECC 基于椭圆曲线离散对数难题,破解难度比大整数分解高得多。
我个人习惯在 DSPM 场景中优先选 ECC,尤其密钥存储量大的情况。密钥短,传输快,占用内存小。
3.3.1 常用曲线
- secp256k1:比特币用的曲线,兼容性好,但部分硬件不支持
- P-256 (secp256r1):NIST 标准,浏览器和 TLS 普遍支持
- Curve25519 (X25519):现代曲线,速度快,安全性高,推荐用于密钥交换
- SM2:国密标准曲线,国内合规场景必用
提示:如果你做跨国产品但涉及国内数据,建议同时支持 P-256 和 SM2,按地区切换。不过 SM2 的密钥格式与标准 ECC 不同,注意使用国密 SDK。
3.4 加密与签名的真正用法
很多人混淆「加密」和「签名」的方向。我画个图理清:
3.5 在DSPM密钥边界中的实践
回到我们的主题——密文检索密钥边界。非对称密钥在边界监控里主要做两件事:
- 加密对称密钥:文档加密用的是AES对称密钥,这个密钥用RSA或ECC公钥加密后存储,只有拥有私钥的授权节点才能解开。
- 签名检索令牌:每次检索请求携带数字签名,边界网关验签通过后才放行。这样能防止重放攻击和伪造请求。
我的建议:
- 密钥对必须在安全环境中生成(HSM或软HSM),避免私钥明文落盘
- 公钥可以分发到边界节点,但私钥必须隔离存储,且定期轮换
- ECC 推荐使用 P-256 或 X25519,兼容性和性能最佳
- RSA 推荐 4096 位,虽然慢一点,但合规审计更容易通过
我曾经踩过的坑:有一次部署边界节点,私钥文件权限设成了 644,结果被旁路进程读取。后来我强制所有私钥文件权限设为 400,启动时校验 umask。别轻视文件权限,很多数据泄漏都是从小配置开始的。
3.6 密钥对生成实操对比
给你一张表,方便选型时参考:
| 算法 | 密钥长度(bit) | 安全强度 | 签名速度 | 加密速度 | 兼容性 |
|---|---|---|---|---|---|
| RSA | 2048 | 112 位 | 慢 | 慢 | 极广 |
| RSA | 4096 | 128 位 | 更慢 | 更慢 | 广泛 |
| ECC P-256 | 256 | 128 位 | 快 | 快 | 很广(TLS等) |
| ECC X25519 | 256 | 128 位 | 非常快 | 非常快 | 较广(现代协议) |
| SM2 | 256 | 128 位 | 快 | 快 | 国密场景 |
小技巧:如果边界节点算力有限(比如物联网网关),优先选 X25519 做密钥交换,用 Ed25519 做签名。这对组合在嵌入式平台上性能表现很好。
好了,这一章先到这。记住公钥加密私钥解密,私钥签名公钥验签,方向别搞反就行。下一块我们聊聊密钥的生命周期管理,那是另一个大坑。