列加密

PolarDB支持为指定列进行加密存储,并且访问数据时,可使用解密函数获取原始数据,提高您的数据安全性。

说明

列加密功能当前处于灰度发布阶段,相关参数暂时不可见。如有需求,请前往配额中心,根据配额IDpolardb_mysql_column_encryption找到配额名称,在对应的操作列单击申请来开通该功能。

版本要求

目前仅支持PolarDB MySQL8.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指定加密列。

  1. 指定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值不加密。

  2. 可以通过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.密钥管理

  1. 授权PolarDB访问KMS

  2. 开启TDE功能。

    重要
    • 启用TDE加密会导致PolarDB集群重启,请谨慎操作。

    • TDE开通后将无法关闭。

    • 开启TDE功能本身不会对非TDE表或非列加密表引入额外的性能损耗。

    1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

    2. 在左侧导航栏单击配置与管理 安全管理

    3. TDE配置页签,打开TDE状态开关,并使用自定义密钥。

      说明

      KMS执行密钥删除操作前,必须确认该密钥已解除所有加密表关联依赖关系(包括历史版本关联)。否则,可能造成PolarDB集群重启后不可用。

      image.png

  3. 选择密钥。

    说明

    您可选择使用已有自定义密钥或选择在弹出窗口中选择密钥(密钥可以由KMS服务生成)。

    image.png

  4. (可选)密钥轮转。

    说明
    • PolarDB并不会更新自定义密钥的主密钥版本,您可以手动更新密钥版本,具体操作请参考密钥轮转

    • 密钥轮转后,新建加密表会采用新的密钥进行加密,原有加密表中的数据不发生任何变化仍保持原密钥加密。

    • 数据轮转是将表中数据解密后再用最新版本密钥进行加密,因此需注意其会消耗一定的CPU、IO资源。数据轮转并不是强制的,但是需要保证数据表所用密钥的可用性。

    • 数据轮转是否锁表

    对于原加密表,如果需要采用新密钥加密,需要您自行下发数据轮转指令,指令如下:

    ALTER TABLE <table_name> engine = innodb,algorithm=copy;
  5. 查询表密钥。

    可以通过如下的SQL查询系统中所有加密表的密钥使用情况。

    SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;

3. 参数设置

通过loose_polar_enable_column_encryption参数开启列加密功能,具体操作请参见设置集群参数和节点参数。参数说明如下:

参数

说明

loose_polar_enable_column_encryption

控制是否开启列加密功能。取值范围如下:

  • ON:开启列加密功能。

  • OFF(默认):关闭列加密功能。

4.(可选)开启Online Copy功能

在使用Copy DDL语法进行数据轮转时(如跨引擎修改表定义、调整列属性或进行普通表与分区表之间的转换),系统默认会锁定表,可能导致业务阻塞。为解决这一问题,可开启Online Copy优化功能,实现无锁或最小化锁影响的表结构变更。具体开关配置如下:

参数

说明

loose_polar_support_online_copy_ddl_algorithm

Online Copy DDL总开关,取值范围如下:

  • ON:开启Online Copy DDL功能。

  • OFF(默认):关闭Online Copy DDL功能。

loose_polar_support_online_copy_ddl_algorithm_for_modify

数据轮转可以使用Modify语句,需设置此参数,取值范围如下:

  • ON:开启Modify Column语句的Online功能。

  • OFF(默认):关闭Modify Column语句的Online功能。