明文和密文的转换

使用全密态数据库实例时,支持修改列类型(明文类型修改为密文类型,密文类型修改为明文类型)。

前提条件

语法

ALTER TABLE <table_name> 
    ALTER COLUMN <column_name> [SET DATA] TYPE <目标类型> 
    USING <类型转换函数>(<column_name>[, <keyname>]);
说明
  • 密文转换明文时,只需配置column_name参数。

  • 明文转换密文时,可仅配置column_name参数,或可同时配置column_namekeyname

表 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对应的密钥将明文列修改为密文列。

    1. 构建keyname。

      SELECT encdb.keyname_generate('<user_name>', '<database_name>', '<schema_name>', '<table_name>', '<column_name>');
    2. 为keyname生成密钥。

      SELECT encdb.dek_generate('<keyname>'[, '<json_params>']);

      encdb.dek_generate中的参数json_params可选,使用标准JSON格式,可配置的键值对范围如下:

      说明

      algorithm

      加密算法。

      默认值:AES_128_GCM。

      policy

      DEFAULT

      加密策略,预留参数,当前固定配置为DEFAULT。

      flags

      • RND

      • DET

      加密方案。

      • RND:随机加密。

      • DET:确定性加密。

      默认值:RND。

      mekid

      目标用户的MEK ID。

      用于生成DEK的用户主密钥ID。

      默认为当前连接用户的主密钥ID。

    3. 使用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>');

常见问题

  • Q:如何处理报错:ERROR: xxxx generate dek for keyname errno:f70a0000

    A:该错误表明未使用EncDB SDK的方式完成一次数据库连接。使用EncDB SDK的方式完成了一次数据库连接,请参见EncDB SDK客户端使用说明

  • Q:如何处理报错:ERROR: xxxx errno:fa030000 ERROR: xxxx error:fa020000

    A:该错误表明未找到“授权记录”或“拒绝访问”,其原因是未完成高危操作的授权。进行高危操作的BCL授权,请参见明文和密文转换BCL授权