数据库安全网关体系中,对Long、Date类型列加密的方法
数据库安全网关体系中,对Long、Date类型列加密的方法
引言:加密与业务兼容性的平衡
在数据库安全网关体系设计中,对Long、Date类型列的加密面临核心矛盾:安全性需求与业务查询需求的平衡。
传统加密方案会破坏数据类型特性,导致查询功能丧失。
本文将深度解析如何在保证安全性的前提下,通过特定加密技术维持数据格式不变,确保业务连续性。
核心认知:加密的类型转换必然性
技术现实
经过标准的对称加密算法(如 AES、SM4)加密后,输出都是一个二进制数据块。
在数据库中,这个二进制数据块通常用以下类型来存储:
BLOB/BINARY/VARBINARY。这是最直接、最自然的存储方式。加密库(如 Java 的 JCE)输出的字节数组可以直接存入这些类型的字段中。
优点: 存储效率高,没有不必要的转换。
缺点: 不可读,无法直接用于加密以外的操作。
接受两个事实
- 1、加密列无法直接用于数据库查询(除非实现密文索引或者其他特殊算法)。
- 2、如果不进行格式和范围保持的特有算法,加密就会破坏了原始数据的类型特性。
- 明文 Long: 是一个8字节的整数
- 明文 Date: 是一个日期格式或时间戳数字
- 加密后: 都变成了一个二进制数据块
探讨:Long 值的加密
Long 是一个 64 位的整数。
加密方案: 确定性加密
例如 AES 在 ECB 模式或使用相同的 IV或者SM4等。相同的 Long 值总是产生相同的密文。这允许进行等值查询(WHERE user_id = ?),但会泄露数据的频率信息,安全性较低。
支持等值查询。
加密方案: 随机性加密
例如 AES 在 GCM 或 CBC 模式或者SM4等。每次加密相同的 Long 值都会产生不同的密文。这非常安全,但你无法基于密文进行查询(如 WHERE encrypted_salary > ?)。
不支持任何查询。
加密方案: 格式保留加密(FPE)
这是一种特殊的加密算法,其核心特点是加密后的密文与明文具有完全相同的格式和长度。
一个可用的算法实现: LongFPE加解密实现 claude-stars
实现该算法加密后的值,可以将密文保持在与明文相同的格式和长度。对于一个 Long 值,加密后仍然是一个 看起来像 Long 的值。
工作原理
它使用一个密钥,将一个有限集合中的值(如所有可能的Long值或Date值)映射到同一个集合中的另一个值,这个过程是可逆的。
优点
完美兼容现有数据库模式和查询,无需修改列类型。可以对加密后的数据进行范围查询和等值查询(虽然实现复杂)。
缺点
实现复杂,通常需要专门的FPE库(如 ff1 模式),性能可能不如 AES,且密码学界对其某些实现的审查不如 AES 那样广泛。
存储:Long值加密后,返回的 byte[] 可以直接存入 BLOB
探讨:Date 值的加密
Date 在 Java 中通常表示为自 1970-01-01 00:00:00 GMT 以来的毫秒数(一个 Long)。在数据库中,它可能是 DATE、DATETIME 或 TIMESTAMP 类型。
加密方案: 转换为 Epoch Millis 再加密
这是最通用的方法。将 Date 对象转换为其底层的长整型值(毫秒数),然后使用上面 Long 值的加密方法进行加密。
优点: 简单,统一了 Long 和 Date 的处理逻辑。
缺点: 失去了所有原生的日期查询能力。
加密方案: 转格式保留加密(FPE)
- 如果数据库中的日期是 YYYY-MM-DD 格式,FPE 可以将其加密为另一个看起来像 YYYY-MM-DD 的字符串。
- 原理: 加密后的输出在格式和长度上与明文相同。
- Long值加密: 加密后仍然是一个看起来合法的 BIGINT 值。
- Date值加密: 加密后仍然是一个格式为 YYYY-MM-DD 的字符串。
- 优点: 可以执行等值查询(WHERE birth_date = ‘2023-10-27’)。
- 缺点: 同样存在安全性和实现复杂性的问题。
加密方案: 转同态加密(理论可行,实际少用)
- 一种允许在密文上进行计算的加密技术。理论上可以对加密的日期进行范围比较,但目前性能开销巨大,不适用于生产环境的高频查询。
存储: Date值加密后, byte[] 存入 BLOB
格式保留加密(FPE)— 不改变数据格式的核心方案
传统加密技术面临一个现实困境:加密后的数据变成无规则的二进制流,破坏了原有的数据格式和结构,导致数据库查询、业务逻辑和系统集成面临巨大挑战。
格式保留加密(Format-Preserving Encryption, FPE)应运而生,它巧妙地解决了这一矛盾,在提供强加密保护的同时,完美保持了数据的原有格式。
格式保留加密核心特点是加密后的密文与明文具有完全相同的格式、长度和字符集。对于数据库中的Long类型和Date类型,这意味着:
- Long值加密:明文 100000 → 密文 834752(仍为合法BIGINT)
- Date值加密:明文 2023-10-27 → 密文 7385-11-23(仍为合法DATE格式)
技术特性
FPE具备三大核心特性,使其在数据库加密领域独具优势:
- 数据长度不变性
加密前长度是N,加密后长度仍然是N。例如:13位电话号码加密后仍是13位数字
- 数据类型保持性
加密前是数字类型,加密后仍然是数字类型; 加密前是日期格式,加密后仍然是日期格式
- 加密过程可逆性
加密后的数据可以通过密钥解密还原原始数据; 支持等值查询和部分范围查询
工作原理
格式保留加密是一种特殊的加密算法,确保密文与明文具有完全相同的格式、长度和字符集。对于Long和Date类型,这意味着加密后仍保持原有的数值或日期外观。
它使用一个密钥,将一个有限集合中的值(如所有可能的Long值或Date值)映射到同一个集合中的另一个值,这个过程是可逆的。
有限域映射原理
FPE算法的精髓在于有限集合内的双射映射:
有限字符集 S = {c₁, c₂, …, cₙ}
↓
整数域 Zₙ = {0, 1, 2, …, n-1}
↓
加密变换 f: Zₙ → Zₙ (双射函数)
↓
字符集映射 S → Zₙ → Zₙ → S
`
数学基础
- 使用FF1、FF3-1等标准化算法
- 基于Feistel网络结构,在有限域内进行可逆映射
- 保持字符集不变(数字0-9、日期分隔符等)
例如对于敏感的数据信息,如电话号码(13位数字),FPE算法算法加依旧是13位数字,因此这种特性可以不用变更数据库中字段格式,有利于传播。
除了这些优点,还具有:
- 数据长度不变。加密前长度是N,加密后长度仍然是N
- 数据类型不变,加密前是数字类型,加密后仍然是数字类型。
- 加密过程可逆,加密后的数据可以通过密钥解密还原原始数据。
注:此段引用自《大数据时代下的隐私保护(三)》
对Long、Date类型列加密的方法
