openssl_seal

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

openssl_sealЗапечатать (зашифровать) данные

Описание

openssl_seal(
    string $data,
    string &$sealed_data,
    array &$encrypted_keys,
    array $public_key,
    string $cipher_algo,
    string &$iv = null
): int|false

openssl_seal() запечатывает (шифрует) data, используя метод cipher_algo со сгенерированным случайно секретным ключом. Ключ будет зашифрован каждым открытым ключом, указанном в массиве public_key, и каждый зашифрованный ключ будет помещён в encrypted_keys. То есть вы можете разослать запечатанные данные сразу нескольким получателям. Каждый получатель должен получить как запечатанные данные, так и зашифрованный соответствующим открытым ключом ключ для их открытия.

Список параметров

data

Запечатываемые данные.

sealed_data

Запечатанные данные.

encrypted_keys

Массив зашифрованных ключей.

public_key

Массив экземпляров OpenSSLAsymmetricKey, содержащих открытые ключи.

cipher_algo

Метод шифрования.

Предостережение

Значение по умолчанию ('RC4') считается небезопасным. Настоятельно рекомендуется явно указывать метод безопасного шифрования.

iv

Инициализирующий вектор.

Возвращаемые значения

Возвращает длину запечатанных данных или false. В случае успешного выполнения в sealed_data будут содержаться запечатанные данные, а в encrypted_keys зашифрованные ключи.

Список изменений

Версия Описание
8.0.0 public_key теперь принимает массив (array) экземпляров OpenSSLAsymmetricKey; ранее принимался массив (array) ресурсов (resource) типа OpenSSL key.
8.0.0 cipher_algo больше не является необязательным параметром.
8.0.0 iv теперь допускает значение null.

Примеры

Пример #1 Пример использования openssl_seal()

<?php
// $data содержит данные для запечатывания

// извлекаем открытые ключи получателей и подготавливаем их
$fp = fopen("/src/openssl-0.9.6/demos/maurice/cert.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pk1 = openssl_get_publickey($cert);
// повторяем для второго получателя
$fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r");
$cert = fread($fp, 8192);
fclose($fp);
$pk2 = openssl_get_publickey($cert);

// задаём метод
$method = 'AES256';

// генерируем IV
$ivLength = openssl_cipher_iv_length( $method );
$iv = openssl_random_pseudo_bytes( $ivLength, $strong );
if (!
$strong) {
error_log('Инициализирующий вектор может быть не крипографически сильным!');
}

// запечатываем сообщение, только владельцы $pk1 и $pk2 смогут его распечатать,
// используя ключи $ekeys[0] и $ekeys[1] соответственно.
openssl_seal($data, $sealed, $ekeys, array($pk1, $pk2), $method, $iv);

// освобождаем ресурсы ключей
openssl_free_key($pk1);
openssl_free_key($pk2);
?>

Смотрите также

  • openssl_open() - Открыть запечатанные данные