Hash hmac algos: примеры (PHP)

Полное руководство по hash_hmac_algos в PHP с практическими примерами
Раздел: Хеширование и шифрование
hash_hmac_algos: array
Описание функции hash_hmac_algos

Функция hash_hmac_algos() возвращает список алгоритмов хеширования, поддерживающих HMAC (Hash-based Message Authentication Code). Она доступна в PHP, начиная с версии 7.2.0.

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

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

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

Базовые примеры использования
Получение списка алгоритмов
<?
// Простой вызов функции
$algos = hash_hmac_algos();
print_r($algos);
?>
Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
    [5] => sha256
    [6] => sha384
    [7] => sha512/224
    [8] => sha512/256
    [9] => sha512
    [10] => sha3-224
    [11] => sha3-256
    [12] => sha3-384
    [13] => sha3-512
    [14] => ripemd128
    [15] => ripemd160
    [16] => ripemd256
    [17] => ripemd320
    [18] => whirlpool
    [19] => tiger128,3
    [20] => tiger160,3
    [21] => tiger192,3
    [22] => tiger128,4
    [23] => tiger160,4
    [24] => tiger192,4
    [25] => snefru
    [26] => snefru256
    [27] => gost
    [28] => gost-crypto
    [29] => haval128,3
    [30] => haval160,3
    [31] => haval192,3
    [32] => haval224,3
    [33] => haval256,3
    [34] => haval128,4
    [35] => haval160,4
    [36] => haval192,4
    [37] => haval224,4
    [38] => haval256,4
    [39] => haval128,5
    [40] => haval160,5
    [41] => haval192,5
    [42] => haval224,5
    [43] => haval256,5
)
Проверка поддержки конкретного алгоритма
<?
// Проверка доступности алгоритма sha256
if (in_array('sha256', hash_hmac_algos())) {
    echo 'Алгоритм sha256 поддерживается.';
} else {
    echo 'Алгоритм sha256 не поддерживается.';
}
?>
Алгоритм sha256 поддерживается.
Похожие функции в PHP

В PHP существует несколько функций для работы с хешированием:

Возвращает полный список всех доступных алгоритмов хеширования, включая те, которые не поддерживают HMAC. Функция hash_hmac_algos() является её подмножеством.

Генерирует HMAC-хеш для указанных данных с использованием ключа и алгоритма. hash_hmac_algos() помогает проверить, можно ли использовать выбранный алгоритм с hash_hmac().

Создает хеш-сумму данных без использования ключа (не HMAC). Для проверки доступности алгоритмов используется hash_algos().

Функцию hash_hmac_algos() предпочтительнее использовать именно при работе с HMAC, чтобы убедиться в поддержке алгоритма для этой технологии.

Альтернативы в других языках
Python: hashlib.algorithms_available
import hashlib
# Получение множества доступных алгоритмов (включая HMAC-совместимые)
print(hashlib.algorithms_available)
# Проверка конкретного алгоритма
print('sha256' in hashlib.algorithms_available)
{'sha3_256', 'sha256', 'shake_128', 'sha384', ...}
True
JavaScript (Node.js): crypto.getHashes()
const crypto = require('crypto');
// Получение массива поддерживаемых хеш-алгоритмов
const hashes = crypto.getHashes();
console.log(hashes);
console.log(hashes.includes('sha256'));
[ 'RSA-MD4', 'RSA-MD5', 'RSA-SHA1', ... 'sha256', ... ]
true
MySQL: Функции SHA2(), MD5()

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

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

Типичные ошибки
Предположение о неизменности списка
<?
// Ошибка: жесткая привязка к индексу массива
$algos = hash_hmac_algos();
$sha256 = $algos[4]; // Индекс может измениться в другой версии PHP или окружении!
echo $sha256;
?>
sha224 // Неожиданный результат, если порядок изменился
Игнорирование проверки алгоритма
<?
// Ошибка: использование алгоритма без проверки
$data = 'message';
$key = 'secret';
// Если алгоритм 'some_unknown_algo' не поддерживается, возникнет ошибка
$hash = hash_hmac('some_unknown_algo', $data, $key);
?>
Warning: hash_hmac(): Unknown hashing algorithm: some_unknown_algo

Всегда следует проверять наличие алгоритма в списке перед его использованием в hash_hmac().

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

Функция hash_hmac_algos() была добавлена в PHP 7.2.0. В более ранних версиях для получения списка HMAC-совместимых алгоритмов требовалось фильтровать результат функции hash_algos() через hash_hmac() в блоке try-catch.

Начиная с PHP 8.1.0, в список, возвращаемый функцией, были добавлены алгоритмы семейства SHA-3 (sha3-224, sha3-256, sha3-384, sha3-512) и алгоритмы sha512/224, sha512/256, если они поддерживаются библиотекой.

Состав возвращаемого списка зависит от библиотеки хеширования, скомпилированной в PHP (например, OpenSSL или внутренняя реализация).

Расширенные примеры использования
Динамический выбор самого стойкого алгоритма
Пример php
<?
$preferred_order = ['sha3-512', 'sha512', 'sha384', 'sha256', 'sha1'];
$available = hash_hmac_algos();

foreach ($preferred_order as $algo) {
    if (in_array($algo, $available)) {
        echo "Выбран алгоритм: $algo";
        $selectedAlgo = $algo;
        break;
    }
}

// Использование выбранного алгоритма
$hmac = hash_hmac($selectedAlgo, 'важные данные', 'секретный ключ');
echo "HMAC: $hmac";
?>
Выбран алгоритм: sha3-512
HMAC: 2e9b... (длинная хеш-строка)
Сравнение списков hash_algos() и hash_hmac_algos()
Пример php
<?
$all_algos = hash_algos();
$hmac_algos = hash_hmac_algos();
$non_hmac_algos = array_diff($all_algos, $hmac_algos);

echo 'Алгоритмы, не поддерживающие HMAC: ';
print_r($non_hmac_algos);
?>
Алгоритмы, не поддерживающие HMAC:
Array
(
    [0] => adler32
    [1] => crc32
    [2] => crc32b
    [3] => fnv132
    [4] => fnv1a32
    [5] => fnv164
    [6] => fnv1a64
    [7] => joaat
)
Создание таблицы поддержки алгоритмов
Пример php
<?
echo '';
echo '';

foreach (hash_algos() as $algo) {
    $supports_hmac = in_array($algo, hash_hmac_algos()) ? 'Да' : 'Нет';
    echo "";
}
echo '
АлгоритмПоддерживает HMAC
$algo$supports_hmac
'; ?>

...

...
АлгоритмПоддерживает HMAC
md2Да
md4Да
adler32Нет
Верификация подписи API с выбором алгоритма из заголовка
Пример php
<?
// Симуляция HTTP-заголовка
$headerAlgo = 'sha256'; // Может приходить из заголовка X-Signature-Algorithm
$receivedSignature = 'abcd1234...'; // Пришедшая подпись
$payload = 'тело запроса';
$secretKey = 'API_SECRET';

if (in_array($headerAlgo, hash_hmac_algos())) {
    $calculatedSignature = hash_hmac($headerAlgo, $payload, $secretKey);
    if (hash_equals($calculatedSignature, $receivedSignature)) {
        echo 'Подпись верна.';
    } else {
        echo 'Ошибка верификации подписи.';
    }
} else {
    echo "Алгоритм $headerAlgo не поддерживается для HMAC.";
}
?>
Подпись верна.

PHP hash_hmac_algos function comments

En
Hash hmac algos Return a list of registered hashing algorithms suitable for hash_hmac