Перейти к основному содержимому

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

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

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

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

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

Функции

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

ФункцияВходные аргументыВозвращаемое значениеОписание
digestdata text, type text;
data bytea, type text
byteaВычисляет двоичный хеш данных data;
type - используемый алгоритм:
- md5;
- sha1;
- sha224;
- sha256;
- sha384;
- sha512
hmacdata 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();

АлгоритмМаксимальная длина пароляАдаптивныйРазмер соли (бит)Размер результатаОписание
bf72да12860На базе Blowfish, вариация 2a
md5без ограниченийнет4834На базе MD5
xdes8да2420Расширенный DES
des8нет1213Изначальный алгоритм UNIX
ФункцияВходные аргументыВозвращаемое значениеОписание
cryptpassword text, salt texttextВычисляет хеш пароля (password) в стиле crypt(3). Для сохранения нового пароля необходимо вызвать gen_salt(), чтобы сгенерировать новое значение соли (salt). Для проверки пароля нужно передать сохраненное значение хеша в параметре salt и проверить, соответствует ли результат сохраненному значению
gen_salttype 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_bytescount integerbyteaВозвращает криптографически стойкие случайные байты в количестве count. За один вызов можно получить максимум 1024 байт. Это ограничение предотвращает исчерпание пула энтропии
gen_random_uuiduuidВозвращает рандомный 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