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

Функция hash_hmac_file для работы с файлами в PHP
Раздел: Хеширование и шифрование
hash_hmac_file(string $algo, string $filename, string $key, bool $binary = false): string|false

Функция hash_hmac_file в PHP

Общее описание

Функция hash_hmac_file() вычисляет HMAC-хэш файла, используя указанный алгоритм и ключ. HMAC (Hash-based Message Authentication Code) представляет собой механизм проверки целостности данных и их подлинности с помощью криптографической хэш-функции и секретного ключа.

Когда используется

Функция применяется для проверки целостности файлов, аутентификации данных, создания цифровых подписей файлов и обеспечения безопасности при передаче или хранении. Типичные сценарии включают проверку загруженных файлов, создание контрольных сумм для архивов и реализацию механизмов верификации в API.

Аргументы функции
  • algo (string): Имя алгоритма хэширования. Список поддерживаемых алгоритмов доступен через функцию hash_algos(). Например, 'sha256', 'md5', 'sha1'.
  • filename (string): Путь к файлу, для которого вычисляется HMAC.
  • key (string): Секретный ключ, используемый для генерации HMAC.
  • binary (bool, необязательный): Если установлен в true, функция возвращает сырые бинарные данные. По умолчанию false, возвращает строку в шестнадцатеричном формате.

Функция возвращает строку с HMAC-хэшем или false в случае ошибки.

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

Базовый пример с sha256
$file = 'document.txt';
$key = 'secret-key';
$hash = hash_hmac_file('sha256', $file, $key);
echo $hash;
7a5b8c3d6e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6
Использование с возвратом бинарных данных
$file = 'image.jpg';
$key = 'my-secret';
$hashBinary = hash_hmac_file('sha1', $file, $key, true);
echo bin2hex($hashBinary);
1a2b3c4d5e6f7890abcdef1234567890deadbeef
Использование с алгоритмом md5
$file = 'data.zip';
$key = '12345';
$hash = hash_hmac_file('md5', $file, $key);
echo $hash;
f1e2d3c4b5a69788796a5b4c3d2e1f0a

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

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

Функция hash_file() создает хэш-сумму файла без использования ключа. Применяется для проверки целостности файлов без необходимости аутентификации.

md5_file и sha1_file

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

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

Hash hmac file в Python

Используется модуль hmac с функциями new() и digest(). Отличие: требуется явное чтение файла.

import hmac
with open('file.txt', 'rb') as f:
    digest = hmac.new(b'secret', f.read(), 'sha256').hexdigest()
print(digest)
7a5b8c3d6e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6
JavaScript (Node.js)

Используется модуль crypto с методом createHmac(). Отличие: асинхронная обработка файлов через потоки.

const crypto = require('crypto');
const fs = require('fs');
const hmac = crypto.createHmac('sha256', 'secret');
const stream = fs.createReadStream('file.txt');
stream.on('data', (chunk) => hmac.update(chunk));
stream.on('end', () => console.log(hmac.digest('hex')));
7a5b8c3d6e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6

Hash hmac file в MySQL

Прямого аналога нет. Для строк доступна функция HMAC(). Для файлов требуется внешняя обработка.

SELECT HMAC('data', 'key', 'sha256');
1a2b3c4d...

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

Несуществующий файл

При указании неверного пути функция вернет false.

$hash = hash_hmac_file('sha256', 'missing.txt', 'key');
var_dump($hash);
bool(false)
Неподдерживаемый алгоритм

Использование неизвестного алгоритма вызывает предупреждение и возвращает false.

$hash = hash_hmac_file('unknown_algo', 'file.txt', 'key');
Warning: hash_hmac_file(): Unknown hashing algorithm: unknown_algo
Проблемы с чтением файла

Ошибки могут возникать из-за отсутствия прав доступа или блокировки файла.

Изменения в PHP

PHP 8.0

Улучшена обработка ошибок. Некритические ошибки теперь вызывают исключения Error. Изменено поведение при передаче пустого ключа.

PHP 7.2

Добавлена поддержка алгоритмов sha512/256 и sha512/224. Устарели алгоритмы с криптографическими недостатками, такие как adler32 и crc32.

PHP 5.1.2

Добавлен параметр binary для возврата бинарных данных.

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

Проверка целостности загруженного файла
Пример php
$uploadedFile = $_FILES['file']['tmp_name'];
$storedHash = '...'; // Хэш, полученный ранее
$key = 'secure-key';
$calculatedHash = hash_hmac_file('sha256', $uploadedFile, $key);
if ($calculatedHash === $storedHash) {
    echo 'Файл валиден.';
} else {
    echo 'Файл поврежден или изменен.';
}
Создание подписи для нескольких файлов
Пример php
$files = ['file1.txt', 'file2.txt'];
$key = 'secret';
$signatures = [];
foreach ($files as $file) {
    $signatures[$file] = hash_hmac_file('sha3-512', $file, $key, true);
}
// Сохранение подписей в файл
file_put_contents('signatures.bin', serialize($signatures));
Использование с потоковыми контекстами
Пример php
$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => 'Authorization: HMAC ' . hash_hmac_file('sha256', 'local.txt', 'key')
    ]
]);
$response = file_get_contents('http://example.com', false, $context);
Сравнение двух файлов
Пример php
function compareFilesHmac($file1, $file2, $key) {
    $hash1 = hash_hmac_file('sha256', $file1, $key);
    $hash2 = hash_hmac_file('sha256', $file2, $key);
    return hash_equals($hash1, $hash2);
}
$isEqual = compareFilesHmac('original.zip', 'copy.zip', 'my-key');

PHP hash_hmac_file function comments

En
Hash hmac file Generate a keyed hash value using the HMAC method and the contents of a given file