3. 密码学基础:对称加密与非对称加密归纳总结

3.1 为什么审计日志需要加密?

审计日志里存的是什么东西?说白了,就是谁在什么时间、从哪台机器、执行了什么操作、操作了哪些敏感数据。这种日志一旦被篡改或泄漏,整个审计链条就断了。我参与过一家金融公司的合规项目,他们的日志明文存储在共享文件服务器上,结果运维人员自己就能偷偷改掉操作记录——嗯,那项目后来直接废了。

加密的核心目的就两个:保证机密性(别人看不懂),以及保证完整性(别人改不了)。对称加密和非对称加密,正是实现这两个目标的两把钥匙。

3.2 对称加密:一把钥匙开一把锁

对称加密很简单:加密和解密用同一个密钥。就像你家大门,进出门都用同一把钥匙。常见的算法有 AES、DES、3DES、SM4(国密)。

3.2.1 我常用的对称加密算法对比

算法密钥长度分组大小安全性典型场景
AES-256256 bit128 bit极高,当前推荐日志文件加密、磁盘加密
AES-128128 bit128 bit高,性能更好网络传输加密(TLS)
SM4128 bit128 bit国密标准,等效AES-128国内合规场景
DES56 bit64 bit已不安全,别用历史遗留系统
我的习惯: 新项目一律用 AES-256-GCM。GCM 模式自带身份认证(AEAD),加密的同时还能校验数据是否被篡改,省去单独算 HMAC 的麻烦。

3.2.2 对称加密的痛点

你想想看,密钥怎么安全地传给对方?如果通过互联网直接发送密钥,那跟没加密有什么区别?这叫「密钥分发问题」。我在一个分布式审计系统中踩过这个坑——日志采集端和存储端各自有一份配置文件硬编码了同一个对称密钥,结果运维人员误把配置文件上传到公共代码仓库……嗯,后面的事情我不说你也知道。

曾经踩过的坑: 千万不要用 ECB 模式!它会把相同明文块加密成相同密文块,攻击者一看就能猜出数据的模式。审计日志里有很多重复的操作类型(比如「登录成功」),用 ECB 加密就等于没加密。

3.3 非对称加密:一对钥匙,各司其职

非对称加密解决了密钥分发问题。它有一个公钥(公开的)和一个私钥(自己藏好的)。公钥加密的数据只能用私钥解密;反过来,私钥签名可以用公钥验证。常见算法有 RSA、ECC(椭圆曲线,比如 ECDSA、Ed25519)、SM2(国密)。

3.3.1 典型用法:混合加密

实际项目中,日志加密很少直接用非对称加密全量数据——效率太低了。我做过的审计系统是这样干的:

  1. 客户端生成一个临时的对称密钥(比如 AES-256 密钥)。
  2. 用对称密钥加密日志内容。
  3. 再用服务器的公钥加密这个对称密钥。
  4. 把加密后的日志和加密后的对称密钥一起发给服务器。
  5. 服务器用私钥解密出对称密钥,再用它解密日志。

这就是「混合加密」。你想想看,对称加密快,非对称加密安全,结合起来刚刚好。

3.3.2 非对称算法选型表

算法密钥长度安全等级性能推荐场景
RSA-20482048 bit高慢(签名/验签)遗留系统、PKI 证书
RSA-40964096 bit极高更慢极高安全要求
ECC (P-256)256 bit等效 RSA-3072快现代系统优先选
Ed25519256 bit极高非常快数字签名(审计日志签名)
SM2256 bit等效 ECC快国密合规
我个人偏好: 新审计系统用 Ed25519 做日志签名,用 X25519 做密钥交换。代码简洁,性能极好,而且不容易出侧信道漏洞。

3.4 两者对比——一张图讲清楚

下面这张图把对称加密和非对称加密的核心区别画出来了。看懂这张图,本章就过了大半。

对称加密 vs 非对称加密 对称加密 同一把密钥 K 加密 → 解密 明文 M 密钥 K 密文 C 加密 密钥相同,速度快 问题:怎么安全传递密钥? 非对称加密 一对密钥:公钥 PK + 私钥 SK 明文 M 公钥 PK 密文 C 私钥 SK 加密 解密 公钥公开,私钥保密 不需要预先共享密钥 如何选择? 大数据量加密 → 对称加密(AES-256-GCM) 密钥分发 / 数字签名 → 非对称加密(Ed25519) 两者结合 → 混合加密(实战标准)

3.5 如何保护审计日志里的密钥?

密钥存储不当,上面所有加密都白费。我见过有人把对称密钥写死在代码里,然后代码上传到 GitHub……嗯,那是一次很好的教学案例。

  • 对称密钥: 使用硬件安全模块(HSM)或密钥管理服务(如 AWS KMS、Azure Key Vault)。如果预算有限,至少用加密文件系统存储密钥,且限制文件权限为 600。
  • 非对称私钥: 必须加密存储,设置密码保护。生产环境最好放在 HSM 或安全飞地(SGX/SEV)中。
  • 轮换策略: 每 90 天强制轮换一次密钥。旧的加密密钥可以保留用于解密历史数据,但不能继续用于加密新数据。
曾经踩过的坑: 日志采集端和存储端的时间戳不同步,导致密钥轮换后,旧密钥提前被清除,积压日志无法解密。我后来给每个日志片段都加了密钥版本号,服务器根据版本号选择对应的解密密钥。

3.6 在审计日志巡检中的实际应用

我们这门课讲的是盲索引与可搜索加密,但底层离不开这两个基础加密方法。举个例子:

  1. 巡检程序需要读取加密的审计日志。如果用对称加密,巡检端和存储端必须共享对称密钥——这就回到了密钥分发难题。
  2. 如果用非对称加密,巡检端用公钥加密查询条件,服务端用私钥解密后搜索——但服务器能看到明文查询条件,对某些场景不适用(比如医生查患者数据,服务器不能知道查的是谁)。
  3. 于是有了可搜索加密(SE):用对称加密先加密日志,再用特殊的陷门(trapdoor)在不泄露明文的前提下搜索。具体实现会用到伪随机函数和双线性对,那就是后面章节的事了。
我的建议: 做审计日志系统时,先搭好对称加密池(AES-256-GCM),再用非对称加密解决密钥分发(X25519 ECDH)。可搜索加密是在这之上的高级功能,别一上来就想做 SE,先把基础加密姿势搞对。