明文和密文的轉(zhuǎn)換
使用全密態(tài)數(shù)據(jù)庫集群時,支持修改列類型(明文類型修改為密文類型,密文類型修改為明文類型)。
前提條件
已創(chuàng)建全密態(tài)數(shù)據(jù)庫,并完成相關(guān)配置。具體請參見開通全密態(tài)數(shù)據(jù)庫、定義敏感數(shù)據(jù)和客戶端使用說明。
PolarDB PostgreSQL版集群的內(nèi)核小版本大于等于20231030(14.9.14.0)。
當前用戶已獲得BCL授權(quán),具體請參見授權(quán)多用戶訪問。
語法
ALTER TABLE <table_name>
ALTER COLUMN <column_name> [SET DATA] TYPE <目標類型>
USING <類型轉(zhuǎn)換函數(shù)>(<column_name>[, <keyname>]);
密文轉(zhuǎn)換明文時,只需配置
column_name
參數(shù)。明文轉(zhuǎn)換密文時,可僅配置
column_name
參數(shù),或可同時配置column_name
和keyname
。
表 1. 類型轉(zhuǎn)換函數(shù)說明
明文類型 | 密文類型 | 明文到密文轉(zhuǎn)換函數(shù) | 密文到明文轉(zhuǎn)換函數(shù) |
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 |
使用示例
使用構(gòu)建的keyname對應(yīng)的密鑰將明文列修改為密文列。
構(gòu)建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
中的參數(shù)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 實現(xiàn)并優(yōu)化。
加密算法。
默認值:AES_128_GCM。
policy
DEFAULT
加密策略,預(yù)留參數(shù),當前固定配置為DEFAULT。
flags
RND
DET
加密方案。
RND:隨機加密。
DET:確定性加密。
默認值:RND。
mekid
目標用戶的MEK ID。
用于生成DEK的用戶主密鑰ID。
默認為當前連接用戶的主密鑰ID。
使用keyname對應(yīng)的密鑰,將明文列(例如int4)修改為對應(yīng)類型的密文列(例如enc_int4)。
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DATA TYPE enc_int4 USING encdb.enc_int4_encrypt(<column_name>, <keyname>);
使用當前數(shù)據(jù)庫默認密鑰將明文列修改為密文列。
說明當前數(shù)據(jù)庫默認密鑰的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>);