基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建列加密规则
更新时间:2026-11-03 09:36:43
本文档将详细介绍创建列加密规则的语法、参数及限制说明,并为你提供实用的示例,帮助你快速掌握列加密规则的配置方法。
准备工作
在创建列加密规则前,需要配置密钥获取方式,获取主密钥:
-- 设置透明表空间加密的方式,取值参见 tde_method(如 internal、obcloud、ocp 等)
ALTER SYSTEM SET tde_method = '<encryption_method>';
-- 创建 Keystore
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE keystore_name IDENTIFIED BY oceanbase_password;
-- 开启 Keystore
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY oceanbase_password;
-- 设置主密钥,首次执行需要等待 20 秒使主密钥生效
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY oceanbase_password;
tde_method 参数具体说明请参见 tde_method。
语法
在开始创建列加密规则之前,需先了解相关的语法结构。OceanBase 提供了完整的 DDL 语句来管理列加密规则,包括创建、删除和修改操作。
创建列加密规则
CREATE SENSITIVE RULE <rule_name>
ON <sensitive_field_list>
USING ENCRYPTION [ = <encryption_method>];
详细说明请参见 CREATE SENSITIVE RULE。
删除列加密规则
当您需要移除某个列加密规则时,可以使用以下语法:
DROP SENSITIVE RULE <rule_name>;
详细说明请参见 DROP SENSITIVE RULE。
修改列加密规则
在实际使用过程中,您可能需要根据业务需求调整列加密规则。OceanBase 提供了灵活的修改语法来满足这些需求:
-- 新增敏感列
ALTER SENSITIVE RULE <rule_name> ADD COLUMN <sensitive_field_list>;
-- 删除敏感列
ALTER SENSITIVE RULE <rule_name> DROP COLUMN <sensitive_field_list>;
-- 启用规则
ALTER SENSITIVE RULE <rule_name> ENABLE;
-- 禁用规则
ALTER SENSITIVE RULE <rule_name> DISABLE;
-- 修改加密算法
ALTER SENSITIVE RULE <rule_name> USING ENCRYPTION [= <encryption_method>];
详细说明请参见 ALTER SENSITIVE RULE。
示例
通过以下具体示例可以加深对列加密规则操作的理解。这些示例涵盖了创建、删除和修改规则的主要场景。
创建
-- 创建敏感规则 r1, 保护 tbl1(a), tbl2(b, c), user2.tbl3(e,f);
-- 不加参数时使用默认加密算法 AES-256-ECB,等价于 USING ENCRYPTION = 'aes-256'
CREATE SENSITIVE RULE r1 on tbl1(a), tbl2(b, c), user2.tbl3(e,f)
USING ENCRYPTION;
-- 创建敏感规则 r2, 保护 tbl4(x, y), tbl5(z);
-- 使用 SM4-CBC 加密算法
CREATE SENSITIVE RULE r2 on tbl4(x, y), tbl5(z)
USING ENCRYPTION = 'sm4-cbc';
删除
DROP SENSITIVE RULE r1;
修改
-- 向敏感规则 r1 中增加 tbl2(c), user2.tbl3(x);
ALTER SENSITIVE RULE r1 ADD COLUMN tbl2(c), user2.tbl3(x);
-- 从敏感规则 r1 中删除 tbl2(c)
ALTER SENSITIVE RULE r1 DROP COLUMN tbl2(c);
-- 启用敏感规则 r1
ALTER SENSITIVE RULE r1 ENABLE;
-- 禁用敏感规则 r1
ALTER SENSITIVE RULE r1 DISABLE;
-- 修改敏感规则 r1 的加密算法为默认算法
ALTER SENSITIVE RULE r1 USING ENCRYPTION;
-- 修改敏感规则 r1 的加密算法为 sm4-cbc
ALTER SENSITIVE RULE r1 USING ENCRYPTION = 'sm4-cbc';
从创建规则到查询验证的完整示例
本示例在 Oracle 模式测试租户中保护 SYS.ENC_EMPLOYEES 表的 PHONE 列,演示普通用户在授予和回收规则级明文访问权限前后的查询结果。示例使用 OceanBase 数据库 V5.0.1 和 OBClient V2.2.10 验证。
请使用独立测试租户,并确保示例中的表、用户和规则名称尚未使用。连接命令中的 <host>、<port>、<tenant_name> 以及 SQL 中的 <keystore_password>、<reader_password> 需替换为实际值。不要在已有业务租户中覆盖密钥配置。
说明
列加密控制查询结果中的明文访问,不等同于表空间的存储加密。SYS 用户默认具有明文访问权限,因此使用新建的普通用户 enc_reader 验证规则效果。该用户还需要 CREATE SESSION 和表的 SELECT 权限,PLAINACCESS 不替代这些权限。
使用
SYS用户连接目标 Oracle 租户。此处不是连接 sys 租户。$ obclient -h<host> -P<port> -uSYS@<tenant_name> -p配置主密钥。本例使用
internal方式;已按本文「准备工作」完成主密钥配置的租户可跳过此步。首次设置后,按「准备工作」中的说明等待主密钥生效,再执行后续步骤。obclient> ALTER SYSTEM SET tde_method='internal'; Query OK, 0 rows affected obclient> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE enc_keystore IDENTIFIED BY "<keystore_password>"; Query OK, 0 rows affected obclient> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "<keystore_password>"; Query OK, 0 rows affected obclient> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "<keystore_password>"; Query OK, 0 rows affected在
SYSSchema 中创建测试表,插入两行数据并提交。obclient> CREATE TABLE enc_employees (id NUMBER PRIMARY KEY, phone VARCHAR2(32)); Query OK, 0 rows affected obclient> INSERT INTO enc_employees VALUES (1, '13800000001'); Query OK, 1 row affected obclient> INSERT INTO enc_employees VALUES (2, '13800000002'); Query OK, 1 row affected obclient> COMMIT; Query OK, 0 rows affected obclient> SELECT id, phone FROM enc_employees ORDER BY id; +------+-------------+ | ID | PHONE | +------+-------------+ | 1 | 13800000001 | | 2 | 13800000002 | +------+-------------+ 2 rows in set创建普通用户
enc_reader,授予登录和查询表的权限,再创建保护phone列的敏感规则r_phone。此时不授予明文访问权限。obclient> CREATE USER enc_reader IDENTIFIED BY "<reader_password>"; Query OK, 0 rows affected obclient> GRANT CREATE SESSION TO enc_reader; Query OK, 0 rows affected obclient> GRANT SELECT ON enc_employees TO enc_reader; Query OK, 0 rows affected obclient> CREATE SENSITIVE RULE r_phone ON enc_employees(phone) USING ENCRYPTION='aes-256'; Query OK, 0 rows affected保留管理员会话,在另一个终端使用
enc_reader登录同一租户并查询。表属于SYSSchema,因此查询时指定SYS.enc_employees。$ obclient -h<host> -P<port> -uenc_reader@<tenant_name> -p --binary-as-hex--binary-as-hex使 OBClient 以十六进制显示二进制密文,避免直接显示不可打印字符。密文与密钥有关,实际值可能与本例不同。obclient> SELECT id, phone FROM SYS.enc_employees ORDER BY id; +------+------------------------------------+ | ID | PHONE | +------+------------------------------------+ | 1 | 0x48D5F55A7C163CC204D02C15917B00E6 | | 2 | 0x4AC723FA73DD69C982C8A1038E0AD489 | +------+------------------------------------+ 2 rows in setID列正常显示,PHONE列返回密文,说明未获明文访问权限的用户不能读取受保护列的明文。在
SYS会话中,为enc_reader授予r_phone的明文访问权限。obclient> GRANT PLAINACCESS ON SENSITIVE RULE r_phone TO enc_reader; Query OK, 0 rows affected退出
enc_reader的会话,使用步骤 5 的连接命令重新登录后查询。obclient> SELECT id, phone FROM SYS.enc_employees ORDER BY id; +------+-------------+ | ID | PHONE | +------+-------------+ | 1 | 13800000001 | | 2 | 13800000002 | +------+-------------+ 2 rows in setPHONE列恢复为插入时的电话号码,说明规则级明文访问授权生效。在
SYS会话中回收明文访问权限,保留登录和查询表的权限。obclient> REVOKE PLAINACCESS ON SENSITIVE RULE r_phone FROM enc_reader; Query OK, 0 rows affected退出
enc_reader的会话,使用步骤 5 的连接命令重新登录后查询。obclient> SELECT id, phone FROM SYS.enc_employees ORDER BY id; +------+------------------------------------+ | ID | PHONE | +------+------------------------------------+ | 1 | 0x48D5F55A7C163CC204D02C15917B00E6 | | 2 | 0x4AC723FA73DD69C982C8A1038E0AD489 | +------+------------------------------------+ 2 rows in set查询仍然成功,但
PHONE列再次返回密文,说明明文访问权限已回收。本示例采用重新登录的方式验证授权结果,不用于判断已有会话的权限刷新时机。
查看
| 视图名称 | 说明 |
|---|---|
| DBA_OB_SENSITIVE_RULES | 查看所有敏感规则的定义及其属性。 |
| DBA_OB_SENSITIVE_COLUMNS | 查看所有受保护的列。 |