Apache Cloudberry™ (Incubating) 是 Apache 软件基金会孵化项目,由 Greenplum 和 PostgreSQL 衍生而来,作为领先的开源 MPP 数据库,可用于建设企业级数据仓库,并适用于大规模分析和 AI/ML 工作负载。
GitHub: https://github.com/apache/cloudberry
01 透明数据加密(TDE)技术解析
1.什么是透明数据加密?
TDE(Transparent Data Encryption)是一种针对静态数据的加密技术,在文件系统层自动加密数据文件,内存处理时解密为明文。TDE 的“透明”特性意味着用户无需改变操作习惯,也无需理解复杂的加密和解密过程,从而降低了实施难度,同时提升了数据保护的可靠性。
2.加密算法选型逻辑
加密算法主要分为单钥加密(对称加密)和双钥加密(非对称加密)两大类。
对称加密(单钥):高性能首选,分两类:
流加密(如 RC4):逐字节处理,密钥长度需匹配明文,不适用数据库场景。
块加密(如 AES):按固定块(如 128 位)处理,适合结构化数据存储。 非对称加密(双钥):如 RSA,虽然安全性较高,但性能较低,通常仅用于密钥分发而非数据加密。
主流加密算法对比如下:
算法 | 性能 | 安全性 | 适用场景 |
AES | 高 | 高 | 通用数据加密 |
SM4 | 中 | 高 | 国密合规场景 |
3DES | 低 | 中 | 传统系统兼容 |
3. 密钥管理:安全与性能的平衡
名词 | 描述 |
DEK (Data Encryption Key) | 存在于数据仓库计算节点内存的数据加密密钥。通过数据库内部随机数函数生成,作为实际加密数据的密码。 |
DEK明文 | 跟DEK同义,只能保存在内存中 |
Master Key | 主密钥,用于加密下层密钥 |
单层密钥
单层密钥管理结构中,密钥更新流程如下:

单层密钥更新流程
单层密钥管理存在局限性,特别是当需要更换直接加密数据的 DEK(Data Encryption Key)时,需全量解密再加密,这将消耗大量 I/O 与 CPU 资源。例如,加密 10TB 数据,密钥轮换可能需要数小时,期间业务可能会中断。
双层密钥
为了减轻密钥变更对数据库的影响,我们引入了双层密钥管理策略,即使用两把密钥:DEK 和 MK(Master Key)。

DEK:动态生成,直接加密数据(高频操作)。 MK(Master Key):加密 DEK,存储在外部 KMS(低频操作)。
1. Cloudberry 密钥管理
Cloudberry 的密钥管理主要针对集群加密,其密钥生命周期管理如下:

集群安装时动态生成 DEK,明文仅存内存,密文经 MK 加密后存储。 查询执行时,DEK 由 MK 解密后加载至内存。 集群关闭后 DEK 明文自动清除,MK 由 KMS 托管确保安全。
2.HashData 密钥管理
HashData 的密钥管理策略与 Cloudberry 类似,但密钥存放位置有所不同:主密钥(MK)保存在云管平台的密钥管理服务中;数据加密密钥(DEK)保存在内存中,密文保存在对象存储中。密钥管理体系采用分层加密设计,结合双层密钥结构与多层管理模型,在保证数据安全的同时,兼顾系统灵活性和性能。
双层密钥管理流程

HashData 双层密钥更新流程
HashData 的双层密钥管理流程包括密钥生成与存储、密钥使用与分发等环节。
密钥生成与存储 DEK 明文生成:由仓库(Warehouse)的 Master 节点通过随机数函数动态生成。明文仅保留在内存中,确保无磁盘泄露风险。
DEK 密文存储:使用 DB Key(上层密钥)加密 DEK 明文,生成 DEK 密文。DEK 密文持久化存储至共享存储(如对象存储)。 密钥使用与分发
Segment 节点获取 DEK:启动时从 Master 节点获取 DEK 明文(通过安全通道传输)。
主密钥(MK)管理:MK 由云管平台的 EncryptionKeyService 统一管理,与数据库节点隔离。通过 KMS(密钥管理服务)动态获取,避免静态存储风险。
多层密钥管理

HashData 双层密钥更新流程
为满足企业级安全需求,HashData 采用多层密钥体系,形成自上而下的权限管控链。这里我们需要明确几个核心概念:
名词 | 描述 |
enveloped key | 信封密钥,用来加密密钥数据的密钥,Master Key就是一种信封密钥 |
DEK密文 | 使用上层的MK加密DEK明文生成,持久到统一存储中。 |
Root key | 根密钥,最上层的master key,用来加密下层密钥(Tenant key) |
Tenant key | 租户密钥,第二层master key,用来加密下层密钥(Db key) |
DB key | 数据库密钥,第三层master key,用来加密下层密钥(DEK) |
3.存储层加密策略

Cloudberry 存储层加密策略
在 HashData 中,表的存储格式采用的是 PAX(行列混存) 格式。
HashData 存储层加密策略
PAX 文件:是存储在文件系统上的普通二进制文件,每个 PAX 文件由多个 stripe 组成。每个 stripe 存储多条记录,这些记录按照列进行独立存储,类似于 Parquet 中的 row group 概念。 文件级元数据:包括文件描述信息、文件 meta 信息(如统计数据)、所有 stripe 的信息以及文件的 schema 信息。 Group/Stripe:一个 stripe 由若干行组成,数据读取时是按行组为单位的。每一列数据被独立存储。 Data Stream:每列数据存储为独立的 Data Stream,包含多行数据。
为什么加密数据块基于 DataStream 而非文件级或 Group/Stripe 级别?
在 PAX 格式下,查询只涉及特定列的数据。例如,如果我们执行如下查询:
CREATE TABLE test1(a INT, b INT, c INT);
INSERT INTO test1 SELECT generate_series(1, 10000000);
SELECT a FROM test1;
仅查询表的某一列时,PAX 格式支持 跳块读取(skip-block reading),即仅加载查询涉及的列,而不会读取整个文件或 group 数据。这意味着,如果按文件或 group 作为加密单元,系统会被迫读取整个文件,进而解密,导致性能大幅下降。因此,我们选择将加密数据块限定为 DataStream,只加密实际需要的列数据,从而提升性能。
4.加密实现策略
算法模式(例如 CBC、ECB) 密钥(Key):使用 DEK(数据加密密钥)明文存储于内存中。
初始化向量(IV):为了确保加密结果的随机性,每次加密必须使用不同的 IV。为了优化性能,我们使用数据库 OID 作为 IV,这样既能保证其唯一性,又避免了每次生成随机数的开销。
5.数据加密和压缩
在进行数据加密和压缩时,操作顺序至关重要。推荐先进行压缩,再进行加密,因为加密会消除数据中的冗余信息,使得数据变得难以压缩。如果先进行加密,再尝试压缩,效果会大打折扣,因为加密后的数据通常包含更多的随机性,难以进行有效的压缩。
因此,正确的操作顺序是:
写数据时:先压缩后加密。 读数据时:先解密后解压。
6. Cloudberry 中 TDE 的使用方法
Apache Cloudberry 提供透明数据加密功能,直接部署开启 TDE 功能即可,此后的数据加密操作对于用户来说是透明,不需要额外关注。
想要在部署 开启 TDE,使用 gpinitsystem 进行初始化数据库时候,用户需要指定 -T 参数。支持 AES 和 SM4 两种加密算法,开启的方法如下:
开启 TDE 特性,并指定加密算法为 AES:
gpinitsystem -c gpinitsystem_config -T AES256
gpinitsystem -c gpinitsystem_config -T SM4
7.性能测评
开启 TDE 后,尽管可以显著提高静态数据的安全性,但也会对数据库的读写性能造成一定影响。在实际使用中,建议根据业务需求综合考虑是否启用 TDE。
在 TPCH 性能测试中,使用 AES256 算法时,性能损失在 5% 以内。
测试环境:
华为云 ECS 主机,计算节点配置:16 核 CPU / 32GB 内存 / 200GB SSD,部署 3 个 segment 节点。
推荐阅读
👇🏻️扫码加入 Apache Cloudberry 交流群👇🏻️
