pgcrypto. Криптографические функции для PostgreSQL#
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext.
Расширение pgcrypto предоставляет криптографические функции для PostgreSQL.
Функции#
Стандартные функции хеширования#
Функция |
Входные аргументы |
Возвращаемое значение |
Описание |
|---|---|---|---|
|
|
|
Вычисляет двоичный хеш данных |
|
|
|
Вычисляет имитовставку на основе хеша для данных |
Функции хеширования пароля#
Функции crypt() и gen_salt() разработаны специально для хеширования паролей:
crypt()выполняет хеширование;gen_salt()подготавливает параметры алгоритма для нее.
Алгоритмы в crypt() отличаются от обычных алгоритмов хеширования MD5 и SHA1 в следующих аспектах:
Алгоритмы в
crypt()медленные. Так как объем данных невелик, это единственный способ усложнить перебор паролей;Алгоритмы в
crypt()используют случайное значение, называемое солью, чтобы у пользователей с одинаковыми паролями зашифрованные пароли оказывались разными. Это также обеспечивает дополнительную защиту от получения обратного алгоритма;Алгоритмы в
crypt()включают в результат тип алгоритма, что допускает сосуществование паролей, хешированных разными алгоритмами;Некоторые из алгоритмов являются адаптируемыми — с ростом производительности компьютеров эти алгоритмы можно настроить так, чтобы они стали медленнее, при этом сохраняя совместимость с существующими паролями.
Алгоритмы, которые поддерживает crypt();
Алгоритм |
Максимальная длина пароля |
Адаптивный |
Размер соли (бит) |
Размер результата |
Описание |
|---|---|---|---|---|---|
|
72 |
да |
128 |
60 |
На базе Blowfish, вариация 2a |
|
без ограничений |
нет |
48 |
34 |
На базе MD5 |
|
8 |
да |
24 |
20 |
Расширенный DES |
|
8 |
нет |
12 |
13 |
Изначальный алгоритм UNIX |
Функция |
Входные аргументы |
Возвращаемое значение |
Описание |
|---|---|---|---|
|
|
|
Вычисляет хеш пароля ( |
|
|
|
Вычисляет новое случайное значение соли для функции crypt(). Строка соли также указывает crypt(), какой алгоритм использовать |
Подробное описание алгоритмов хеширования в документации: 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 использовать низкоуровневые функции шифрования не рекомендуется, поскольку существуют следующие недостатки их использования:
Используют ключ пользователя непосредственно в качестве ключа шифрования;
Не обеспечивают проверку целостности, которая должна выявлять модификацию зашифрованных данных;
Рассчитаны на то, что пользователи будут управлять всеми параметрами шифрования самостоятельно, даже вектором инициализации;
Не рассчитаны на текст.
Подробности использования низкоуровневых функций шифрования в документации PostgreSQL, раздел «pgcrypto» подраздел «Функции шифрования в сыром виде».
Функции получения случайных данных#
Функция |
Входные аргументы |
Возвращаемое значение |
Описание |
|---|---|---|---|
|
|
|
Возвращает криптографически стойкие случайные байты в количестве |
|
– |
|
Возвращает рандомный UUID версии 4 |
Замечания#
Модуль pgcrypto настраивается согласно установкам, полученным в главном скрипте configure PostgreSQL. На его конфигурацию влияют аргументы --with-zlib и --with-openssl.
При компиляции с zlib шифрующие функции PGP могут сжимать данные перед шифрованием.
При компиляции с OpenSSL будут доступны дополнительные алгоритмы. Кроме того, функции шифрования с открытым ключом будут быстрее, так как OpenSSL содержит оптимизированные функции для работы с большими числами (BIGNUM).
Чтобы использовать устаревшие алгоритмы шифрования, такие как DES или Blowfish, при компиляции с OpenSSL версии 3.0.0 и выше, в файле конфигурации openssl.cnf должны быть активированы поставщики этих алгоритмов.
Внимание!
Автоматически выбирается любой алгоритм хеширования, который поддерживает OpenSSL, шифры же должны поддерживаться явно.
В соответствии со стандартом SQL функции возвращают
NULL, если один из аргументовNULL. Важно иметь в виду, что это может угрожать безопасности.
Доработка#
Доработка не проводилась.
Ограничения#
Все функции расширения pgcrypto выполняются внутри сервера баз данных. Это означает, что все данные и пароли передаются между функциями pgcrypto и клиентскими приложениями открытым текстом. Для повышения уровня безопасности необходимо:
Подключаться локально или использовать подключения SSL;
Доверять системе и администратору баз данных.
Если это невозможно, лучше произвести шифрование в клиентском приложении.
Установка#
Модуль считается «доверенным», поэтому его могут устанавливать пользователи, имеющие право 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