Openssl get cipher methods: примеры (PHP)

Получение списка методов шифрования через openssl_get_cipher_methods
Раздел: Шифрование (OpenSSL)
openssl_get_cipher_methods(bool $aliases = false): array

Описание функции openssl_get_cipher_methods

Функция openssl_get_cipher_methods возвращает перечень доступных методов шифрования (шифров), которые поддерживаются модулем OpenSSL в текущей среде PHP. Она применяется для получения списка алгоритмов, которые можно использовать в других функциях модуля OpenSSL, например, при шифровании данных, создании или проверке цифровых подписей.

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

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

  • $aliases (bool) – определяет, следует ли включать в итоговый массив псевдонимы (алиасы) методов шифрования. Если аргумент равен true, псевдонимы добавляются в результат. По умолчанию (начиная с PHP 8.0.0) имеет значение false.

Функция возвращает индексированный массив, содержащий названия доступных шифров.

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

Получение базового списка методов
<?
$ciphers = openssl_get_cipher_methods();
print_r(array_slice($ciphers, 0, 5));
?>
Array
(
    [0] => AES-128-CBC
    [1] => AES-128-CBC-HMAC-SHA1
    [2] => AES-128-CBC-HMAC-SHA256
    [3] => AES-128-CCM
    [4] => AES-128-CFB
)
Получение списка с включением псевдонимов
<?
$allCiphers = openssl_get_cipher_methods(true);
echo count($allCiphers);
?>
169
Фильтрация методов по названию
<?
$ciphers = openssl_get_cipher_methods();
$gcmCiphers = array_filter($ciphers, fn($c) => stripos($c, 'gcm') !== false);
print_r(array_values($gcmCiphers));
?>
Array
(
    [0] => AES-128-GCM
    [1] => AES-192-GCM
    [2] => AES-256-GCM
    [3] => ARIA-128-GCM
    [4] => ARIA-192-GCM
    [5] => ARIA-256-GCM
)

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

В PHP существуют другие функции для получения информации о доступных криптографических алгоритмах.

Функция openssl_get_md_methods возвращает массив доступных методов хеширования (дайджестов), например, 'sha256', 'md5'. Она полезна, когда требуется выбрать алгоритм для создания или проверки хеша.

hash_hmac_algos

Функция hash_hmac_algos возвращает перечень алгоритмов, которые поддерживаются функцией hash_hmac. Этот список обычно шире, чем у OpenSSL, и включает в себя алгоритмы, специфичные для расширения Hash.

Функцию openssl_get_cipher_methods используют при работе непосредственно с функциями шифрования/расшифрования OpenSSL (например, openssl_encrypt), тогда как hash_hmac_algos применяется для выбора алгоритма HMAC.

Типичные ошибки при использовании

Ожидание другого типа данных

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

<?
$ciphers = openssl_get_cipher_methods();
echo $ciphers; // Выведет 'Array' и предупреждение
?>
Array
Warning: Array to string conversion in ...
Некорректная проверка наличия метода

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

<?
$ciphers = openssl_get_cipher_methods();
// Неправильно
$hasCipher = in_array('aes-256-cbc', $ciphers); // false
// Правильно
$hasCipher = in_array('AES-256-CBC', $ciphers); // true
?>

Изменения в последних версиях PHP

В PHP 8.0.0 необязательный параметр $aliases по умолчанию был изменен на false. В предыдущих версиях (PHP 7.x) параметр был обязательным, и его необходимо было явно передавать как булево значение.

// PHP 7.x
$ciphers = openssl_get_cipher_methods(false);
// PHP 8.0.0+
$ciphers = openssl_get_cipher_methods(); // эквивалентно false

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

Создание меню выбора шифра для интерфейса
Пример php
<?
$ciphers = openssl_get_cipher_methods();
$secureCiphers = array_filter($ciphers, function($cipher) {
    return stripos($cipher, 'GCM') !== false || stripos($cipher, 'CCM') !== false;
});
echo '';
?>
Проверка поддержки конкретного алгоритма перед использованием
Пример php
<?
function isCipherSupported($cipherName) {
    $available = openssl_get_cipher_methods();
    return in_array($cipherName, $available);
}

$cipherToUse = 'AES-256-GCM';
if (isCipherSupported($cipherToUse)) {
    $iv = random_bytes(openssl_cipher_iv_length($cipherToUse));
    $key = random_bytes(32);
    $data = 'Секретные данные';
    $encrypted = openssl_encrypt($data, $cipherToUse, $key, 0, $iv, $tag);
    echo 'Данные зашифрованы.';
} else {
    echo 'Алгоритм не поддерживается.';
}
?>
Сравнение списков с псевдонимами и без них
Пример php
<?
$base = openssl_get_cipher_methods(false);
$withAliases = openssl_get_cipher_methods(true);
$difference = array_diff($withAliases, $base);

if (!empty($difference)) {
    echo 'Найдены псевдонимы: ';
    print_r(array_values($difference));
}
?>
Найдены псевдонимы: 
Array
(
    [0] => des-ede3-cbc
    [1] => des-ede3
    [2] => des-ede3-ofb
    [3] => des3
    // ...
)

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

Openssl get cipher methods в Python

В стандартной библиотеке Python модуль cryptography предоставляет аналогичные возможности. Список доступных шифров можно получить через объекты библиотеки, но напрямую аналогичной функции нет. Чаще алгоритм указывается явно.

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
# Алгоритмы импортируются напрямую, например:
# cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
JavaScript (Node.js)

В Node.js модуль crypto содержит метод getCiphers(), который возвращает массив с названиями поддерживаемых алгоритмов шифрования.

const crypto = require('crypto');
const ciphers = crypto.getCiphers();
console.log(ciphers.slice(0, 5));
[ 'aes-128-cbc', 'aes-128-ccm', 'aes-128-cfb', 'aes-128-cfb1', 'aes-128-cfb8' ]

Openssl get cipher methods в MySQL

В СУБД MySQL нет функции, которая возвращает список доступных алгоритмов шифрования. Алгоритмы указываются явно в таких функциях, как AES_ENCRYPT() или DES_ENCRYPT().

PHP openssl_get_cipher_methods function comments

En
Openssl get cipher methods Gets available cipher methods