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 位位数越高越安全,但加解密越慢
公钥指数 e65537 (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 加密与签名的真正用法

很多人混淆「加密」和「签名」的方向。我画个图理清:

非对称加密与签名流程 非对称加密 & 数字签名流程 发送者(Alice) 用 Bob 的公钥加密 密文传输 Bob 用私钥解密 (公钥加密 → 私钥解密) 签名者(Alice) 用 Alice 的私钥签名 消息+签名 任何人用 Alice 的公钥验签 (私钥签名 → 公钥验签) 加密保证机密性,签名保证完整性和身份认证。两者密钥使用方向正好相反。

3.5 在DSPM密钥边界中的实践

回到我们的主题——密文检索密钥边界。非对称密钥在边界监控里主要做两件事:

  1. 加密对称密钥:文档加密用的是AES对称密钥,这个密钥用RSA或ECC公钥加密后存储,只有拥有私钥的授权节点才能解开。
  2. 签名检索令牌:每次检索请求携带数字签名,边界网关验签通过后才放行。这样能防止重放攻击和伪造请求。

我的建议:

  • 密钥对必须在安全环境中生成(HSM或软HSM),避免私钥明文落盘
  • 公钥可以分发到边界节点,但私钥必须隔离存储,且定期轮换
  • ECC 推荐使用 P-256 或 X25519,兼容性和性能最佳
  • RSA 推荐 4096 位,虽然慢一点,但合规审计更容易通过

我曾经踩过的坑:有一次部署边界节点,私钥文件权限设成了 644,结果被旁路进程读取。后来我强制所有私钥文件权限设为 400,启动时校验 umask。别轻视文件权限,很多数据泄漏都是从小配置开始的。

3.6 密钥对生成实操对比

给你一张表,方便选型时参考:

算法密钥长度(bit)安全强度签名速度加密速度兼容性
RSA2048112 位慢慢极广
RSA4096128 位更慢更慢广泛
ECC P-256256128 位快快很广(TLS等)
ECC X25519256128 位非常快非常快较广(现代协议)
SM2256128 位快快国密场景

小技巧:如果边界节点算力有限(比如物联网网关),优先选 X25519 做密钥交换,用 Ed25519 做签名。这对组合在嵌入式平台上性能表现很好。

好了,这一章先到这。记住公钥加密私钥解密,私钥签名公钥验签,方向别搞反就行。下一块我们聊聊密钥的生命周期管理,那是另一个大坑。