使用全密態數據庫集群時,支持修改列類型(明文類型修改為密文類型,密文類型修改為明文類型)。
前提條件
語法
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>);