(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
openssl_seal — Запечатать (зашифровать) данные
$data
,&$sealed_data
,&$encrypted_keys
,$public_key
,$cipher_algo
,&$iv
= null
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);
?>