常用加密算法选择:AES、RSA 与 SM4

做列级加密,选哪个算法?

这个问题我几乎在每个项目启动会上都会被问到。说实话,没有银弹。每个算法都有自己的脾气,选错了,要么性能扛不住,要么安全水位不够。今天咱们就把 AES、RSA 和 SM4 这三张牌摊开聊,看看各自强在哪、弱在哪,以及什么场景该翻哪一张。

对称加密:AES 与 SM4

先讲对称加密。说白了,加解密用的是同一把钥匙。这把钥匙得自己保管好,谁拿到谁就能开锁。实用中,列级加密十有八九都落在这类算法上。

AES

AES 是目前全球用得最广的对称加密标准。我记得 2016 年给一个金融核心系统做改造时,全量字段加密就用的 AES-256,跑了一周压力测试,吞吐只掉了 7%。说实话,这个表现相当惊艳。

AES 三大模式

  • ECB:不推荐。同样的明文会产生同样的密文,流量分析一眼就能看出规律。
  • CBC:常用,但没法并行加解密,对大量列级操作吞吐有限制。
  • GCM:我最常用的模式。自带认证,能防篡改,还能并行,适合数据库列级场景。

AES 的优势很明显:硬件加速普遍(大部分 CPU 都有 AES-NI 指令集),生态成熟,不管你是 Java、Python 还是 Go,库都稳定。缺陷是密钥分发你得自己管。

我个人建议:新项目直接用 AES-256-GCM。性能和安全之间平衡得最好。密钥长度就别用 128 了,多出来那点速度不值得在安全上让步。

SM4

SM4 是国家密码管理局发布的对称加密标准。如果你做等保三级或以上项目,或者客户是政务、公安、医疗系统,通常会指名要求用 SM4。坦白讲,我最早接触 SM4 时也有抵触,总觉得它生态不够成熟。但在一个政务云项目跑了一年之后,我发现 SM4 在 Java 和 C 上的性能其实很接近 AES,尤其做了国密改造后,银行核心系统对它的接受度非常高。

注意:SM4 需要额外的国密算法证书和 SDK。我曾经碰过一个项目,因为采购流程没走完,SDK 拖了两个月才下来。如果你的上架时间很紧,一定要先确认好依赖包的可用性。

非对称加密:RSA

RSA 是非对称加密的代表。公钥加密、私钥解密,反过来也能做。跟对称加密最大的不同是,你不用担心密钥在传输中被偷——公钥随便分,私钥自己藏好就行。但代价是慢。非常慢。

几年前我做过一个需求,需要把用户的身份证号在入库前加密。起初同事直接 RSA-2048 一上了之,结果数据库写入延迟飙到 30 毫秒,接口直接就超时了。后来改成交换密钥阶段用 RSA,列级加密主体换回 AES,才把时延压回 2 毫秒以内。这个案例让我记住了:RSA 不适合大批量数据加密,它最适合做密钥交换和数字签名。

如何在列级加密中选

直接给结论——这张表是我根据实战经验整理的选型参考:

对比维度 AES-256-GCM RSA-2048 SM4
加密类型 对称 非对称 对称
密钥长度 256 位 2048 位 128 位
加密速度 极快 慢 快
硬件支持 AES-NI 加速 多数 CPU 支持 需国密芯片或 SSD
安全性 极高 高 满足国密标准
列级加密场景 主力选手 仅用于密钥交换 国密合规场景
常见应用 列数据加密、日志加密 密钥分发、数字签名 政务、银行内部系统

你想想看,实际落地时逻辑其实很简单:

  1. 如果你没有国产化合规要求——直接上 AES-256-GCM,稳定、高效、生态好;
  2. 如果你有等保或国密要求——必须用 SM4,别想着拿 AES 糊弄,过不了测评的;
  3. 如果你需要安全分发密钥——在主密钥协商阶段用 RSA,拿到 AES 密钥后再切回对称加密。

核心结论:列级加密的主体数据用对称加密。非对称加密只做钥匙交换。国密场景选 SM4,其他场景选 AES-256-GCM。不要犹豫,不要混用。

说实话,我见过最头疼的不是算法选型本身,而是后期密钥管理和审计。选好了算法,下节课咱们就该聊怎么管住这把钥匙了。

列级加密算法选择流程 列级加密需求 有国密合规要求? 使用 SM4 使用 AES-256-GCM 密钥交换阶段嵌套 RSA 合规场景 通用场景