Криптографические функции
В Firebird 4.0 поддерживается только подмножество симметричных алгоритмов шифрования (как блочных так и потоковых), так и RSA.
Функции для работы с контекстными переменными
Функции для работы со строками
Функции для работы с датой и временем
Функции для работы с типом BLOB
Функции для работы с типом DECFLOAT
В Firebird 4.0 поддерживается только подмножество симметричных алгоритмов шифрования (как блочных так и потоковых), так и RSA.
CRYPT_HASH()
DSQL, PSQL
CRYPT_HASH (value USING <algorithm>) <algorithm> ::= { MD5 | SHA1 | SHA256 | SHA512 | SHA3_224 | SHA3_256 | SHA3_384 | SHA3_512 }
Параметр | Описание |
---|---|
value |
Выражение любого типа. Не строковые и не бинарные типы приводятся к строке. |
algorithm |
Алгоритм хеширования. |
VARBINARY
Функция CRYPT_HASH
возвращает криптографический хэш входной строки, используя указанный алгоритм.Эта функция полностью поддерживает текстовые BLOB
любой длины и с любым набором символов.Предложение USING
позволяет указать алгоритм по которому вычисляет хэш.
Note
|
Алгоритмы |
CRYPT_HASH
CRYPT_HASH
SELECT CRYPT_HASH(x USING SHA256) FROM MyTable;
-- результат типа VARBINARY
DECRYPT()
DSQL, PSQL
DECRYPT (encrypted_input [USING <algorithm>] [MODE <mode>] KEY key [IV iv] [<ctr_type>] [CTR_LENGTH ctr_length] [COUNTER initial_counter] ) <algorithm> ::= <block_cipher> | <stream_cipher> <block_cipher> ::= AES | ANUBIS | BLOWFISH | KHAZAD | RC5 | RC6 | SAFER+ | TWOFISH | XTEA <stream_cipher> ::= CHACHA20 | RC4 | SOBER128 <mode> ::= CBC | CFB | CTR | ECB | OFB <ctr_type> ::= CTR_BIG_ENDIAN | CTR_LITTLE_ENDIAN
Параметр | Описание |
---|---|
encrypted_input |
Зашифрованный BLOB или (двоичная) строка |
algorithm |
Алгоритм шифрования.Поддерживаются как блочные, так и потоковые алгоритмы. |
mode |
Режим шифрования.Обязателен для блочных алгоритмов шифрования. |
key |
Ключ шифрования. |
iv |
Вектор инициализации (IV). Должен быть указан для всех блочных алгоритмов шифрования за исключением |
ctr_type |
Порядок байтов счётчика.Может быть указан только в режиме |
ctr_length |
Длина счётчика в байтах.Может быть указана только в режиме |
initial_counter |
Начальное значение счётчика.Может быть указана только для алгоритма |
BLOB
или VARBINARY
.
Функция DECRYPT
дешифрует данные с использованием симметричного шифра.Размеры строк передаваемых в эту функцию должны соответствовать требованиям выбранного алгоритма и режима.
DECRYPT
select decrypt(x'0154090759DF' using sober128 key 'AbcdAbcdAbcdAbcd'
iv '01234567')
from rdb$database;
select decrypt(secret_field using aes mode ofb key '0123456701234567'
iv init_vector)
from secure_table;
ENCRYPT()
DSQL, PSQL
ENCRYPT (input [USING <algorithm>] [MODE <mode>] KEY key [IV iv] [<ctr_type>] [CTR_LENGTH ctr_length] [COUNTER initial_counter] ) <algorithm> ::= <block_cipher> | <stream_cipher> <block_cipher> ::= AES | ANUBIS | BLOWFISH | KHAZAD | RC5 | RC6 | SAFER+ | TWOFISH | XTEA <stream_cipher> ::= CHACHA20 | RC4 | SOBER128 <mode> ::= CBC | CFB | CTR | ECB | OFB <ctr_type> ::= CTR_BIG_ENDIAN | CTR_LITTLE_ENDIAN
Параметр | Описание |
---|---|
input |
Выражение строкового типа или |
algorithm |
Алгоритм шифрования.Поддерживаются как блочные, так и потоковые алгоритмы. |
mode |
Режим шифрования.Обязателен для блочных алгоритмов шифрования. |
key |
Ключ шифрования. |
iv |
Вектор инициализации (IV). Должен быть указан для всех блочных алгоритмов шифрования за исключением |
ctr_type |
Порядок байтов счётчика.Может быть указан только в режиме |
ctr_length |
Длина счётчика в байтах.Может быть указана только в режиме |
initial_counter |
Начальное значение счётчика.Может быть указана только для алгоритма |
BLOB
или VARBINARY
Функция ENCRYPT
шифрует данные с использованием симметричного шифра.
Note
|
|
Особенности различных алгоритмов и режимов выходят за рамки данного справочника по языку.
Алгоритм | Размер ключа (байт) | Размер блока (байт) | Примечание |
---|---|---|---|
Блочное шифрование |
|||
|
16, 24, 32 |
16 |
|
|
16 - 40, с шагом 4 |
16 |
|
|
8 - 56 |
8 |
|
|
16 |
8 |
|
|
8 - 128 |
8 |
|
|
8 - 128 |
16 |
|
|
16, 24, 32 |
16 |
|
|
16, 24, 32 |
16 |
|
|
16 |
8 |
|
Поточное шифрование |
|||
|
16, 32 |
1 |
Размер (IV) составляет 8 или 12 байт.Для размера 8 initial_counter - это 64-битное целое число, для размера 12 - 32-битное. |
|
5 - 256 |
1 |
|
|
4x |
1 |
Размер (IV) составляет 4y байт, длина не зависит от размера ключа. |
ENCRYPT
select encrypt('897897' using sober128 key 'AbcdAbcdAbcdAbcd' iv '01234567')
from rdb$database;
RSA_PRIVATE()
DSQL, PSQL
RSA_PRIVATE (size)
Параметр | Описание |
---|---|
size |
Размер ключа в байтах. |
VARBINARY
Функция RSA_PRIVATE
возвращает RSA закрытый ключ заданной длины (в байтах) в PKCS#1 формате как строку VARBINARY
.
RSA_PRIVATE
select rdb$set_context('USER_SESSION', 'private_key', rsa_private(256))
from rdb$database;
RSA_PUBLIC()
DSQL, PSQL
RSA_PUBLIC (private-key)
Параметр | Описание |
---|---|
private-key |
RSA закрытый ключ. |
VARBINARY
Функция RSA_PUBLIC
возвращает RSA открытый ключ для заданного RSA закрытого ключа.Оба ключа должны быть в PKCS#1 формате.
RSA_PUBLIC
Закрытый ключ должен быть инициализирован ранее см.пример в RSA_PRIVATE
select rdb$set_context('USER_SESSION', 'public_key',
rsa_public(rdb$get_context('USER_SESSION', 'private_key')))
from rdb$database;
RSA_ENCRYPT()
DSQL, PSQL
RSA_ENCRYPT (<data> KEY <public_key> [LPARAM <tag>] [HASH <hash>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для шифрования. |
public_key |
Открытый RSA ключ, который возвращает функция |
tag |
Дополнительный системный тег, который можно применять для определения того, какая система закодировала сообщение.Значением по умолчанию является |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
VARBINARY
Заполняет данные, используя заполнение OAEP, и шифрует их, используя открытый ключ RSA.Обычно используется для шифрования коротких симметричных ключей, которые затем используются в блочных шифрах для шифрования сообщения.
RSA_ENCRYPT
Открытый ключ должен быть инициализирован ранее см.пример в [fblangref-scalarfuncs-rsa_public]
select rdb$set_context('USER_SESSION', 'msg',
rsa_encrypt('Some message' key rdb$get_context('USER_SESSION', 'public_key')))
from rdb$database;
RSA_DECRYPT()
DSQL, PSQL
RSA_DECRYPT (<data> KEY <private_key> [LPARAM <tag>] [HASH <hash>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для дешифрования. |
private_key |
Закрытый RSA ключ, который возвращает функция |
tag |
Дополнительный системный тег.Должно быть тем же самым значением, которое передавалось |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
VARCHAR
Расшифровывает с использованием закрытого ключа RSA, и удаляет OAEP дополненные данные.
Закрытый ключ должен быть инициализирован ранее см. пример в [fblangref-scalarfuncs-rsa_private].Данные для расшифровки используются из примера в [fblangref-scalarfuncs-rsa_encrypt].
select RSA_DECRYPT(rdb$get_context('USER_SESSION', 'msg')
key rdb$get_context('USER_SESSION', 'private_key'))
from RDB$DATABASE;
RSA_SIGN_HASH()
DSQL, PSQL
RSA_SIGN_HASH (<data> KEY <private_key> [HASH <hash>] [SALT_LENGTH <length>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для кодирования. |
private_key |
Закрытый RSA ключ, который возвращает функция |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
length |
Указывает на длину желаемой соли и, как правило, должен быть небольшим.Хорошее значение от 8 до 16. |
VARBINARY
Выполняет PSS-кодирование дайджеста сообщения для подписи и подписывает его с использованием закрытого ключа RSA.Возвращает подпись сообщения.
RSA_SIGN_HASH
Закрытый ключ должен быть инициализирован ранее см.пример в [fblangref-scalarfuncs-rsa_private].
select rdb$set_context('USER_SESSION', 'msg',
rsa_sign_hash(crypt_hash('Test message' using sha256)
key rdb$get_context('USER_SESSION', 'private_key')))
from rdb$database;
RSA_VERIFY_HASH()
DSQL, PSQL
RSA_VERIFY_HASH (<data> SIGNATURE <signature> KEY <public_key> [HASH <hash>] [SALT_LENGTH <length>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для кодирования. |
signature |
Подпись.Должно быть значением возвращаемым функцией |
public_key |
Открытый RSA ключ, который возвращает функция |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
length |
Указывает на длину желаемой соли и, как правило, должен быть небольшим.Хорошее значение от 8 до 16. |
BOOLEAN
Выполняет PSS-кодирование дайджеста сообщения для подписи и проверяет его цифровую подпись, используя открытый ключ RSA.Возвращает результат проверки подписи.
RSA_VERIFY_HASH
Открытый ключ должен быть инициализирован ранее см. пример в [fblangref-scalarfuncs-rsa_public].Цифровая подпись получена ранее с помощью функции [fblangref-scalarfuncs-rsa_sign_hash].
select rsa_verify_hash(crypt_hash('Test message' using sha256)
signature rdb$get_context('USER_SESSION', 'msg')
key rdb$get_context('USER_SESSION', 'public_key'))
from rdb$database;
CAST()
DSQL, PSQL
CAST(value | NULL AS <type>) <type> ::= <datatype> | [TYPE OF] domain | TYPE OF COLUMN relname.colname <datatype> ::= <scalar_datatype> | <blob_datatype> | <array_datatype> <scalar_datatype> ::= См. Синтаксис скалярных типов данных <blob_datatype> ::= См. Синтаксис типа данных BLOB <array_datatype> ::= См. Синтаксис массивов
Параметр | Описание |
---|---|
value |
SQL выражение. |
datatype |
Тип данных SQL. |
domain |
Домен. |
relname |
Имя таблицы или представления. |
colname |
Имя столбца таблицы или представления. |
<type>
.
Функция CAST служит для явного преобразования данных из одного типа данных в другой тип данных или домен.Если это невозможно будет выдана ошибка.
Из типа | В тип |
---|---|
Числовые типы |
Числовые типы, |
|
|
|
|
|
|
|
|
Имейте в виду, что иногда информация может быть потерянна, например, когда вы преобразуете тип TIMESTAMP
к DATE
.Кроме того, тот факт, что типы совместимы для функции CAST
, ещё не гарантирует, что преобразование будет успешным.“CAST (123456789 AS SMALLINT)” безусловно приведёт к ошибке, так же как и “CAST('Judgement Day' as DATE)”.
Вы можете применить преобразование типа к параметрам оператора:
CAST (? AS INTEGER)
Это дает вам контроль над типом полей ввода.
При преобразовании к домену должны быть удовлетворены любые ограничения (NOT NULL и/или CHECK) объявленные для домена, иначе преобразование не будет выполнено.Помните, что проверка CHECK проходит, если его вычисление даёт TRUE или UNKNOWN (NULL). Для следующих операторов:
CREATE DOMAIN quint AS INT CHECK (VALUE >= 5000)
SELECT CAST (2000 AS quint) FROM rdb$database -- (1)
SELECT CAST (8000 AS quint) FROM rdb$database -- (2)
SELECT CAST (null AS quint) FROM rdb$database -- (3)
только (1) завершится с ошибкой.
При использовании модификатора TYPE OF
выражение будет преобразовано к базовому типу домена, игнорируя любые ограничения.Для домена quint, объявленного выше, оба преобразования будут эквивалентны и оба будут успешно выполнены:
SELECT CAST (2000 AS TYPE OF quint) FROM rdb$database
SELECT CAST (2000 AS INT) FROM rdb$database
При использовании TYPE OF
с [VAR]CHAR
типом, его набор символов и порядок сортировки (collate) сохраняются.
CREATE DOMAIN iso20 VARCHAR(20) CHARACTER SET iso8859_1;
CREATE DOMAIN dunl20 VARCHAR(20) CHARACTER SET iso8859_1 COLLATE du_nl;
CREATE TABLE zinnen (zin VARCHAR(20));
COMMIT;
INSERT INTO zinnen VALUES ('Deze');
INSERT INTO zinnen VALUES ('Die');
INSERT INTO zinnen VALUES ('die');
INSERT INTO zinnen VALUES ('deze');
SELECT CAST(zin AS TYPE OF iso20) FROM zinnen ORDER BY 1;
-- returns Deze -> Die -> deze -> die
SELECT CAST(zin AS TYPE OF dunl20) FROM zinnen ORDER BY 1;
-- returns deze -> Deze -> die -> Die
Warning
|
Если определение домена изменяется, то существующие преобразования к домену или его типу могут стать ошибочными.Если такие преобразования происходят в PSQL модулях, то их ошибки могут быть обнаружены.См. Поле RDB$VALID_BLR. |
Разрешено преобразовывать выражение к типу столбца существующей таблицы или представления.При этом будет использован только сам тип, для строковых типов будет использован так же набор символов, но не последовательность сортировки.Ограничения и значения по умолчанию исходного столбца не применяются.
CREATE TABLE ttt (
s VARCHAR(40) CHARACTER SET utf8 COLLATE unicode_ci_ai
);
COMMIT;
SELECT CAST ('Jag har många vänner' AS TYPE OF COLUMN ttt.s)
FROM rdb$database;
Warning
|
Если определение столбца изменяется, то существующие преобразования к его типу могут стать ошибочными.Если такие преобразования происходят в PSQL модулях, то их ошибки могут быть обнаружены.См. Поле RDB$VALID_BLR. |
SELECT CAST ('12' || '-June-' || '1959' AS DATE) FROM rdb$database
Заметьте, что в некоторых случаях вы можете не использовать синтаксис преобразования как в примере выше, так как Firebird поймёт из контекста (сравнение с полем типа DATE
) как интерпретировать строку:
UPDATE People SET AgeCat = 'Old'
WHERE BirthDate < '1-Jan-1943'
Но это не всегда возможно.Преобразование в примере ниже не может быть опущено, так как система будет пытаться преобразовать строку к числу чтобы вычесть из неё число:
SELECT CAST('TODAY' AS DATE) - 7 FROM rdb$database
BIN_AND()
DSQL, PSQL
BIN_AND (number, number [, number ...])
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_AND
возвращает результат побитовой операции AND (И) аргументов.
BIN_NOT()
DSQL, PSQL
BIN_NOT (number)
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_NOT
возвращает результат побитовой операции NOT
над аргументом.
BIN_OR()
DSQL, PSQL
BIN_OR (number, number [, number ...])
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_OR
возвращает результат побитовой операции OR (ИЛИ) аргументов.
BIN_SHL()
DSQL, PSQL
BIN_SHL (number, shift)
Параметр | Описание |
---|---|
number |
Целое число. |
shift |
Количество бит, на которое смещается значение number. |
BIGINT
или INT128
.
Функция BIN_SHL
возвращает первый параметр, побитно смещённый влево на значение второго параметра, т.е. a << b
или a·2b
.
BIN_SHR()
DSQL, PSQL
BIN_SHR (number, shift)
Параметр | Описание |
---|---|
number |
Целое число. |
shift |
Количество бит на которое смещается значение number. |
BIGINT
или INT128
.
Функция BIN_SHR
возвращает первый параметр, побитно смещённый вправо на значение второго параметра, т.е. a >> b
или a/2b
.
Выполняемая операция является арифметическим сдвигом вправо (SAR), а это означает, что знак первого операнда всегда сохраняется.
BIN_XOR()
DSQL, PSQL
BIN_XOR (number, number [, number ...])
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_XOR
возвращает результат побитовой операции XOR
аргументов.