使用Intel SGX 安全增强型规格的数据库实例时,支持修改列类型(明文类型修改为密文类型,密文类型修改为明文类型)。
前提条件
- 已创建Intel SGX 安全增强型的RDS PostgreSQL实例,并完成全加密数据库的相关配置。具体请参见配置步骤(安全增强型实例)。
- 当前用户已获得BCL授权,具体请参见授权多用户访问。
- RDS PostgreSQL实例的内核小版本大于等于20220830,如需升级内核小版本,请参见升级内核小版本。
语法
ALTER TABLE <table_name>
ALTER COLUMN <column_name> [SET DATA] TYPE <目标类型>
USING <类型转换函数>(<column_name>[, <keyname>]);
说明
- 密文转换明文时,只需配置
column_name
参数。 - 明文转换密文时,可仅配置
column_name
参数,或可同时配置column_name
和keyname
。
明文类型 | 密文类型 | 明文到密文转换函数 | 密文到明文转换函数 |
---|---|---|---|
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。
- 使用当前数据库默认密钥将明文列修改为密文列。
说明 当前数据库默认密钥的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>);