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

MD5 хеширование в PHP: применение и практические примеры
Раздел: Хеширование и шифрование
md5(string $string, bool $binary = false): string
Описание функции md5 в PHP

Функция md5() в PHP вычисляет MD5-хэш строки. MD5 (Message Digest Algorithm 5) – это широко используемая криптографическая хеш-функция, которая генерирует 128-битный (16-байтовый) хеш, обычно представляемый в виде 32-значного шестнадцатеричного числа.

Назначение

Использование функции связано с созданием уникального отпечатка или контрольной суммы для данных. Применяют для проверки целостности данных, создания уникальных ключей в базах данных или файловых системах, а также для создания электронных подписей. Важно отметить, что из-за уязвимостей MD5 не рекомендуется для защиты паролей или других критически важных с точки зрения безопасности данных.

Аргументы функции
  • string $string (обязательный): Исходная строка для хеширования.
  • bool $binary (необязательный): Если аргументу задано значение true, функция возвращает хеш в виде бинарных данных длиной 16 байт. По умолчанию false, что приводит к возврату 32-символьного шестнадцатеричного числа.
Примеры использования md5()

Базовый пример с возвратом шестнадцатеричной строки.

<?php
$hash = md5('Привет, мир!');
echo $hash;
?>
f4c1d1cb2c30fe6b2c6175ee1b5a6a0c

Пример с возвратом бинарных данных.

<?php
$binary_hash = md5('Привет, мир!', true);
echo 'Длина бинарного хеша: ' . strlen($binary_hash);
echo '\n'; // Для наглядности
var_dump($binary_hash);
?>
Длина бинарного хеша: 16
string(16) "\xF4\xC1\xD1\xCB\,0\xFEk,au\xEE\x1BZj\f"

Сравнение двух хешей для проверки данных.

<?php
$data = 'Проверяемый текст';
$stored_hash = 'a3f8c1e2b5d4f7a6c9b8e1d2f3a4b5c6';
$current_hash = md5($data);
if ($current_hash === $stored_hash) {
    echo 'Данные не изменились.';
} else {
    echo 'Данные были модифицированы.';
}
?>
Данные были модифицированы.
Похожие функции в PHP
  • sha1(): Генерирует 160-битный (40-символьный) хеш SHA-1. Так же, как и MD5, считается криптографически нестойкой для защиты.
  • hash(): Универсальная функция для работы с различными алгоритмами хеширования (например, sha256, sha512, ripemd160). Предпочтительна для задач, требующих выбора конкретного алгоритма.
  • password_hash(): Специальная функция для безопасного хеширования паролей. Использует стойкие алгоритмы (bcrypt, argon2) и автоматическую генерацию соли. Является стандартом для работы с паролями в современных PHP-приложениях вместо md5 или sha1.
  • crc32(): Вычисляет полином CRC32 для строки. Быстрее, но предназначена только для контроля целостности данных, не для криптографии. Возвращает целое число.
Типичные ошибки
Использование для хранения паролей

Это самая серьезная ошибка, так как MD5 уязвим для атак перебором и радужных таблиц.

<?php
// НЕПРАВИЛЬНО!
$password_hash = md5('мой_пароль123');
// ПРАВИЛЬНО
$secure_hash = password_hash('мой_пароль123', PASSWORD_DEFAULT);
?>
Ожидание уникальности для любых данных

MD5 может генерировать коллизии (разные входные данные дают одинаковый хеш). Для уникальных идентификаторов лучше использовать uniqid() в сочетании с другими методами.

Неправильное сравнение хешей

Необходимо использовать строгое сравнение (===), чтобы избежать проблем с типами данных.

<?php
// Уязвимое сравнение (использует приведение типов)
if (md5('240610708') == '0') { // md5('240610708') = '0e462097431906509019562988736854'
    echo 'Магическая хеш-коллизия сработала!';
}
// Надежное сравнение
if (md5('240610708') === '0e462097431906509019562988736854') {
    echo 'Сравнение безопасно.';
}
?>
Магическая хеш-коллизия сработала!
Изменения в последних версиях PHP

В PHP 8.0 поведение функции md5() не изменилось. Однако важно отметить общий контекст: с версии PHP 5.5 существует функция password_hash(), которая стала стандартом де-факто для хеширования паролей, что делает прямое использование md5() для этой цели устаревшей практикой. На уровне рекомендаций и best practices использование MD5 для новых проектов, связанных с безопасностью, крайне не рекомендуется.

Расширенные примеры
Проверка целостности файла
Пример php
<?php
$filename = 'document.pdf';
$expected_file_hash = 'd41d8cd98f00b204e9800998ecf8427e'; // Хеш пустого файла

if (file_exists($filename)) {
    $file_hash = md5_file($filename); // md5_file() - аналог для файлов
    if ($file_hash === $expected_file_hash) {
        echo 'Файл цел и не изменялся.';
    } else {
        echo 'Хеш файла не совпадает. Файл был изменен или поврежден.';
    }
}
?>
Генерация уникального токена для ссылки сброса пароля
Пример php
<?php
// Хотя для безопасности лучше использовать random_bytes()/bin2hex()
// MD5 может использоваться для создания непредсказуемой строки на основе микросекунд
$token = md5(uniqid(mt_rand(), true));
echo 'Токен: ' . $token;
// Пример результата: 7f8a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2
?>
Создание хеш-таблицы или ключа для кеширования
Пример php
<?php
$params = ['user_id' => 123, 'action' => 'view', 'page' => 10];
// Создание уникального ключа для массива параметров
$cache_key = 'cache_' . md5(serialize($params));
echo $cache_key;
?>
cache_6146c1b5c38b49e4a6a4c7c9f8b5a3d2
Использование бинарного вывода для компактного хранения
Пример php
<?php
$data = 'Объемные данные для хеширования';
$bin_hash = md5($data, true);
// Хранение 16 байт вместо 32 символов
$hex_for_display = bin2hex($bin_hash); // Преобразование обратно для сравнения
echo 'Бинарный хеш (hex для просмотра): ' . $hex_for_display;
?>
Бинарный хеш (hex для просмотра): 1a7b3c8d9e0f1a2b3c4d5e6f7a8b9c0d1
Аналоги в других языках

Md5 в Python

import hashlib
result = hashlib.md5('Привет, мир!'.encode('utf-8'))
print(result.hexdigest())
f4c1d1cb2c30fe6b2c6175ee1b5a6a0c
JavaScript (Node.js)
const crypto = require('crypto');
const hash = crypto.createHash('md5').update('Привет, мир!').digest('hex');
console.log(hash);
f4c1d1cb2c30fe6b2c6175ee1b5a6a0c

Md5 в MySQL

SELECT MD5('Привет, мир!');
+----------------------------------+
| MD5('Привет, мир!')             |
+----------------------------------+
| f4c1d1cb2c30fe6b2c6175ee1b5a6a0c |
+----------------------------------+

Отличия: в Python и JS требуется явное преобразование строки в байты (кодирование). MySQL вычисляет хеш на стороне СУБД.

PHP md5 function comments

En
Md5 Calculate the md5 hash of a string