使用全密態資料庫執行個體時,支援修改列類型(明文類型修改為密文類型,密文類型修改為明文類型)。
前提條件
已開通全密態資料庫。具體操作,請參見開通全密態資料庫。
說明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>');