FPE 是什么
格式保留加密(FPE,Format-Preserving Encryption)在加密数据的同时保持数据的格式与长度:16 位银行卡号加密后仍是 16 位数字,手机号仍是 11 位数字。NIST SP 800-38G 定义了 FF1 与 FF3-1 两种方案,其中 FF3 因被发现缺陷而修订为 FF3-1,新系统应选择 FF1 或 FF3-1。因为密文形态与明文一致,落库时通常不需要修改表结构,依赖字段格式的下游程序也能照常工作。
基本信息
| 标准 | NIST SP 800-38G(FF1、FF3-1) |
|---|---|
| 输入参数 | 基数 radix(如 10 表示纯数字串)与 tweak |
| 输出特性 | 与明文等长、字符集相同 |
| 安全目标 | 仅机密性,不提供完整性 |
| 版本提示 | FF3 已因缺陷修订为 FF3-1,新系统避免使用 FF3 |
| 密钥保护 | 密钥必须与业务数据分开存储与授权 |
典型使用场景
- 存量数据库敏感字段改造:字段长度与类型不变,应用与报表逻辑改动最小
- 加密后的值仍需交给只接受固定格式的系统(对账、清算、老接口)
- 测试与开发环境的数据去标识化:保持数据形态与分布,便于复现问题
- 多租户场景下用 tweak 绑定租户或字段名,避免同一明文在不同上下文产生相同密文
- 需要可逆性但无法维护大规模映射库时的折中方案
设计要点
设计要点
radix=10 # 仅数字字符参与运算,保持卡号形态
tweak # 绑定业务上下文(字段名 + 租户 ID),不同上下文密文不同
key # 单独保护,禁止与业务数据同库同权限
# FF1 常见约定:AES-256 密钥、8 字节 tweak、radix 与字符串长度按字段确定
# 同一字段、同一 tweak、同一密钥才能稳定还原,参数要与密文一起登记与其他脱敏方案对比
| 方案 | 可逆 | 保留格式 | 主要代价 |
|---|---|---|---|
| FPE | 可逆 | 是 | 密钥保护要求高,小域存在枚举风险 |
| 令牌化 | 可逆(查映射) | 可自定义 | 需要高可用映射库与容量规划 |
| 掩码 / 哈希 | 不可逆 | 否 | 无法还原,业务能力受限 |
FPE 的密文可以被反复查询与比对:小基数短字段(例如 6 位数字)明文空间只有百万级,暴力枚举即可还原。敏感场景必须叠加访问控制、操作审计与查询频率限制,必要时再用 HMAC 增加一层校验维度。