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 в следующих аспектах:
- Алгоритмы в
crypt()
медленные. Так как объем данных невелик, это единственный способ усложнить перебор паролей; - Алг оритмы в
crypt()
используют случайное значение, называемое солью, чтобы у пользователей с одинаковыми паролями зашифрованные пароли оказывались разными. Это также обеспечивает дополнительную защиту от получения обратного алгоритма; - Алгоритмы в
crypt()
включают в результат тип алгоритма, что допускает сосуществование паролей, хешированных разными алгоритмами; - Некоторые из алгоритмов являются адаптируемыми — с ростом производительности компьютеров эти алгоритмы можно настроить так, чтобы они стали медленнее, при этом сохраняя совместимость с существующими паролями.
Алгоритмы, которые поддерживает 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 использовать низкоуровневые функции шифрования не рекомендуется, поскольку существуют следующие недостатки их использован ия:
- Используют ключ пользователя непосредственно в качестве ключа шифрования;
- Не обеспечивают проверку целостности, которая должна выявлять модификацию зашифрованных данных;
- Рассчитаны на то, что пользователи будут управлять всеми параметрами шифрования самостоятельно, даже вектором инициализации;
- Не рассчитаны на текст.
Подробности использования низкоуровневых функций шифрования в документации 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
должны быть активированы поставщики этих алгоритмов.
Внимание!
- Автоматически выбирается любой алгоритм хеширования, который поддерживает OpenSSL, шифры же должны поддерживаться явно.
- В соответствии со стандартом SQL функции возвращают
NULL
, если один из аргументовNULL
. Важно иметь в виду, что это может угрожать безопасности.
Доработка
Доработка не проводилась.
Ограничения
Все функции расширения pgcrypto
выполняются внутри сервера баз данных. Это означает, что все данные и пароли передаются между функциями pgcrypto
и клиентскими приложениями открытым текстом. Для повышения уровня безопасности необходимо:
- Подключаться локально или использовать подключения SSL;
- Доверять системе и администратору баз данных.
Если это невозможно, лучше произвести шифрование в клиентском приложении.