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

Использование openssl_get_md_methods для работы с алгоритмами хеширования
Раздел: Шифрование (OpenSSL)
openssl_get_md_methods(bool $aliases = false): array

Основная информация о функции openssl_get_md_methods

Описание и назначение

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

Сигнатура функции

Функция имеет следующую сигнатуру:

openssl_get_md_methods(bool $aliases = false, bool $digests_only = true): array
Аргументы функции
  1. aliases (bool) - если установлено в true, то в результат включаются псевдонимы алгоритмов. По умолчанию false.
  2. digests_only (bool) - если установлено в true, возвращаются только алгоритмы хеширования. При false возвращаются также алгоритмы шифрования. По умолчанию true.

Функция не требует дополнительных зависимостей, кроме активированного расширения OpenSSL.

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

Пример 1: Получение списка алгоритмов по умолчанию
$methods = openssl_get_md_methods();
print_r($methods);
Array
(
    [0] => MD2
    [1] => MD4
    [2] => MD5
    [3] => SHA1
    [4] => SHA224
    [5] => SHA256
    [6] => SHA384
    [7] => SHA512
    [8] => RIPEMD160
    // ... другие алгоритмы
)
Пример 2: Получение списка с псевдонимами
$methodsWithAliases = openssl_get_md_methods(true);
echo count($methodsWithAliases);
58
Пример 3: Получение всех доступных методов OpenSSL
$allMethods = openssl_get_md_methods(false, false);
echo in_array('AES-128-CBC', $allMethods) ? 'Да' : 'Нет';
Да

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

hash_algos

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

$hashAlgos = hash_algos();
print_r(array_slice($hashAlgos, 0, 5));
Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
)

Функция openssl_get_cipher_methods() возвращает список алгоритмов шифрования. Полезна при выборе метода для функций шифрования/дешифрования. Для получения полного списка методов OpenSSL можно использовать openssl_get_md_methods с параметром digests_only = false.

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

Ошибка: использование алгоритма, отсутствующего в списке

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

$methods = openssl_get_md_methods();
if (!in_array('SHA3-256', $methods, true)) {
    echo 'Алгоритм SHA3-256 не поддерживается';
}
Алгоритм SHA3-256 не поддерживается
Ошибка: игнорирование параметров функции

Неучет влияния параметров aliases и digests_only может привести к неверной проверке доступности алгоритма.

// Хотим использовать алгоритм 'sha1', но он может быть в списке как 'SHA1'
$methods = openssl_get_md_methods();
$needle = 'sha1';
$result = in_array($needle, $methods) ? 'Найден' : 'Не найден';
echo $result;
Не найден

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

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

PHP 8.0

В PHP 8.0 функция openssl get md methods не претерпела значительных изменений в сигнатуре. Однако были обновлены внутренние зависимости OpenSSL, что могло повлиять на список возвращаемых алгоритмов. Добавлена поддержка новых алгоритмов, соответствующих OpenSSL 1.1.1.

PHP 8.1

Не было существенных изменений в работе функции. Проведены общие улучшения стабильности расширения OpenSSL.

PHP 8.2 и 8.3

Функция сохранила обратную совместимость. В этих версиях продолжается обновление поддерживаемых алгоритмов в соответствии с новыми версиями OpenSSL.

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

Пример: фильтрация алгоритмов по силе хеша
Пример php
$methods = openssl_get_md_methods();
$secureAlgos = [];
foreach ($methods as $algo) {
    if (stripos($algo, 'SHA') === 0 && (int)filter_var($algo, FILTER_SANITIZE_NUMBER_INT) >= 256) {
        $secureAlgos[] = $algo;
    }
}
print_r($secureAlgos);
Array
(
    [0] => SHA256
    [1] => SHA384
    [2] => SHA512
    [3] => SHA224
)
Пример: проверка доступности алгоритма для подписи
Пример php
function isSigningAlgorithmAvailable($algorithm) {
    $allMethods = openssl_get_md_methods(true, false);
    return in_array($algorithm, $allMethods, true);
}

echo isSigningAlgorithmAvailable('RSA-SHA256') ? 'Доступен' : 'Недоступен';
Доступен
Пример: группировка алгоритмов по семействам
Пример php
$methods = openssl_get_md_methods(true);
$families = [];
foreach ($methods as $method) {
    $family = preg_replace('/[^a-zA-Z]/', '', $method);
    if (!isset($families[$family])) {
        $families[$family] = 0;
    }
    $families[$family]++;
}
arsort($families);
print_r($families);
Array
(
    [SHA] => 12
    [MD] => 5
    [RIPEMD] => 5
    // ...
)
Пример: сравнение списков алгоритмов OpenSSL и Hash
Пример php
$opensslMethods = openssl_get_md_methods();
$hashMethods = hash_algos();
$opensslOnly = array_diff(
    array_map('strtolower', $opensslMethods),
    array_map('strtolower', $hashMethods)
);
print_r(array_values($opensslOnly));
Array
(
    [0] => md4
    [1] => ripemd160
    // ...
)

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

Python: hashlib.algorithms_available

В Python модуль hashlib предоставляет атрибут algorithms_available, содержащий множество доступных алгоритмов хеширования. В отличие от PHP, Python может использовать различные криптографические бэкенды.

import hashlib
print(list(hashlib.algorithms_available)[:5])
['sha3_384', 'sha384', 'sha1', 'md5', 'sha512']
JavaScript: Web Crypto API

В браузерном JavaScript для получения списка алгоритмов используют Web Crypto API через метод subtle.digest, но прямого аналога функции получения списка нет. В Node.js доступен модуль crypto с методом getHashes.

const crypto = require('crypto');
console.log(crypto.getHashes().slice(0, 3));
['RSA-MD4', 'RSA-MD5', 'RSA-MDC2']
MySQL: Функции SHA2 и родственные

В MySQL нет функции для получения списка алгоритмов, но поддерживаются конкретные функции хеширования: MD5(), SHA1(), SHA2(). Список фиксирован и зависит от версии СУБД.

PHP openssl_get_md_methods function comments

En
Openssl get md methods Gets available digest methods