更新时间:2026-08-06 GMT+08:00
分享

操作步骤

本节将基于透明加密的主要功能场景展开详细说明,包含功能使用方式、结果验证等内容。

表数据加密

  1. gsql客户端连接DN主节点,创建明文表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

  2. 查询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)

  3. 向三张表插入数据。

    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

  4. 通过pg_relation_filepath函数查询表文件存储相对路径与文件名。

    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)

  5. 根据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>

  6. 删除表完成清理。

    gaussdb=# DROP TABLE tbl;
    DROP TABLE
    gaussdb=# DROP TABLE tbl_aes;
    DROP TABLE
    gaussdb=# DROP TABLE tbl_sm4;
    DROP TABLE

索引数据加密

  1. gsql客户端连接DN主节点,创建加密表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

  2. 查询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)

  3. 向tbl_aes插入数据。

    gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data');
    INSERT 0 20

  4. 通过pg_relation_filepath函数查询索引文件存储相对路径与文件名。

    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)

  5. 根据4获取到的路径,进入索引文件存储目录后,通过操作系统的grep命令对索引文件进行文本内容匹配。索引idx1文件匹配成功,说明数据已明文存储;索引idx2文件则未匹配成功,说明数据已加密存储。

    grep -nir 'test_data' <idx1_file>
    Binary file <idx1_file> matches
    grep -nir 'test_data' <idx2_file>

  6. 删除表完成清理。

    gaussdb=# DROP TABLE tbl_aes;
    DROP TABLE

数据密钥轮转

  1. gsql客户端连接主DN节点,创建加密表tbl_aes。

    gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on);
    CREATE TABLE

  2. 查询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)

  3. 执行数据密钥轮转命令。

    gaussdb=# ALTER TABLE tbl_aes ENCRYPTION KEY ROTATION;
    ALTER TABLE

  4. 参考2,再次查询pg_class表。dek_cipher值发生了改变,说明实际发生了密钥轮转。
  5. 删除表完成清理。

    gaussdb=# DROP TABLE tbl_aes;
    DROP TABLE

加密表/非加密表转换

  1. gsql客户端连接主DN节点,创建明文表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

  2. 向两张表插入数据。

    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

  3. 通过pg_relation_filepath函数查询表文件存储相对路径与文件名。

    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)

  4. 根据3获取到的路径,进入表文件存储目录后,通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配成功,说明数据已明文存储;表tbl_aes未匹配成功,说明数据已加密存储。

    grep -nir 'test_data' <tbl_file>
    Binary file <tbl_file> matches
    grep -nir 'test_data' <tbl_aes_file>

  5. 执行表加密转换语句,将表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

  6. 参考3,查询表文件存储相对路径与文件名(VACUUM FULL命令会导致表文件名发生变化)。
  7. 参考4,通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配失败,说明数据已加密存储;表tbl_aes匹配成功,说明数据已明文存储。
  8. 删除表完成清理。

    gaussdb=# DROP TABLE tbl;
    DROP TABLE
    gaussdb=# DROP TABLE tbl_aes;
    DROP TABLE

相关文档