使用全密态数据库实例时,支持修改列类型(明文类型修改为密文类型,密文类型修改为明文类型)。
前提条件
已开通全密态数据库。具体操作,请参见开通全密态数据库。
说明RDS PostgreSQL实例的内核小版本大于等于20230830,如需升级内核小版本,请参见升级内核小版本。
已使用EncDB SDK的方式,完成了一次数据库连接。具体操作,请参见EncDB SDK客户端使用说明。
当前用户已获得BCL授权。具体操作,请参见明文和密文转换BCL授权。
语法
ALTER TABLE <table_name>
ALTER COLUMN <column_name> [SET DATA] TYPE <目标类型>
USING <类型转换函数>(<column_name>[, <keyname>]);
密文转换明文时,只需配置
column_name
参数。明文转换密文时,可仅配置
column_name
参数,或可同时配置column_name
和keyname
。
表 1. 类型转换函数说明
明文类型 | 密文类型 | 明文到密文转换函数 | 密文到明文转换函数 |
int4 | enc_int4 | encdb.enc_int4_encrypt | encdb.decrypt |
int8 | enc_int8 | encdb.enc_int8_encrypt | encdb.decrypt |
float4 | enc_float4 | encdb.enc_float4_encrypt | encdb.decrypt |
float8 | enc_float8 | encdb.enc_float8_encrypt | encdb.decrypt |
numeric | enc_decimal | encdb.enc_decimal_encrypt | encdb.decrypt |
text | enc_text | encdb.enc_text_encrypt | encdb.decrypt |
timestamp | enc_timestamp | encdb.enc_timestamp_encrypt | encdb.decrypt |
使用示例
使用构建的keyname对应的密钥将明文列修改为密文列。
构建keyname。
SELECT encdb.keyname_generate('<user_name>', '<database_name>', '<schema_name>', '<table_name>', '<column_name>');
为keyname生成密钥。
SELECT encdb.dek_generate('<keyname>'[, '<json_params>']);
encdb.dek_generate
中的参数json_params
可选,使用标准JSON格式,可配置的键值对范围如下:键
值
说明
algorithm
AES_128_GCM
AES_128_ECB
AES_128_CTR
AES_128_CBC
SM4_128_CBC
SM4_128_ECB
SM4_128_CTR
CLWW_ORE
说明保序加密,基于论文 Practical Order-Revealing Encryption with Limited Leakage 实现并优化。
加密算法。
默认值:AES_128_GCM。
policy
DEFAULT
加密策略,预留参数,当前固定配置为DEFAULT。
flags
RND
DET
加密方案。
RND:随机加密。
DET:确定性加密。
默认值:RND。
mekid
目标用户的MEK ID。
用于生成DEK的用户主密钥ID。
默认为当前连接用户的主密钥ID。
使用keyname对应的密钥,将明文列(例如int4)修改为对应类型的密文列(例如enc_int4)。
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE enc_int4 USING encdb.enc_int4_encrypt(<column_name>, '<keyname>');
使用当前数据库默认密钥将明文列修改为密文列。
说明当前数据库默认密钥的keyname为
|<user>|<database>|
。ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE enc_int4 USING encdb.enc_int4_encrypt(<column_name>);
将密文列修改为明文列。
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE int4 USING encdb.decrypt(<column_name>, '<keyname>');