首批通过分布式安全可靠测评,为关键业务系统打造
列加密概述
更新时间:2026-04-09 14:12:04
列加密功能是 OceanBase 数据库提供的一种数据保护机制,可在返回结果时根据加密规则返回密文,用于保护存储在数据库中的敏感数据。本文说明了列加密功能及原理,并给出示例。
注意
该特性从 V4.3.5 BP3 开始支持,仅适用于 MySQL 租户模式。
功能适用性
OceanBase 数据库社区版暂不支持列加密。
工作原理
数据库管理员或拥有用户级 CREATE SENSITIVE RULE 权限的用户可以在已有表上创建列级别的敏感数据保护规则。如果某一列 A 被数据保护规则 R 指定为保护列,那么当用户执行 SELECT 操作,且投影的列中包含了 A 列时,数据库会检查用户是否具有这条规则 R 上的明文访问权限:
用户持有规则
R的明文访问权限:包含 A 列的投影表达式会正常返回明文结果。用户没有规则
R明文访问权限:包含 A 列的投影表达式会按照规则描述的方式加密后再返回给用户。
数据保护规则
通过 CREATE SENSITIVE RULE 语法创建敏感规则,语法如下:
CREATE SENSITIVE RULE <rule_name>
ON <sensitive_field_list>
USING ENCRYPTION [ = <encryption_method>];
具体说明如下:
- 数据保护规则:目前支持的数据保护规则为
ENCRYPTION类型。创建规则时可以指定加密算法。 - 规则范围:每条规则可以指定保护一个或多个列,允许跨库、跨表。一个列只能被最多一条数据保护规则所保护。
- 权限要求:创建规则的用户需要同时有用户级的
CREATE SENSITIVE RULE权限,以及这些列上的完整访问权限(包括SELECT、INSERT、UPDATE、REFERENCE权限)。创建规则的用户自动拥有这条规则的明文访问权限。
权限机制
- 用户级明文访问权限:如果某用户拥有用户级的明文访问权限,则该用户不会受到数据保护规则的影响,可以访问明文数据。
- 规则级明文访问权限:如果某用户拥有某条规则上的明文访问权限,则该用户不会受到这条规则的影响,可以明文访问被这条规则保护的数据。
- 无权限用户:如果用户没有用户级的明文访问权限,也没有某条规则上的明文访问权限,那么当该用户查询这条规则所保护的列时,只能看到加密后的数据。
与函数加密的区别
ENHANCED_AES_ENCRYPT 函数是 OceanBase 数据库中的一种 AES 加密方式。
| 特性 | 列加密功能 | ENHANCED_AES_ENCRYPT 函数 |
|---|---|---|
| 使用方式 | 通过 DDL 配置规则 | 在 SQL 语句中手动调用 |
| 权限控制 | 基于规则的细粒度权限 | 需要 ENCRYPT 权限 |
| 查询体验 | 根据权限自动返回明文/密文 | 始终返回密文,需手动解密 |
| 索引支持 | 支持加密列索引 | 支持,但需要特殊处理 |
| 应用兼容性 | 完全兼容现有应用 | 需要修改应用代码 |