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 – счетчик итераций для алгоритма (необязательный параметр), который его принимает. Чем больше это число, тем больше времени будет затрачено на вычисление хеша пароля |
Функции шифрования, реализующие часть стандарта OpenPGP (RFC 4880), поддерживают шифрование как с симметричным, так и с закрытым ключом.
Низкоуровневые функции шифрования выполняют только шифрование данных и не предоставляют расширенные возможности шифрования PGP. С появлением поддержки шифрования PGP использовать низкоуровневые функции шифрования не рекомендуется, поскольку существуют следующие недостатки их использования:
- Используют ключ пользователя непосредственно в качестве ключа шифрования.
- Не обеспечивают проверку целостности, которая должна выявлять модификацию зашифрованных данных.
- Рассчитаны на то, что пользователи будут управлять всеми параметрами шифрования самостоятельно, даже вектором инициализации.
- Не рассчитаны на текст.
Функции получения случайных данных:
Функция | Входные аргументы | Возвращаемое значение | Описание |
---|---|---|---|
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.
-
Доверять системе и администратору баз данных.
Если это невозможно, лучше произвести шифрование в клиентском приложении.
Пример использования модуля и результат выполнения запроса:
SELECT digest('Text', 'sha256');
Раскрыть type=sqldigest -------------------------------------------------------------------- \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=sqlencode ------------------------------------------ c3328c39b0e29f78e9ff45db674248b1d245887d (1 row)
Пример установки нового пароля:
UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
Пример проверки пароля:
SELECT (pswhash = crypt('entered password', pswhash)) AS pswmatch FROM ... ;
Этот запрос возвращает true, если введенный пароль правильный.
Дополнительную информацию по поставляемому модулю pgcrypto можно получить по ссылке.