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
$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
$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() вычисляют хэш файла с использованием конкретных алгоритмов, но без поддержки 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
Используется модуль 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
Улучшена обработка ошибок. Некритические ошибки теперь вызывают исключения Error. Изменено поведение при передаче пустого ключа.
Добавлена поддержка алгоритмов sha512/256 и sha512/224. Устарели алгоритмы с криптографическими недостатками, такие как adler32 и crc32.
Добавлен параметр binary для возврата бинарных данных.
Расширенные примеры
$uploadedFile = $_FILES['file']['tmp_name'];
$storedHash = '...'; // Хэш, полученный ранее
$key = 'secure-key';
$calculatedHash = hash_hmac_file('sha256', $uploadedFile, $key);
if ($calculatedHash === $storedHash) {
echo 'Файл валиден.';
} else {
echo 'Файл поврежден или изменен.';
}$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));$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);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');