Использование pgcrypto в Managed Service for PostgreSQL
Расширение pgcrypto
Установить расширение pgcrypto в кластер PostgreSQL
Добавьте расширение pgcrypto
к базе данных.
Важно
Установка расширения pgcrypto
приведет к последовательной перезагрузке PostgreSQL на всех хостах кластера.
Подробнее о расширении pgcrypto
см. в официальной документации
Примеры использования
Однонаправленное шифрование
-
Создайте таблицу:
CREATE TABLE tbl_one_way_crypt(username varchar(100) PRIMARY KEY, cryptpwd text);
-
Вставьте данные с хешированным текстом в столбце
cryptpwd
:INSERT INTO tbl_one_way_crypt(username, cryptpwd) VALUES ('bob', crypt('Password123', gen_salt('md5'))), ('alice', crypt('Password123', gen_salt('md5')));
-
Проверьте, что данные в столбце
cryptpwd
зашифрованы:SELECT * FROM tbl_one_way_crypt;
-
Проверьте, что в зашифрованных данных хранится текст
Password123
:SELECT username FROM tbl_one_way_crypt WHERE cryptpwd = crypt('Password123', cryptpwd);
Симметричное шифрование
-
Создайте таблицу:
CREATE TABLE tbl_sym_crypt (username varchar(100) PRIMARY KEY, crypttext text);
-
Вставьте данные с зашифрованным текстом в столбце
crypttext
:INSERT INTO tbl_sym_crypt (username, crypttext) VALUES ('bob', pgp_sym_encrypt('Text to encrypt','!qazSymKeyXsw2')), ('alice', pgp_sym_encrypt('Secret Data','!qazSymKeyXsw2'));
-
Проверьте, что данные в столбце
crypttext
зашифрованы:SELECT * FROM tbl_sym_crypt;
-
Получите расшифрованные данные, явно указав тип данных
bytea
:SELECT username, pgp_sym_decrypt(crypttext::bytea, '!qazSymKeyXsw2') FROM tbl_sym_crypt;
Ассиметричное шифрование
-
Подготовьте пару ключей с помощью утилиты GnuPG
:-
Создайте пару ключей:
gpg --gen-key
Укажите
USER-ID
ключа (Real name
иEmail address
) иPassphrase
. -
Экспортируйте ключи в файлы:
gpg -a --export <Real_name_ключа> > public.key && \ gpg -a --export-secret-keys <Real_name_ключа> > private.key
-
-
Создайте таблицу:
CREATE TABLE tbl_asym_crypt(ssn_id SERIAL PRIMARY KEY, username varchar(100), ssn bytea);
-
Вставьте данные с зашифрованным текстом в столбце
ssn
с помощью публичного ключа:INSERT INTO tbl_asym_crypt (username, ssn) SELECT tmp.username, pgp_pub_encrypt(tmp.ssn, keys.pubkey) AS tbl FROM ( VALUES ('Alice', '123-45-6788'), ('Bob', '123-45-6799')) AS tmp(username, ssn) CROSS JOIN (SELECT dearmor('<содержимое_файла_public.key>') AS pubkey) AS keys;
-
Проверьте, что данные с столбце
ssn
зашифрованы:SELECT * FROM tbl_asym_crypt;
-
Расшифруйте данные в столбце
ssn
с помощью закрытого ключа:SELECT username, pgp_pub_decrypt(ssn, keys.privkey, '<Passphrase_ключа>') AS decrypted_ssn FROM tbl_asym_crypt CROSS JOIN (SELECT dearmor('<содержимое_файла_private.key>') AS privkey) AS keys;