GBase 8a
其他
文章
精选

如何创建一个使用SM4加密存储的表?加密密钥是如何管理和存储的?

发表于2026-03-27 10:19:2430次浏览3个评论

在 GBase 8a MPP Cluster 中创建一个使用 SM4 加密存储的表,需要经过 选择算法、创建密钥证书、定义加密表 三个核心步骤。加密密钥通过 密钥证书 进行集中管理,并以文件形式分布式存储在集群各节点上。

一、创建使用 SM4 加密存储的表的完整步骤

步骤1:确认并选择 SM4 加密算法

在创建加密表之前,必须通过集群参数 gbase_encrypt_new_mode 明确选择加密算法。此选择一旦生效,后续创建的加密表将使用该算法,且不支持切换

-- 设置集群默认加密算法为国密SM4
-- 注意:参数值可能为 'SM4' 或 'SMS4',请以实际版本为准
SET GLOBAL gbase_encrypt_new_mode = 'SM4';

“gbase_encrypt_new_mode 参数选择算法,选择后不支持切换”。

步骤2:创建密钥证书

加密功能依赖于密钥证书。证书分为明文密钥密文密钥两种类型。

-- 创建密文密钥证书(推荐,更安全)。需要提供用户口令。
CREATE ENCRYPTION CERTIFICATE my_sm4_cert
    TYPE = CIPHERED
    PASSWORD = 'YourStrongPassword123!';
  • 明文密钥证书:无需口令,密钥明文存储。创建命令为 TYPE = PLAIN
  • 密文密钥证书:需要口令,密钥被口令加密后存储。口令需符合集群密码策略(如 password_min_length)。
  • 证书存储:证书文件(如 certificate.crt)会自动分发并存储在每个 gclustergnode 节点的 $GBASE_HOME/config/ 目录下。

步骤3:创建带加密属性的表

CREATE TABLE 语句中,使用 ENCRYPT 关键字为表或列添加加密属性。

-- 示例1:创建表级加密表(整个表的所有列均加密)
CREATE TABLE encrypted_whole_table (
    id INT,
    sensitive_data VARCHAR(200),
    create_time DATETIME
) ENCRYPT;

-- 示例2:创建列级加密表(仅对特定列加密)
CREATE TABLE customer_info (
    user_id INT,
    name VARCHAR(100),
    id_card_no VARCHAR(20) ENCRYPT,  -- 仅加密身份证号列
    phone VARCHAR(20) ENCRYPT,       -- 仅加密手机号列
    email VARCHAR(50)
);

关键限制

  • 不支持 ALTER TABLE 修改加密属性。加密必须在建表时指定。

     

  • 加密列的数据类型需符合要求(通常支持数值、字符、日期等)。

步骤4:初始化密钥并开始使用

创建表后,系统会自动或手动初始化密钥,之后即可正常进行 INSERTSELECT 等操作。

  • 对于密文密钥证书,在执行DML前需先“打开”证书:

     

    OPEN ENCRYPTION CERTIFICATE my_sm4_cert PASSWORD = 'YourStrongPassword123!';
  • 关闭证书后,对加密列的DML操作将失效:

     

    CLOSE ENCRYPTION CERTIFICATE my_sm4_cert;

二、加密密钥的管理与存储机制

GBase 8a 采用 “全局统一密钥 + 分布式证书存储” 的管理模式。

1. 密钥的生成与存储

  • 生成:密钥在创建证书时生成,可以是随机生成或手动输入。
  • 存储形式:密钥被保存在 密钥证书文件(如 certificate.crt)中。
  • 存储位置:该证书文件在集群每个节点(所有GCluster和GNode)的 config 目录下均有一份副本

     

2. 密钥的类型与转换

类型特点口令要求转换支持
明文密钥密钥以明文形式存储,无需口令即可使用。

支持转换为密文密钥。

 

密文密钥密钥被用户口令加密后存储,安全性更高。必须提供口令,且需符合密码规则。支持转换为明文密钥。
  • 转换命令ALTER ENCRYPTION CERTIFICATE ... CONVERT TO ...

3. 密钥的管理操作

  • 备份必须备份证书文件。一旦丢失或损坏,加密数据将无法解密
  • 状态查询

     

    -- 查看所有密钥证书状态
    SELECT * FROM information_schema.encryption_certificate_status;
  • 口令修改:支持修改密文密钥证书的口令。
  • 打开/关闭:控制密文密钥证书的可用状态。

4. 密钥使用的安全规则

  1. 全局唯一性整个集群实例使用同一个密钥证书来加解密所有加密表。
  2. 口令责任:对于密文密钥,用户必须牢记口令,系统不存储也无法找回。
  3. 文件安全:证书文件本身需通过操作系统权限进行保护(如 chmod 600)。
  4. 合规性:如果启用了密码强度策略,则密文密钥的口令必须符合该策略。

三、重要限制与注意事项

  1. 算法不可逆:一旦使用 gbase_encrypt_new_mode 选定算法(AES或SM4),无法切换

     

  2. 证书不可更改:密钥证书创建后不可更改,只能通过创建新证书来更换密钥(涉及数据重加密)。
  3. 功能限制
    • 加密表不支持DBLink操作
    • 加密列不支持作为分布列
    • 加密操作是软加密,对性能有轻微影响(文档称性能影响小于5%)。
  4. 备份与灾备:在制定备份恢复或容灾方案时,必须将密钥证书作为关键元数据一并备份和同步

四、总结

创建SM4加密存储表的核心流程是:设算法 -> 建证书 -> 建表。密钥管理的关键在于:

  • 集中管理,分布式存储:一个全局密钥,证书文件分发到所有节点。
  • 安全分离:密钥(证书文件)与加密数据物理分离存储。
  • 责任明晰:密文密钥的口令由用户自行保管,符合安全最佳实践。

通过这套机制,GBase 8a 在提供透明、高效的数据列加密能力的同时,也确保了密钥管理的安全性与合规性,满足数据安全存储的法规要求。

评论

登录后才可以发表评论
用户头像
山佳发表于 1个月前
11111
用户头像
柒柒天晴发表于 1个月前
学习下
流泪猫猫头发表于 17小时前
学习了。