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
$key = 'секретный_ключ';
$data = 'сообщение';
echo hash_hmac('sha256', $data, $key);
// Эквивалентно:
echo hash('sha256', $data, HASH_HMAC, $key);5f4d3c2b1a9e8f7d6c5b4a3928e7d6c5b4a39281f2e3d4c5b6a798f8e7d6c5b4a
Похожие функции в PHP
Специализированная функция для создания HMAC-хешей. Удобнее в использовании по сравнению с hash() с флагом HASH_HMAC, обеспечивает более читаемый код.
Узкоспециализированные функции для конкретных алгоритмов. Рекомендуется использовать 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
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().
$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
Добавлена поддержка алгоритма xxHash. Улучшена производительность для некоторых алгоритмов хеширования.
Функция hash() и связанные с ней функции теперь возвращают значение типа string|null вместо false в случае ошибки. Некритические ошибки преобразованы в исключения.
Добавлена поддержка алгоритма crc32c. Улучшена производительность хеширования больших файлов.
Параметр options заменен на flags в альтернативном синтаксисе. Добавлена поддержка алгоритмов серии SHA-3.
Расширенные примеры
$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 Файлы идентичны
$context = hash_init('sha256');
hash_update($context, 'Часть 1');
hash_update($context, 'Часть 2');
hash_update($context, 'Часть 3');
$result = hash_final($context);
echo $result;c4d4f5e6d7c8b9a0f1e2d3c4b5a6978f9e0d1c2b3a495867f8e9d0c1b2a3f4e5d6
function generate_uid($data) {
return substr(hash('sha512', uniqid($data, true)), 0, 32);
}
echo generate_uid('user_');f8e7d6c5b4a39281f2e3d4c5b6a798f8e
$password = 'секрет';
$salt = random_bytes(16);
$iterations = 100000;
$key = hash_pbkdf2('sha256', $password, $salt, $iterations, 32);
echo "Производный ключ: $key";Производный ключ: 1a2b3c4d5e6f7890abcdef1234567890fedcba0987654321
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 ? 'Данные целы' : 'Данные повреждены';Данные целы