Syntax

Encrypting columns in a new table

CREATE TABLE <table name>  (
     <column_name> <data_type> ENCRYPT,
     <column_name> <data_type> NULL ENCRYPT,
             <column_name> <data_type> NOT NULL ENCRYPT
             );

Adding an encrypted column to an existing table

ALTER TABLE <table_name> ADD COLUMN <column_name> <data_type> ENCRYPT;

Encryption methods

ENCRYPT ( <column name to encrypt> , <Secret Key of exactly 256-bit (32-byte) length> )

Decryption method

DECRYPT ( <column name to decrypt> , <Secret Key of exactly 256-bit (32-byte) length> )

Examples

Encrypting a new table

CREATE TABLE client_name  (
     id BIGINT NOT NULL ENCRYPT,
     first_name TEXT ENCRYPT,
     last_name TEXT,
     salary INT ENCRYPT);

Inserting encrypt player salary (INT data type)

INSERT INTO NBA (player_name, team_name, jersey_number, position, age, height, weight, college, salary)
VALUES ('Jayson Christopher Tatum', 'Boston Celtics', 0, 'SF', 25, '6-8', 210 , 'Duke', ENCRYPT ( 32600060 , '6a8431f6e9c2777ee356c0b8aa3c12c0c63bdf366ac3342c4c9184b51697b47f');

Similar example using COPY FROM

COPY NBA
(
player_name, team_name, jersey_number, position, age, height, weight, college,
ENCRYPT (salary, '6a8431f6e9c2777ee356c0b8aa3c12c0c63bdf366ac3342c4c9184b51697b47f')
)
FROM WRAPPER csv_fdw
OPTIONS
(location = '/tmp/source_file.csv', quote='@');

Query the encrypted data

SELECT player_name, DECRYPT( salary, '6a8431f6e9c2777ee356c0b8aa3c12c0c63bdf366ac3342c4c9184b51697b47f') FROM NBA
WHERE player_name ='Jayson Christopher Tatum';

player_name             |salary    |
------------------------+----------+
Jayson Christopher Tatum|1500000   |

Query the encrypted data using WHERE clause on an encrypted column

SELECT player_name, DECRYPT( salary, '6a8431f6e9c2777ee356c0b8aa3c12c0c63bdf366ac3342c4c9184b51697b47f')
FROM NBA
WHERE DECRYPT( salary, '6a8431f6e9c2777ee356c0b8aa3c12c0c63bdf366ac3342c4c9184b51697b47f') > 1000000;

player_name             |salary    |
------------------------+----------+
Jayson Christopher Tatum|1500000   |
------------------------+----------+
Marcus Smart            |1350000   |

Example of COPY TO using DECRYPT

COPY
  (SELECT player_name, DECRYPT( salary, '6a8431f6e9c2777ee356c0b8aa3c12c0c63bdf366ac3342c4c9184b51697b47f')
  FROM NBA
  WHERE player_name ='Jayson Christopher Tatum')
TO WRAPPER parquet_fdw
OPTIONS (LOCATION = '/tmp/file.parquet');

Limitations

  • The following functionality is not supported by the encryption feature: Catalog queries, Utility commands, Foreign Tables, Create AS SELECT.

  • A single encryption key must be used per column - using a different key would result in an error.

  • Compression of encrypted columns is limited to the following types: Flat, LZ4, PD4, DICT, RLE.

  • This feature is not backward compatible with previous versions of SQreamDB.

  • The encryption feature affect performance and compression.

Permissions

The Data Encryption feature does not require a specific permission, users with relevant TABLE and COLUMN permissions may utilize it.