pgcrypto. Криптографические функции для PostgreSQL#

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Расширение pgcrypto предоставляет криптографические функции для PostgreSQL.

Функции#

Стандартные функции хеширования#

Функция

Входные аргументы

Возвращаемое значение

Описание

digest

data text, type text;
data bytea, type text

bytea

Вычисляет двоичный хеш данных data;
type - используемый алгоритм:
- md5;
- sha1;
- sha224;
- sha256;
- sha384;
- sha512

hmac

data text, key text, type text;
data bytea, key bytea, type text

bytea

Вычисляет имитовставку на основе хеша для данных data с ключом key;
функция похожа на digest, но вычислить хеш с ней можно, только зная ключ; это защищает от сценария подмены данных и хеша вместе с ними; если размер ключа больше размера блока хеша, он сначала хешируется, а затем используется в качестве ключа хеширования данных;
type - используемый алгоритм:
- md5;
- sha1;
- sha224;
- sha256;
- sha384;
- sha512

Функции хеширования пароля#

Функции crypt() и gen_salt() разработаны специально для хеширования паролей:

  • crypt() выполняет хеширование;

  • gen_salt() подготавливает параметры алгоритма для нее.

Алгоритмы в crypt() отличаются от обычных алгоритмов хеширования MD5 и SHA1 в следующих аспектах:

  1. Алгоритмы в crypt() медленные. Так как объем данных невелик, это единственный способ усложнить перебор паролей;

  2. Алгоритмы в crypt() используют случайное значение, называемое солью, чтобы у пользователей с одинаковыми паролями зашифрованные пароли оказывались разными. Это также обеспечивает дополнительную защиту от получения обратного алгоритма;

  3. Алгоритмы в crypt() включают в результат тип алгоритма, что допускает сосуществование паролей, хешированных разными алгоритмами;

  4. Некоторые из алгоритмов являются адаптируемыми — с ростом производительности компьютеров эти алгоритмы можно настроить так, чтобы они стали медленнее, при этом сохраняя совместимость с существующими паролями.

Алгоритмы, которые поддерживает crypt();

Алгоритм

Максимальная длина пароля

Адаптивный

Размер соли (бит)

Размер результата

Описание

bf

72

да

128

60

На базе Blowfish, вариация 2a

md5

без ограничений

нет

48

34

На базе MD5

xdes

8

да

24

20

Расширенный DES

des

8

нет

12

13

Изначальный алгоритм UNIX

Функция

Входные аргументы

Возвращаемое значение

Описание

crypt

password text, salt text

text

Вычисляет хеш пароля (password) в стиле crypt(3). Для сохранения нового пароля необходимо вызвать gen_salt(), чтобы сгенерировать новое значение соли (salt). Для проверки пароля нужно передать сохраненное значение хеша в параметре salt и проверить, соответствует ли результат сохраненному значению

gen_salt

type text [, iter_count integer ]

text

Вычисляет новое случайное значение соли для функции crypt(). Строка соли также указывает crypt(), какой алгоритм использовать
type - используемый алгоритм хеширования:
- des;
- xdes;
- md5;
- bf
iter_count – счетчик итераций для алгоритма (необязательный параметр), который его принимает. Чем больше это число, тем больше времени будет затрачено на вычисление хеша пароля

Подробное описание алгоритмов хеширования в документации: https://www.postgresql.org/docs/15/pgcrypto.html#id-1.11.7.37.8.

Функции шифрования на базе PGP#

Функции шифрования, реализующие часть стандарта OpenPGP (RFC 4880), поддерживают шифрование как с симметричным, так и с закрытым ключом.

Подробное описание и параметры настроек функций шифрования на базе PGP в документации: https://www.postgresql.org/docs/15/pgcrypto.html#id-1.11.7.37.9

Низкоуровневые функции шифрования#

Низкоуровневые функции шифрования выполняют только шифрование данных и не предоставляют расширенные возможности шифрования PGP.

С появлением поддержки шифрования PGP использовать низкоуровневые функции шифрования не рекомендуется, поскольку существуют следующие недостатки их использования:

  1. Используют ключ пользователя непосредственно в качестве ключа шифрования;

  2. Не обеспечивают проверку целостности, которая должна выявлять модификацию зашифрованных данных;

  3. Рассчитаны на то, что пользователи будут управлять всеми параметрами шифрования самостоятельно, даже вектором инициализации;

  4. Не рассчитаны на текст.

Подробности использования низкоуровневых функций шифрования в документации PostgreSQL, раздел «pgcrypto» подраздел «Функции шифрования в сыром виде».

Функции получения случайных данных#

Функция

Входные аргументы

Возвращаемое значение

Описание

gen_random_bytes

count integer

bytea

Возвращает криптографически стойкие случайные байты в количестве count. За один вызов можно получить максимум 1024 байт. Это ограничение предотвращает исчерпание пула энтропии

gen_random_uuid

uuid

Возвращает рандомный UUID версии 4

Замечания#

Модуль pgcrypto настраивается согласно установкам, полученным в главном скрипте configure PostgreSQL. На его конфигурацию влияют аргументы --with-zlib и --with-openssl.

При компиляции с zlib шифрующие функции PGP могут сжимать данные перед шифрованием.

При компиляции с OpenSSL будут доступны дополнительные алгоритмы. Кроме того, функции шифрования с открытым ключом будут быстрее, так как OpenSSL содержит оптимизированные функции для работы с большими числами (BIGNUM).

Чтобы использовать устаревшие алгоритмы шифрования, такие как DES или Blowfish, при компиляции с OpenSSL версии 3.0.0 и выше, в файле конфигурации openssl.cnf должны быть активированы поставщики этих алгоритмов.

Внимание!

  1. Автоматически выбирается любой алгоритм хеширования, который поддерживает OpenSSL, шифры же должны поддерживаться явно.

  2. В соответствии со стандартом SQL функции возвращают NULL, если один из аргументов NULL. Важно иметь в виду, что это может угрожать безопасности.

Доработка#

Доработка не проводилась.

Ограничения#

Все функции расширения pgcrypto выполняются внутри сервера баз данных. Это означает, что все данные и пароли передаются между функциями pgcrypto и клиентскими приложениями открытым текстом. Для повышения уровня безопасности необходимо:

  1. Подключаться локально или использовать подключения SSL;

  2. Доверять системе и администратору баз данных.

Если это невозможно, лучше произвести шифрование в клиентском приложении.

Установка#

Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право CREATE в текущей базе данных:

CREATE EXTENSION pgcrypto SCHEMA ext;

Настройка#

Настройка не требуется.

Использование модуля#

SELECT digest('Text', 'sha256');
                               digest                               
--------------------------------------------------------------------
 \x71988c4d8e0803ba4519f0b2864c1331c14a1890bf8694e251379177bfedb5c3
(1 row)

Если нужно получить digest в виде шестнадцатеричной строки, примените encode() к результату, например:

CREATE OR REPLACE FUNCTION sha1(bytea) returns text AS $$
    SELECT encode(digest($1, 'sha1'), 'hex')
$$ LANGUAGE SQL STRICT IMMUTABLE;
SELECT encode(digest('Text', 'sha1'), 'hex');

Пример результата выполнения запроса:

                  encode                  
------------------------------------------
 {хеш}
(1 row)

Пример установки нового пароля:

UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));

Пример проверки пароля:

SELECT (pswhash = crypt('entered password', pswhash)) AS pswmatch FROM ... ;

Этот запрос возвращает true, если введенный пароль правильный.

Ссылки на документацию разработчика#

Исходная документация PosgreSQL по модулю pgcrypto: https://www.postgresql.org/docs/15/pgcrypto.html