Openssl pkey free: примеры (PHP)

Освобождение ресурсов ключа с помощью openssl_pkey_free
Раздел: Шифрование (OpenSSL)
openssl_pkey_free(OpenSSLAsymmetricKey $key): void

Функция openssl_pkey_free

Функция openssl_pkey_free() освобождает память, занимаемую ресурсом закрытого ключа. Её применение актуально для PHP версий ниже 8.0.

Назначение и использование

Основная задача функции — явное освобождение ресурсов, связанных с приватным ключом, сгенерированным функциями вроде openssl_pkey_new(). Это помогает управлять памятью в длительных скриптах, где создается много ключей.

Аргументы функции

Функция принимает один обязательный параметр:

openssl_pkey_free(resource $key): void
  • $key — ресурс приватного ключа, который требуется освободить.

Примеры использования

Базовый пример создания и освобождения ключа.

$config = array(
    "digest_alg" => "sha256",
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Генерация нового ключа
$res = openssl_pkey_new($config);

// Проверка успешности создания
if ($res !== false) {
    echo "Ключ создан успешно.\n";
    // Освобождение ресурса ключа
    openssl_pkey_free($res);
    echo "Ресурс ключа освобожден.\n";
} else {
    echo "Ошибка при создании ключа.\n";
}
Ключ создан успешно.
Ресурс ключа освобожден.

Похожие функции в PHP

Отсутствие явной необходимости

В современных версиях PHP (8.0 и выше) явный вызов openssl_pkey_free() не требуется. Система сборки мусора автоматически освобождает ресурсы, когда на них не остаётся ссылок.

unset()

Для освобождения памяти можно использовать функцию unset(), которая удаляет переменную, содержащую ресурс. Это приводит к автоматическому освобождению ресурса, если на него больше нет ссылок.

$res = openssl_pkey_new(['private_key_bits' => 2048]);
// Работа с ключом
unset($res); // Ресурс будет освобожден

Типичные ошибки

Передача не ресурса

Передача в функцию значения, которое не является ресурсом, приводит к ошибке типа.

$not_a_resource = 'some string';
// Это вызовет ошибку в PHP < 8.0
openssl_pkey_free($not_a_resource);
Warning: openssl_pkey_free() expects parameter 1 to be resource, string given
Использование после освобождения

Попытка использовать ресурс после его освобождения приводит к неопределенному поведению.

$res = openssl_pkey_new(['private_key_bits' => 2048]);
openssl_pkey_free($res);
// Попытка экспортировать ключ после освобождения
openssl_pkey_export($res, $key);
Предупреждение или ошибка в зависимости от версии PHP

Изменения в версиях PHP

PHP 8.0.0

Функция openssl_pkey_free() была объявлена устаревшей. Её вызов вызывает предупреждение E_DEPRECATED. Причина — переход от ресурсов к объектам для представления ключей. Объекты управляются сборщиком мусора автоматически.

PHP 8.4.0

Функция полностью удалена из ядра PHP. Любая попытка её вызова приведёт к фатальной ошибке.

Расширенные примеры

Освобождение ключа в цикле

Пример управления памятью при массовой генерации ключей в старых версиях PHP.

for ($i = 0; $i < 1000; $i++) {
    $key = openssl_pkey_new([
        "private_key_bits" => 2048,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    ]);
    
    if ($key === false) {
        continue;
    }
    
    // Выполнение операций с ключом
    openssl_pkey_export($key, $pem);
    
    // Явное освобождение ресурса в каждой итерации
    openssl_pkey_free($key);
    unset($pem);
}
Работа с разными типами ключей

Освобождение ресурсов для ключей разных алгоритмов, таких как RSA и EC.

// Генерация RSA ключа
$rsaKey = openssl_pkey_new([
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
    "private_key_bits" => 4096,
]);

// Генерация EC ключа (требует поддержки в системе)
$ecConfig = [
    "private_key_type" => OPENSSL_KEYTYPE_EC,
    "curve_name" => "prime256v1",
];
$ecKey = openssl_pkey_new($ecConfig);

if ($rsaKey !== false) {
    openssl_pkey_free($rsaKey);
    echo "RSA ключ освобожден.\n";
}

if ($ecKey !== false) {
    openssl_pkey_free($ecKey);
    echo "EC ключ освобожден.\n";
}

Альтернативы в других языках

Openssl pkey free в Python

В Python используется автоматическое управление памятью. Объекты ключей из библиотеки cryptography уничтожаются сборщиком мусора.

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# Генерация ключа
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
# ... использование ключа
# Явного освобождения не требуется, объект удалится при выходе из области видимости
del private_key
JavaScript (Node.js с библиотекой crypto)

В Node.js объекты ключей также управляются сборщиком мусора. Явного освобождения не предусмотрено.

const crypto = require('crypto');

// Генерация ключевой пары
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,
});
// ... использование ключа
// При присвоении null или выходе из области видимости память освобождается
delete privateKey;

PHP openssl_pkey_free function comments

En
Openssl pkey free Free key resource