с Firebird 4.0 ваша версия: любая

RSA-функции

Версии сервера

2.53.04.05.06.0
−−ДаДаДа

Доступно в

DSQL, PSQL

Формат

RSA_PRIVATE (size)
RSA_PUBLIC (private-key)
RSA_ENCRYPT (<data> KEY <public_key> [LPARAM <tag>] [HASH <hash>])
RSA_DECRYPT (<data> KEY <private_key> [LPARAM <tag>] [HASH <hash>])

<hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }

Описание

Семейство функций RSA реализует в Firebird криптографию с открытым ключом: генерацию ключевой пары, извлечение открытого ключа из закрытого и асимметричное шифрование/дешифрование данных.

RSA_PRIVATE

RSA_PRIVATE (size)

Генерирует закрытый ключ заданной длины (size — размер ключа в байтах) в формате PKCS#1, результат — VARBINARY.

RSA_PUBLIC

RSA_PUBLIC (private-key)

Извлекает из закрытого ключа соответствующий открытый ключ (тоже PKCS#1, VARBINARY).

RSA_ENCRYPT

RSA_ENCRYPT (<data> KEY <public_key> [LPARAM <tag>] [HASH <hash>])

Дополняет данные по схеме OAEP и шифрует их открытым ключом. Необязательный HASH задаёт алгоритм хеширования для OAEP.

RSA_DECRYPT

RSA_DECRYPT (<data> KEY <private_key> [LPARAM <tag>] [HASH <hash>])

Выполняет обратную операцию закрытым ключом; параметры LPARAM и HASH должны совпадать с использованными при шифровании.

Поскольку RSA пригоден для шифрования лишь коротких данных, обычно им шифруют симметричные ключи, которые затем используются в блочных шифрах (ENCRYPT/DECRYPT) для самого сообщения. Ключи и промежуточные данные удобно хранить в контекстных переменных сессии (RDB$SET_CONTEXT / RDB$GET_CONTEXT).

Пример

Полный цикл: генерация пары ключей, шифрование сообщения открытым ключом, расшифровка закрытым. Ключи и данные хранятся в контекстных переменных сессии.

-- Генерируем закрытый ключ длиной 256 байт
select rdb$set_context('USER_SESSION', 'private_key', rsa_private(256))
from rdb$database;

-- Извлекаем из него открытый ключ
select rdb$set_context('USER_SESSION', 'public_key',
    rsa_public(rdb$get_context('USER_SESSION', 'private_key')))
from rdb$database;

-- Шифруем сообщение открытым ключом
select rdb$set_context('USER_SESSION', 'msg',
    rsa_encrypt('Some message' key rdb$get_context('USER_SESSION', 'public_key')))
from rdb$database;

-- Расшифровываем сообщение закрытым ключом
select rsa_decrypt(rdb$get_context('USER_SESSION', 'msg')
    key rdb$get_context('USER_SESSION', 'private_key'))
from rdb$database;

См. также

ENCRYPT, DECRYPT, CRYPT_HASH, RDB$SET_CONTEXT

Источник

Руководство по языку SQL СУБД Firebird 5.0 (sim1984 / ibase.ru, Public Documentation License)

Обсуждение