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

Работа с функцией hash в PHP: полное руководство с примерами
Раздел: Хеширование и шифрование
hash(string $algo, string $data, bool $binary = false, array $options = []): string

Функция hash в PHP

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

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

Функция имеет две формы синтаксиса:

string hash(string $algo, string $data, bool $binary = false)

и

string hash(string $algo, string $data, int $flags = 0, string $key = "")
Параметры:
  • algo - название алгоритма хеширования (например, 'md5', 'sha256', 'sha512'). Список поддерживаемых алгоритмов можно получить с помощью функции hash_algos().
  • data - входные данные для хеширования в виде строки.
  • binary - при значении true функция возвращает хеш в виде двоичных данных, при false (по умолчанию) возвращается шестнадцатеричная строка.
  • flags - комбинация констант, определяющих режим работы. Доступные значения: HASH_HMAC (для HMAC-хеширования).
  • key - секретный ключ, используемый при HMAC-хешировании.

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

Базовое хеширование
echo hash('sha256', 'Привет, мир!');
echo "\n";
echo hash('md5', 'test');
8b5c6f7d4e3a2b1c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5
098f6bcd4621d373cade4e832627b4f6
Двоичный формат вывода
$binary_hash = hash('sha256', 'данные', true);
echo bin2hex($binary_hash);
a3f5c7e2d8b9a1f4e6c8b7a5d9e3f2c1a4b6d8e7f9c5a3b2e1d4f6c8a9b7e5d3
HMAC-хеширование
$key = 'секретный_ключ';
$data = 'сообщение';
echo hash_hmac('sha256', $data, $key);
// Эквивалентно:
echo hash('sha256', $data, HASH_HMAC, $key);
5f4d3c2b1a9e8f7d6c5b4a3928e7d6c5b4a39281f2e3d4c5b6a798f8e7d6c5b4a

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

Специализированная функция для создания HMAC-хешей. Удобнее в использовании по сравнению с hash() с флагом HASH_HMAC, обеспечивает более читаемый код.

md5() и sha1()

Узкоспециализированные функции для конкретных алгоритмов. Рекомендуется использовать hash() для единообразия кода и поддержки новых алгоритмов.

password_hash()

Предназначена для хеширования паролей с использованием современных алгоритмов (bcrypt, Argon2). Автоматически добавляет соль и обеспечивает безопасное хранение паролей. Для паролей следует использовать именно эту функцию.

Низкоуровневая функция для хеширования паролей, совместимая с системной функцией crypt. Менее удобна, чем password_hash().

Аналоги в других языках

Hash в Python

import hashlib
# Базовое хеширование
result = hashlib.sha256(b'Hello').hexdigest()
print(result)
# HMAC
import hmac
hmac_result = hmac.new(b'key', b'message', 'sha256').hexdigest()
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d
JavaScript (Node.js)
const crypto = require('crypto');
// Базовое хеширование
const hash = crypto.createHash('sha256').update('Hello').digest('hex');
console.log(hash);
// HMAC
const hmac = crypto.createHmac('sha256', 'key').update('message').digest('hex');
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d

Hash в MySQL

SELECT SHA2('Hello', 256) as hash;
SELECT MD5('test');
hash: 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
MD5: 098f6bcd4621d373cade4e832627b4f6

Основные отличия от PHP: в Python и JavaScript требуется явное преобразование данных в байтовые строки, в MySQL хеширование доступно на уровне запросов к базе данных.

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

Использование устаревших алгоритмов
// Небезопасно для паролей
$hash = hash('md5', 'password123');
echo $hash;
482c811da5d5b4bc6d497ffa98491e38

Для паролей необходимо использовать password_hash().

Неправильный формат ключа для HMAC
$result = hash('sha256', 'data', HASH_HMAC);
// Ключ не указан
Warning: hash() expects at most 4 parameters, 3 given
Сравнение хешей без защиты от атак по времени
// Уязвимый код
if ($hash === $expected_hash) {
    // доступ разрешен
}

Для сравнения хешей следует использовать hash_equals().

Неправильная обработка двоичных данных
$binary = hash('sha256', 'data', true);
echo $binary; // Вывод нечитаемых символов
��W��K��\.M��^�x�\����V�a

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

PHP 8.1

Добавлена поддержка алгоритма xxHash. Улучшена производительность для некоторых алгоритмов хеширования.

PHP 8.0

Функция hash() и связанные с ней функции теперь возвращают значение типа string|null вместо false в случае ошибки. Некритические ошибки преобразованы в исключения.

PHP 7.4

Добавлена поддержка алгоритма crc32c. Улучшена производительность хеширования больших файлов.

PHP 5.6 и выше

Параметр options заменен на flags в альтернативном синтаксисе. Добавлена поддержка алгоритмов серии SHA-3.

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

Хеширование файлов
Пример php
$file_hash = hash_file('sha256', 'large_file.zip');
echo "Хеш файла: $file_hash\n";
// Сравнение хешей файлов
$hash1 = hash_file('md5', 'file1.txt');
$hash2 = hash_file('md5', 'file2.txt');
if (hash_equals($hash1, $hash2)) {
    echo "Файлы идентичны";
}
Хеш файла: a1b2c3d4e5f678901234567890abcdef1234567890abcdef
Файлы идентичны
Итеративное хеширование
Пример php
$context = hash_init('sha256');
hash_update($context, 'Часть 1');
hash_update($context, 'Часть 2');
hash_update($context, 'Часть 3');
$result = hash_final($context);
echo $result;
c4d4f5e6d7c8b9a0f1e2d3c4b5a6978f9e0d1c2b3a495867f8e9d0c1b2a3f4e5d6
Генерация уникальных идентификаторов
Пример php
function generate_uid($data) {
    return substr(hash('sha512', uniqid($data, true)), 0, 32);
}
echo generate_uid('user_');
f8e7d6c5b4a39281f2e3d4c5b6a798f8e
Создание производного ключа
Пример php
$password = 'секрет';
$salt = random_bytes(16);
$iterations = 100000;
$key = hash_pbkdf2('sha256', $password, $salt, $iterations, 32);
echo "Производный ключ: $key";
Производный ключ: 1a2b3c4d5e6f7890abcdef1234567890fedcba0987654321
Проверка целостности данных
Пример php
function verify_data($data, $expected_hash) {
    $actual_hash = hash('sha256', $data);
    return hash_equals($expected_hash, $actual_hash);
}
$data = 'важные данные';
$stored_hash = hash('sha256', $data);
// После передачи или хранения
$is_valid = verify_data($data, $stored_hash);
echo $is_valid ? 'Данные целы' : 'Данные повреждены';
Данные целы

PHP hash function comments

En
Hash Generate a hash value (message digest)