PolarDB支持为指定列进行加密存储,并且访问数据时,可使用解密函数获取原始数据,提高您的数据安全性。
列加密功能当前处于灰度发布阶段,相关参数暂时不可见。如有需求,请前往配额中心,根据配额IDpolardb_mysql_column_encryption
找到配额名称,在对应的操作列单击申请来开通该功能。
版本要求
目前仅支持PolarDB MySQL版8.0.2版本且小版本为8.0.2.2.30及以上。
背景信息
在旧版本中,PolarDB MySQL版通过加密函数 (aes_encrypt
) 等实现字段级别的数据加密。然而,使用加密函数需要客户端管理密钥、轮转密钥以及访问权限控制等。为此,PolarDB MySQL版列加密功能将这些操作整合到数据库服务端。您只需为需要加密的列设置加密属性,即可实现上述功能。此外,列加密通过Online DDL实现了非阻塞的密钥轮转。
注意事项
性能损耗
写性能
使用列加密功能会造成性能损耗,在关闭Binlog,单线程插入时会产生约3%的性能损耗。值得注意是,当开启Binlog或表结构具有较大行宽时,由于系统I/O模式和资源分配的变化,损耗会更低。
读性能:
读性能损耗取决于是否在查询语句中使用解密函数,单个SQL语句中使用一次解密函数的性能影响在6%左右。
索引使用
仅支持单点查询使用索引结构实现高效检索,而范围查询(Range Query)(如WHERE age>20
)、模式匹配查询(如LIKE '%key%'
)等操作不支持使用索引但可使用全表扫描(Full Table Scan)。
表属性限制
不支持对含有虚拟列的表加密。
仅支持存储引擎为InnoDB的表。
不支持分区表。
指定加密属性的列必须是
varbinary
类型。字段的长度不低于44 Byte(字节)。
暂时无法直接新增加密列,必须通过修改普通列完成。
使用说明
列加密与TDE功能共同使用KMS(密钥管理服务)进行密钥管理。
1. 语法说明(权限控制、DDL、DML)
权限控制
使用列加密功能需要您的数据库账号具备ENCRYPTION_FUN_ADMIN权限,可以由高权限账号授予。
权限授予:GRANT ENCRYPTION_FUN_ADMIN ON *.* TO 'testman'@'%';
权限查看:SHOW GRANTS;
DDL
创建加密列
通过关键字ENCRYPTION指定加密列。
指定pan列为加密列。
USE mydatabase; CREATE TABLE IF NOT EXISTS `my_pan` ( `id` INT NOT NULL AUTO_INCREMENT, `pan` VARBINARY(128) NOT NULL ENCRYPTION, `desc` blob Default NULL, KEY `idx_pan` (`pan`), PRIMARY KEY (`id`) );
说明可以创建默认值为NULL的加密列,但NULL值不加密。
可以通过Modify语句将普通列修改为加密列或者把加密列修改为普通列。
ALTER TABLE my_pan modify `pan` VARBINARY(128) ENCRYPTION; ALTER TABLE my_pan modify `pan` VARBINARY(128) NOT ENCRYPTION;
说明暂不支持直接新增加密列,必须通过Modify语句修改普通列完成。
构建索引
加密列也可以构建索引,语法不变,例如:
CREATE index idx_pan ON my_pan(pan);
索引上数据为加密数据,索引本身按照加密值的顺序排序。
DML
以下是对两个加密解密函数说明:
-- 加密函数
enhanced_aes_encrypt(data, db_name, table_name)
-- 解密函数
enhanced_aes_decrypt(data)
插入数据
向加密列插入数据将直接加密,无需使用加密函数enhanced_aes_encrypt。
INSERT INTO `my_pan` VALUES(1,"my_passwd", "aaa");
查询
# 1. 无索引点查(范围查询)
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE enhanced_aes_decrypt(pan) = 'my_password_10';
# 2. select使用索引点查,查出后的数据为明文
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
# 3. select使用索引点查,查出后的数据为密文
SELECT id, pan FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
更新数据
# 通过主键索引更新数据
UPDATE `my_pan` SET pan='new6-password', DESC='Senior6' WHERE id = 1;
# 通过加密列索引更新数据
UPDATE `my_pan` SET pan='new6-password', DESC='Senior6' WHERE pan=enhanced_aes_encrypt('my_password_6', "mydatabase", "my_pan");
删除数据
# 通过主键索引删除数据
DELETE FROM `my_pan` WHERE id = 1;
# 通过加密列索引删除数据
DELETE FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_2', "mydatabase", "my_pan");
2.密钥管理
开启TDE功能。
重要启用TDE加密会导致PolarDB集群重启,请谨慎操作。
TDE开通后将无法关闭。
开启TDE功能本身不会对非TDE表或非列加密表引入额外的性能损耗。
登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。
在左侧导航栏单击配置与管理 > 安全管理。
在TDE配置页签,打开TDE状态开关,并使用自定义密钥。
说明在KMS执行密钥删除操作前,必须确认该密钥已解除所有加密表关联依赖关系(包括历史版本关联)。否则,可能造成PolarDB集群重启后不可用。
选择密钥。
说明您可选择使用已有自定义密钥或选择在弹出窗口中选择密钥(密钥可以由KMS服务生成)。
(可选)密钥轮转。
说明PolarDB并不会更新自定义密钥的主密钥版本,您可以手动更新密钥版本,具体操作请参考密钥轮转。
密钥轮转后,新建加密表会采用新的密钥进行加密,原有加密表中的数据不发生任何变化仍保持原密钥加密。
数据轮转是将表中数据解密后再用最新版本密钥进行加密,因此需注意其会消耗一定的CPU、IO资源。数据轮转并不是强制的,但是需要保证数据表所用密钥的可用性。
数据轮转是否锁表
未开启Online Copy功能,数据轮转过程中会锁表。
开启Online Copy DDL功能后数据轮转过程不会发生锁表,允许DML并发执行,不允许DDL并发执行。
对于原加密表,如果需要采用新密钥加密,需要您自行下发数据轮转指令,指令如下:
ALTER TABLE <table_name> engine = innodb,algorithm=copy;
查询表密钥。
可以通过如下的SQL查询系统中所有加密表的密钥使用情况。
SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;
3. 参数设置
通过loose_polar_enable_column_encryption参数开启列加密功能,具体操作请参见设置集群参数和节点参数。参数说明如下:
参数 | 说明 |
loose_polar_enable_column_encryption | 控制是否开启列加密功能。取值范围如下:
|
4.(可选)开启Online Copy功能
在使用Copy DDL语法进行数据轮转时(如跨引擎修改表定义、调整列属性或进行普通表与分区表之间的转换),系统默认会锁定表,可能导致业务阻塞。为解决这一问题,可开启Online Copy优化功能,实现无锁或最小化锁影响的表结构变更。具体开关配置如下:
参数 | 说明 |
loose_polar_support_online_copy_ddl_algorithm | Online Copy DDL总开关,取值范围如下:
|
loose_polar_support_online_copy_ddl_algorithm_for_modify | 数据轮转可以使用Modify语句,需设置此参数,取值范围如下:
|