数安商用密码

格式保留加密(FPE)是什么?为什么它需要硬件密码机

格式保留加密(FPE, Format-Preserving Encryption)是一种加密后密文与明文格式完全一致的加密技术:11 位手机号加密后还是 11 位数字,18 位身份证号加密后还是 18 位。它解决的是"既要加密、又不想改数据库字段和已有业务代码"的现实矛盾。但 FPE 对密钥安全和算法实现要求极高,生产环境强烈建议在硬件密码机里完成 FPE 运算,而不是用软件库裸跑。

什么是格式保留加密

普通加密(如 SM4、AES)的输出是一串二进制密文,长度和字符集都变了。一个 11 位手机号加密后可能变成一长串 Base64,原本 varchar(11) 的字段存不下,所有读写这个字段的代码都要改。

FPE 的特点是:密文和明文在长度、字符集、格式上保持一致。手机号加密后仍是 11 位数字,邮箱加密后仍是合法邮箱格式。这样数据库表结构不用动,前端展示不用改,存量系统改造量大幅降低。

FPE 解决什么问题

典型场景是老系统的敏感字段加密改造:数据库里早就堆满了手机号、身份证号、银行卡号,现在要做数据安全合规(数安法、个保法、密评),必须加密存储,但又不能把跑了多年的业务代码全部重写。

  • 字段长度/类型不变:免去改库表、改 ORM、改接口的连锁成本。
  • 保留部分可用性:可以只加密身份证号的中间几位,保留前 6 位地区码用于统计。
  • 兼容校验规则:银行卡号加密后仍能过 Luhn 校验位的格式,不会被前端拦截。

FPE 的标准与算法

国际上 FPE 的权威标准是 NIST SP 800-38G,定义了两种模式:FF1FF3-1(FF3 因安全问题已被修订为 FF3-1)。它们底层都基于分组密码(如 AES),通过 Feistel 结构在指定基数(radix)和长度上做加密。

模式底层特点说明
FF1分组密码支持更长输入、更灵活NIST 推荐
FF3-1分组密码实现更简单、更快FF3 修订版,修复了已知弱点

在国密合规场景下,可以将 FPE 的底层分组密码替换为 SM4,从而在保留格式的同时满足国密算法要求。这也是 FPE 与密评结合时的关键点。

⚠️
FPE 不是"随便找个库就能用"的技术。FF3 曾被学术界发现可在一定条件下被攻破(后修订为 FF3-1)。参数(tweak、基数、最小长度)设置不当会显著削弱安全性,自研实现风险尤其高。

为什么 FPE 需要硬件密码机

FPE 的安全性几乎完全压在密钥保护算法实现正确性上。这正是硬件密码机(HSM/密码卡)的价值所在:

1
密钥不出硬件边界
FPE 用的根密钥在密码机内部生成、存储、使用,永远不以明文出现在应用内存或磁盘上,杜绝密钥泄露这一最大风险。
2
合规与可举证
密评要求密码运算由"合规、正确、有效"的商用密码产品完成。用通过型号认证的密码机做 FPE,比软件库更容易通过密评。
3
实现经过验证
密码机内的 FPE/SM4 实现经过认证测试,避免自研实现里参数错误、侧信道等隐患。
4
性能有保障
大批量字段加解密时,硬件加速比纯软件实现稳定,且不占用业务服务器 CPU。

FPE 和脱敏、Tokenization 的区别

技术可逆格式保留典型用途
FPE可逆(有密钥可解密)生产数据加密存储
静态脱敏不可逆通常是测试/分析环境造数
Tokenization可逆(查映射表)支付卡号替换

简单说:要能解密还原不改格式,选 FPE;只是给测试环境造假数据,用脱敏;不想自己保管密钥、愿意维护映射表,可考虑 Tokenization。

落地建议与结论

FPE 是存量系统做敏感字段加密、又要控制改造成本的"最小侵入"方案。但它的安全性高度依赖密钥管理和算法实现,不要用软件库裸跑在业务服务器上。推荐路径:FPE 运算下沉到硬件密码机或密码服务平台,业务系统只调加解密 API,根密钥进 KMS 统一管理,这样既保留格式、又满足密评对合规密码产品的要求。

如果你正在评估老系统的字段加密改造,可以联系我们,结合你的数据库结构给出 FPE 与硬件密码机的接入方案。