Hash hmac algos: примеры (PHP)
hash_hmac_algos: arrayФункция 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 существует несколько функций для работы с хешированием:
Возвращает полный список всех доступных алгоритмов хеширования, включая те, которые не поддерживают HMAC. Функция hash_hmac_algos() является её подмножеством.
Генерирует HMAC-хеш для указанных данных с использованием ключа и алгоритма. hash_hmac_algos() помогает проверить, можно ли использовать выбранный алгоритм с hash_hmac().
Создает хеш-сумму данных без использования ключа (не HMAC). Для проверки доступности алгоритмов используется hash_algos().
Функцию hash_hmac_algos() предпочтительнее использовать именно при работе с HMAC, чтобы убедиться в поддержке алгоритма для этой технологии.
import hashlib
# Получение множества доступных алгоритмов (включая HMAC-совместимые)
print(hashlib.algorithms_available)
# Проверка конкретного алгоритма
print('sha256' in hashlib.algorithms_available){'sha3_256', 'sha256', 'shake_128', 'sha384', ...}
Trueconst 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(), вызываются напрямую. Поддержка зависит от версии СУБД.
Основное отличие 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().
Функция 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 или внутренняя реализация).
<?
$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... (длинная хеш-строка)
<?
$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
)
<?
echo '';
echo 'Алгоритм Поддерживает HMAC ';
foreach (hash_algos() as $algo) {
$supports_hmac = in_array($algo, hash_hmac_algos()) ? 'Да' : 'Нет';
echo "$algo $supports_hmac ";
}
echo '
';
?>| Алгоритм | Поддерживает HMAC |
|---|---|
| md2 | Да |
| md4 | Да |
| adler32 | Нет |
<?
// Симуляция 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.";
}
?>Подпись верна.