更新时间:2026-08-06 GMT+08:00
操作步骤
本节将基于透明加密的主要功能场景展开详细说明,包含功能使用方式、结果验证等内容。
表数据加密
- gsql客户端连接CN节点,创建明文表tbl、AES算法加密表tbl_aes以及SM4算法加密表tbl_sm4。
gaussdb=# CREATE TABLE tbl (c1 INT, c2 TEXT); CREATE TABLE gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on); CREATE TABLE gaussdb=# CREATE TABLE tbl_sm4 (c1 INT, c2 TEXT) WITH (enable_tde = on, encrypt_algo = 'SM4_CTR'); CREATE TABLE
- 保持CN节点连接,查询pg_class表。表tbl_aes与表tbl_sm4中存在透明加密相关表选项。
gaussdb=# SELECT relname,reloptions FROM pg_class WHERE relname LIKE 'tbl%'; relname | reloptions ---------+----------------------------------------------------------------------------------------------------------------------- tbl | {orientation=row,compression=no,storage_type=USTORE,segment=off} tbl_aes | {orientation=row,enable_tde=on,compression=no,storage_type=USTORE,segment=off,encrypt_algo=aes_128_ctr,key_type=...} tbl_sm4 | {orientation=row,enable_tde=on,compression=no,storage_type=USTORE,segment=off,encrypt_algo=sm4_ctr,key_type=...} (3 rows) - 保持CN节点连接,向三张表插入数据。
gaussdb=# INSERT INTO tbl VALUES (generate_series(1,20), 'test_data'); INSERT 0 20 gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data'); INSERT 0 20 gaussdb=# INSERT INTO tbl_sm4 VALUES (generate_series(1,20), 'test_data'); INSERT 0 20
- gsql客户端连接任一DN节点,通过SELECT语句确认当前DN节点存储有数据;通过pg_relation_filepath函数查询表文件存储相对路径与文件名。
gaussdb=# SELECT count(*) != 0 FROM tbl; ?column? ---------- t (1 row) gaussdb=# SELECT pg_relation_filepath('tbl'); pg_relation_filepath ---------------------- base/<db_oid>/<tbl_file> (1 row) gaussdb=# SELECT pg_relation_filepath('tbl_aes'); pg_relation_filepath ---------------------- base/<db_oid>/<tbl_aes_file> (1 row) gaussdb=# SELECT pg_relation_filepath('tbl_sm4'); pg_relation_filepath ---------------------- base/<db_oid>/<tbl_sm4_file> (1 row)
- 根据4获取到的路径,进入表文件存储目录后,通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配成功,说明数据已明文存储;表tbl_aes与表tbl_sm4文件则未匹配成功,说明数据已加密存储。
grep -nir 'test_data' <tbl_file> Binary file <tbl_file> matches grep -nir 'test_data' <tbl_aes_file> grep -nir 'test_data' <tbl_sm4_file>
- gsql客户端连接CN节点,删除表完成清理。
gaussdb=# DROP TABLE tbl; DROP TABLE gaussdb=# DROP TABLE tbl_aes; DROP TABLE gaussdb=# DROP TABLE tbl_sm4; DROP TABLE
索引数据加密
- gsql客户端连接CN节点,创建加密表tbl_aes;创建明文索引idx1与加密索引idx2。
gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on); CREATE TABLE gaussdb=# CREATE INDEX idx1 ON tbl_aes(c2); CREATE INDEX gaussdb=# CREATE INDEX idx2 ON tbl_aes(c2) WITH (enable_tde = on); CREATE INDEX
- 保持CN节点连接,查询pg_class表。索引idx2存在透明加密表选项,且enable_tde为on。
gaussdb=# SELECT relname,reloptions FROM pg_class WHERE relname LIKE 'idx%'; relname | reloptions ---------+----------------------------------------------------------------------------------------------------------------------- idx1 | {storage_type=USTORE} idx2 | {enable_tde=on,storage_type=USTORE,encrypt_algo=aes_128_ctr,key_type=...} (2 rows) - 保持CN节点连接,向表tbl_aes插入数据。
gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data'); INSERT 0 20 - gsql客户端连接DN节点,通过SELECT语句确认当前DN节点存储有数据,通过pg_relation_filepath函数查询索引文件存储相对路径与文件名。
gaussdb=# SELECT count(*) != 0 FROM tbl_aes; ?column? ---------- t (1 row) gaussdb=# SELECT pg_relation_filepath('idx1'); pg_relation_filepath ---------------------- base/<db_oid>/<idx1_file> (1 row) gaussdb=# SELECT pg_relation_filepath('idx2'); pg_relation_filepath ---------------------- base/<db_oid>/<idx2_file> (1 row)
- 根据4获取到的路径,进入索引文件存储目录后,通过操作系统的grep命令对索引文件进行文本内容匹配。索引idx1文件匹配成功,说明数据已明文存储;索引idx2文件则未匹配成功,说明数据已加密存储。
grep -nir 'test_data' <idx1_file> Binary file <idx1_file> matches grep -nir 'test_data' <idx2_file>
- gsql客户端连接CN节点,删除表完成清理。
gaussdb=# DROP TABLE tbl_aes; DROP TABLE
数据密钥轮转
- gsql客户端连接CN节点,创建加密表tbl_aes。
gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on); CREATE TABLE - 保持CN节点连接,查询pg_class表。dek_cipher表选项为当前表的数据密钥密文,记录该值。
gaussdb=# SELECT relname,reloptions FROM pg_class WHERE relname LIKE 'tbl%'; relname | reloptions ---------+----------------------------------------------------------------------------------------------------------------------- tbl_aes | {orientation=row,enable_tde=on,compression=no,storage_type=USTORE,segment=off,encrypt_algo=aes_128_ctr,dek_cipher=...} (1 row) - 保持CN节点连接,执行数据密钥轮转命令。
gaussdb=# ALTER TABLE tbl_aes ENCRYPTION KEY ROTATION; ALTER TABLE - 参考2,再次查询pg_class表。dek_cipher值发生了改变,说明实际发生了密钥轮转。
- 保持CN节点连接,删除表完成清理。
gaussdb=# DROP TABLE tbl_aes; DROP TABLE
加密表/非加密表转换
- gsql客户端连接CN节点,创建明文表tbl、AES算法加密表tbl_aes。
gaussdb=# CREATE TABLE tbl (c1 INT, c2 TEXT); CREATE TABLE gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on); CREATE TABLE
- 保持CN节点连接,向两张表插入数据。
gaussdb=# INSERT INTO tbl VALUES (generate_series(1,20), 'test_data'); INSERT 0 20 gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data'); INSERT 0 20
- gsql客户端连接DN节点,通过SELECT语句确认当前DN节点存储有数据,通过pg_relation_filepath函数查询表文件存储相对路径与文件名。
gaussdb=# SELECT count(*) != 0 FROM tbl; ?column? ---------- t (1 row) gaussdb=# SELECT pg_relation_filepath('tbl'); pg_relation_filepath ---------------------- base/<db_oid>/<tbl_file> (1 row) gaussdb=# SELECT pg_relation_filepath('tbl_aes'); pg_relation_filepath ---------------------- base/<db_oid>/<tbl_aes_file> (1 row)
- 根据3获取到的路径,进入表文件存储目录后,通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配成功,说明数据已明文存储;表tbl_aes未匹配成功,说明数据已加密存储。
grep -nir 'test_data' <tbl_file> Binary file <tbl_file> matches grep -nir 'test_data' <tbl_aes_file>
- gsql客户端连接CN节点,执行表加密转换语句,将表tbl变为加密表,表tbl_aes变为非加密表;然后执行VACUUM FULL语句,保证存量数据的加密状态转换。
gaussdb=# ALTER TABLE tbl SET (enable_tde = on); ALTER TABLE gaussdb=# ALTER TABLE tbl_aes SET (enable_tde = off); ALTER TABLE gaussdb=# VACUUM FULL tbl; VACUUM gaussdb=# VACUUM FULL tbl_aes; VACUUM
- gsql客户端连接DN节点,参考3,确认当前DN节点存储有数据,并查询表文件存储相对路径与文件名(VACUUM FULL命令会导致表文件名发生变化)。
- 参考4,通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配失败,说明数据已加密存储;表tbl_aes匹配成功,说明数据已明文存储。
- gsql客户端连接CN节点,删除表完成清理。
gaussdb=# DROP TABLE tbl; DROP TABLE gaussdb=# DROP TABLE tbl_aes; DROP TABLE