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да12860На базе Blowfish, вариация 2a
md5
без ограниченийнет4834На базе MD5
xdes
8да2420Расширенный DES
des
8нет1213Изначальный алгоритм UNIX
ФункцияВходные аргументыВозвращаемое значениеОписание
crypt
password text, salt texttextВычисляет хеш пароля (password) в стиле crypt(3). Для сохранения нового пароля необходимо вызвать gen_salt(), чтобы сгенерировать новое значение соли (salt). Для проверки пароля нужно передать сохраненное значение хеша в параметре salt и проверить, соответствует ли результат сохраненному значению
gen_salt
type text [, iter_count integer ]textВычисляет новое случайное значение соли для функции crypt(). Строка соли также указывает crypt(), какой алгоритм использовать
type - используемый алгоритм хеширования:
- des;
- xdes;
- md5;
- bf
iter_count – счетчик итераций для алгоритма (необязательный параметр), который его принимает. Чем больше это число, тем больше времени будет затрачено на вычисление хеша пароля
Функции шифрования, реализующие часть стандарта OpenPGP (RFC 4880), поддерживают шифрование как с симметричным, так и с закрытым ключом.
Низкоуровневые функции шифрования выполняют только шифрование данных и не предоставляют расширенные возможности шифрования PGP. С появлением поддержки шифрования PGP использовать низкоуровневые функции шифрования не рекомендуется, поскольку существуют следующие недостатки их использования:
  1. Используют ключ пользователя непосредственно в качестве ключа шифрования.
  2. Не обеспечивают проверку целостности, которая должна выявлять модификацию зашифрованных данных.
  3. Рассчитаны на то, что пользователи будут управлять всеми параметрами шифрования самостоятельно, даже вектором инициализации.
  4. Не рассчитаны на текст.
Функции получения случайных данных:
ФункцияВходные аргументыВозвращаемое значениеОписание
gen_random_bytes
count integerbyteaВозвращает криптографически стойкие случайные байты в количестве count. За один вызов можно получить максимум 1024 байт. Это ограничение предотвращает исчерпание пула энтропии
gen_random_uuid
uuidВозвращает рандомный UUID версии 4
Замечания:
  1. Модуль pgcrypto настраивается согласно установкам, полученным в главном скрипте configure PostgreSQL. На его конфигурацию влияют аргументы --with-zlib и --with-openssl.
  2. При компиляции с zlib шифрующие функции PGP могут сжимать данные перед шифрованием.
  3. При компиляции с OpenSSL будут доступны дополнительные алгоритмы. Кроме того, функции шифрования с открытым ключом будут быстрее, так как OpenSSL содержит оптимизированные функции для работы с большими числами (BIGNUM).
  4. Чтобы использовать устаревшие алгоритмы шифрования, такие как DES или Blowfish, при компиляции с OpenSSL версии 3.0.0 и выше, в файле конфигурации openssl.cnf должны быть активированы поставщики этих алгоритмов.
  5. Автоматически выбирается любой алгоритм хеширования, который поддерживает OpenSSL, шифры же должны поддерживаться явно.
  6. В соответствии со стандартом SQL функции возвращают NULL, если один из аргументов NULL. Важно иметь в виду, что это может угрожать безопасности.

Ограничения

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

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

Пример использования модуля и результат выполнения запроса:
SELECT digest('Text', 'sha256');
Раскрыть type=sql
                               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');
Пример результата выполнения запроса:
Раскрыть type=sql
                  encode
------------------------------------------
 c3328c39b0e29f78e9ff45db674248b1d245887d
(1 row)
Пример установки нового пароля:
UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
Пример проверки пароля:
SELECT (pswhash = crypt('entered password', pswhash)) AS pswmatch FROM ... ;
Этот запрос возвращает true, если введенный пароль правильный.

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

Дополнительную информацию по поставляемому модулю pgcrypto можно получить по ссылке.
Предыдущий раздел
pg_cron
Следующий раздел
pg_freespacemap
Была ли страница полезной?