Openssl seal: примеры (PHP)
openssl_seal(string $data, string &$sealed_data, array &$encrypted_keys, array $public_key, string $cipher_algo, string &$iv = ?): int|falseФункция openssl_seal выполняет запечатывание (шифрование) данных с использованием алгоритмов с открытым ключом. Она шифрует исходные данные симметричным алгоритмом с случайно сгенерированным ключом, который затем шифруется открытыми ключами каждого получателя. Таким образом, запечатанные данные могут быть расшифрованы только теми, кто обладает соответствующими закрытыми ключами.
Использование функции актуально в сценариях, где необходимо зашифровать данные для нескольких получателей, например в системах рассылки конфиденциальной информации или при организации безопасного хранения данных с разделением доступа.
- $data (string) - исходные данные для шифрования.
- &$sealed_data (string) - переменная, в которую будет помещён результат шифрования.
- &$encrypted_keys (array) - массив, который будет заполнен зашифрованными ключами для каждого получателя.
- $public_keys (array) - массив открытых ключей получателей.
- $cipher_algo (string) - алгоритм шифрования (по умолчанию "RC4").
- &$iv (string) - вектор инициализации для симметричного шифрования.
$data = "Секретное сообщение";
$public_key = openssl_pkey_get_public(file_get_contents('public.pem'));
$public_keys = [$public_key];
if (openssl_seal($data, $sealed, $ekeys, $public_keys)) {
echo 'Успешно запечатано';
}Успешно запечатано
$data = "Конфиденциальные данные";
$public_key = openssl_pkey_get_public(file_get_contents('cert.pem'));
$public_keys = [$public_key];
$cipher_algo = "AES256CBC";
$iv = '';
if (openssl_seal($data, $sealed, $ekeys, $public_keys, $cipher_algo, $iv)) {
echo 'Длина запечатанных данных: ' . strlen($sealed);
}Длина запечатанных данных: 48
Выполняет прямое шифрование данных открытым ключом без генерации симметричного ключа. Подходит для шифрования небольших блоков данных для одного получателя.
Осуществляет симметричное шифрование с заданным ключом и алгоритмом. Применяется, когда ключ уже известен отправителю и получателю, без использования инфраструктуры открытых ключей.
Функции типа sodium_crypto_box_seal предлагают современные алгоритмы и часто более простой API. Рекомендуются для новых проектов, где требуется высокая безопасность.
$public_key = "not_a_key";
$public_keys = [$public_key];
$result = openssl_seal("data", $sealed, $ekeys, $public_keys);
var_dump($result);bool(false)
$data = "test";
$public_key = openssl_pkey_get_public(file_get_contents('public.pem'));
$public_keys = [$public_key];
$result = openssl_seal($data, $sealed, $ekeys, $public_keys, "UNKNOWN_ALGO");
var_dump($result);Warning: openssl_seal(): Unknown cipher algorithm bool(false)
$data = "data";
$public_key = openssl_pkey_get_public(file_get_contents('public.pem'));
$public_keys = [$public_key];
$result = openssl_seal($data, $sealed, $ekeys, $public_keys, "AES-128-CBC");
var_dump($result);bool(false)
Удалена поддержка алгоритма "RC4" по умолчанию. Теперь требуется явно указывать алгоритм шифрования.
Добавлен параметр $iv для передачи вектора инициализации. Ранее он генерировался автоматически без возможности получения.
Введён параметр $cipher_algo, позволяющий выбирать алгоритм шифрования вместо использования RC4 по умолчанию.
$data = "Финансовый отчёт за 2024 год";
$pub_keys = [];
foreach (['user1.pem', 'user2.pem', 'user3.pem'] as $file) {
$pub_keys[] = openssl_pkey_get_public(file_get_contents($file));
}
$iv = random_bytes(16);
if (openssl_seal($data, $encrypted, $env_keys, $pub_keys, 'AES-256-CBC', $iv)) {
$result = base64_encode($encrypted);
echo 'Данные зашифрованы для ' . count($env_keys) . ' получателей';
// $env_keys[0] может расшифровать владелец первого ключа, $env_keys[1] - второго и т.д.
}Данные зашифрованы для 3 получателей
$algorithms = ['AES-128-CBC', 'AES-256-CBC', 'CAMELLIA-256-CFB'];
$public_key = openssl_pkey_get_public(file_get_contents('public.pem'));
$data = "Тестовое сообщение для разных алгоритмов";
foreach ($algorithms as $algo) {
$iv_len = openssl_cipher_iv_length($algo);
$iv = $iv_len ? random_bytes($iv_len) : '';
if (openssl_seal($data, $sealed, $ekeys, [$public_key], $algo, $iv)) {
echo $algo . ': ' . strlen($sealed) . ' байт
';
}
}AES-128-CBC: 64 байт
AES-256-CBC: 64 байт
CAMELLIA-256-CFB: 64 байт
// Генерация ключевой пары
$config = ['private_key_bits' => 2048];
$key_pair = openssl_pkey_new($config);
openssl_pkey_export($key_pair, $private_key);
$public_key = openssl_pkey_get_details($key_pair)['key'];
// Шифрование
$data = "Секретный текст";
$pub_key_res = openssl_pkey_get_public($public_key);
$iv = random_bytes(16);
openssl_seal($data, $sealed, $env_key, [$pub_key_res], 'AES-256-CBC', $iv);
// Расшифровка
$priv_key_res = openssl_pkey_get_private($private_key);
if (openssl_open($sealed, $decrypted, $env_key[0], $priv_key_res, 'AES-256-CBC', $iv)) {
echo 'Расшифровано: ' . $decrypted;
}Расшифровано: Секретный текст
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization, hashes
with open("public_key.pem", "rb") as key_file:
public_key = serialization.load_pem_public_key(key_file.read())
encrypted = public_key.encrypt(
b"secret data",
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
print(encrypted.hex())a1b2c3...f0e9
// Генерация ключа и шифрование
async function sealData(data, publicKey) {
const encoded = new TextEncoder().encode(data);
const encrypted = await window.crypto.subtle.encrypt(
{ name: "RSA-OAEP" },
publicKey,
encoded
);
return encrypted;
}Openssl seal в MySQL
Функция ASYMMETRIC_ENCRYPT выполняет шифрование с использованием открытого ключа, хранящегося в базе данных. Работает только с данными в таблицах.
SELECT ASYMMETRIC_ENCRYPT('MySecret', 'PublicKey') AS encrypted;