Шифрование данных в PostgreSQL
Шифрование данных в PostgreSQL
Чтобы шифровать данные в PostgreSQL, можно добавить расширение pgcrypto. Это расширение предоставляет набор криптографических функций для защиты данных с помощью:
- стандартного хеширования данных — digest(), hmac();
- хеширования паролей — crypt(), gen_salt();
- симметричных и открытых ключей (шифруют данные по стандарту OpenPGP) — pgp_sym_encrypt(), pgp_sym_decrypt(), pgp_pub_encrypt(), pgp_pub_decrypt(), armor(), dearmor();
- шифрования низкого уровня — encrypt(), decrypt();
- получения случайных данных — gen_random_bytes(), gen_random_uuid().
При использовании расширения pgcrypto учтите ограничения безопасности.
Посмотрите примеры шифрования данных с помощью расширения pgcrypto.
Подробнее о расширении pgcrypto и его функциях в статье pgcrypto — cryptographic functions документации PostgreSQL.
Ограничения безопасности расширения pgcrypto
- данные и пароли передаются между функциями pgcrypto и клиентскими приложениями открытым текстом, поэтому рекомендуем подключаться к кластеру баз данных с SSL;
- защита данных с помощью расширения pgcrypto уязвима для атак по сторонним каналам. Например, длительность расшифровки текстов одинакового размера может различаться.
Примеры шифрования данных с помощью расширения pgcrypto
Хеширование пароля
-
Создайте таблицу:
CREATE TABLE tbl_hash_pwd(username varchar(100) PRIMARY KEY, cryptpwd text);
-
Вставьте данные в таблицу и зашифруйте их:
INSERT INTO tbl_hash_pwd(username, cryptpwd)
VALUES ('username_1', crypt('Password_1', gen_salt('md5'))); -
Проверьте, что данные зашифрованы:
SELECT * FROM tbl_hash_pwd;
-
Убедитесь, что в зашифрованных данных хранится текст, который вы зашифровали на шаге 2.
SELECT username FROM tbl_hash_pwd
WHERE cryptpwd = crypt('Password_1', cryptpwd);
PGP-шифрование с симметричным ключом
-
Создайте таблицу:
CREATE TABLE tbl_crypt_sym_key (id SERIAL PRIMARY KEY, data text);