字段级加密SDK支持哪些加密算法?

说起字段级加密,很多朋友第一反应就是:“到底用哪种算法?”

这个问题其实挺关键的。选错了算法,要么性能扛不住,要么安全等级达不到监管要求。我今天就结合自己踩过的坑,把 SDK 支持的核心算法摊开来讲。

字段级加密SDK算法体系 加密算法 对称加密 非对称加密 哈希 + HMAC AES-256 SM4 RSA-2048 SM2 SHA-256 SM3 关键:对称加密保护字段数据内容,非对称加密保护密钥交换,哈希保证完整性 典型组合模式 • 手机号 / 身份证:AES-256-GCM 直接加密 • 密钥分发:RSA / SM2 加密对称密钥 • 防篡改:HMAC-SHA256 对密文做完整性校验

对称加密:主力选手

字段级加密用得最多的就是对称加密。为什么?因为它快啊。你想想,一个表里几千万条记录,每条都要加密,用非对称那性能根本扛不住。

SDK 主要支持两种对称算法:

算法 密钥长度 分组模式 典型场景
AES-256 256 位 GCM / CBC 姓名、手机号、地址
SM4 128 位 GCM / CBC 国密合规场景

我个人的习惯是:**优先选 AES-256-GCM**。为什么是 GCM 模式?因为它自带认证标签,加密的同时做了完整性校验,说白了就是防篡改。我在项目中遇到过同事用 CBC 模式,结果业务方改了密文长度没发现,解密出来的数据错乱,排查了很久才发现是 CBC 没有认证能力。

💡 小提示:如果客户有国密合规要求,直接切 SM4-GCM。SM4 的性能跟 AES 差不多,密钥协商用 SM2 配套就好。

非对称加密:解决密钥分发难题

字段级加密有个绕不开的问题:对称加密的密钥怎么安全地传递给接收方?

我的做法是用非对称加密来保护对称密钥。SDK 支持 RSA 和 SM2:

  • RSA-2048:国际通用,兼容性好。加密少量数据(比如 AES 密钥)的时候,性能可以接受。
  • SM2:国标椭圆曲线算法,密钥短但安全性高。比如同样是 256 位密钥强度,SM2 计算量比 RSA 小很多。

⚠️ 注意:千万别用 RSA 直接加密大字段!有一次我看到有人把整段 JSON 用 RSA 加密……解密花了十几秒不说,RSA 还有数据长度限制(2048 位密钥最多加密 245 字节)。

哈希与 HMAC:不能省的最后一道防线

哈希算法在字段级加密里不是主角,但少了它很容易出问题。

  • SHA-256:用于生成数据指纹,做数据去重判断。比如“手机号脱敏后是否重复”,我们只存哈希值,不存原文。
  • SM3:国密哈希,输出 256 位。合规场景替换 SHA-256。
  • HMAC-SHA256:带密钥的哈希。我强烈建议在密文字段上附加一个 HMAC 标签,这样即使密文被篡改,解密前就能检测出来,避免程序崩溃或数据污染。

⚠️ 避坑指南:我曾经在项目里没加 HMAC,结果第三方在传输过程中把密文截断了两位。解密直接报 Padding 异常,线上排查半天才发现是数据被截断了。从那以后我所有字段加密都强制配 HMAC。

如何选择算法?一张表说清楚

需求 推荐方案 理由
保护字段内容 AES-256-GCM 兼顾性能与安全
合规(等保/密评) SM4-GCM + SM2 国密全套
密钥安全传输 SM2 或 RSA-2048 只加密对称密钥
数据去重/完整性 SHA-256 / SM3 不可逆,不泄露原文

实际接入的注意事项

这里说几条实操经验:

  1. 密钥单独管理 – 对称密钥不要写在代码里,用 KMS 或密钥管理系统存。
  2. 算法版本控制 – SDK 里我会保留旧算法兼容逻辑,防止历史数据解不出来。
  3. 性能基准测试 – 同样加密 100 万条手机号,SM4 比 AES 慢大约 5%,基本可忽略。
  4. 字段类型适配 – 整数、时间戳可以直接用固定长度加密;字符串建议先序列化再加密,避免长度溢出。

核心结论: 一般的业务场景,无脑选 AES-256-GCM + HMAC-SHA256。遇到国标合规需求,换成 SM4-GCM + SM2 + SM3。记住,算法本身不是瓶颈,密钥管理和完整性校验才是大部分事故的根源。