Md5: примеры (PHP)
md5(string $string, bool $binary = false): stringФункция md5() в PHP вычисляет MD5-хэш строки. MD5 (Message Digest Algorithm 5) – это широко используемая криптографическая хеш-функция, которая генерирует 128-битный (16-байтовый) хеш, обычно представляемый в виде 32-значного шестнадцатеричного числа.
Использование функции связано с созданием уникального отпечатка или контрольной суммы для данных. Применяют для проверки целостности данных, создания уникальных ключей в базах данных или файловых системах, а также для создания электронных подписей. Важно отметить, что из-за уязвимостей MD5 не рекомендуется для защиты паролей или других критически важных с точки зрения безопасности данных.
- string
$string(обязательный): Исходная строка для хеширования. - bool
$binary(необязательный): Если аргументу задано значениеtrue, функция возвращает хеш в виде бинарных данных длиной 16 байт. По умолчаниюfalse, что приводит к возврату 32-символьного шестнадцатеричного числа.
Базовый пример с возвратом шестнадцатеричной строки.
<?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 'Данные были модифицированы.';
}
?>Данные были модифицированы.
- sha1(): Генерирует 160-битный (40-символьный) хеш SHA-1. Так же, как и MD5, считается криптографически нестойкой для защиты.
- hash(): Универсальная функция для работы с различными алгоритмами хеширования (например, sha256, sha512, ripemd160). Предпочтительна для задач, требующих выбора конкретного алгоритма.
- password_hash(): Специальная функция для безопасного хеширования паролей. Использует стойкие алгоритмы (bcrypt, argon2) и автоматическую генерацию соли. Является стандартом для работы с паролями в современных PHP-приложениях вместо md5 или sha1.
- crc32(): Вычисляет полином CRC32 для строки. Быстрее, но предназначена только для контроля целостности данных, не для криптографии. Возвращает целое число.
Md5 в Python
import hashlib
result = hashlib.md5('Привет, мир!'.encode('utf-8'))
print(result.hexdigest())f4c1d1cb2c30fe6b2c6175ee1b5a6a0c
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 вычисляет хеш на стороне СУБД.
Это самая серьезная ошибка, так как 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 8.0 поведение функции md5() не изменилось. Однако важно отметить общий контекст: с версии PHP 5.5 существует функция password_hash(), которая стала стандартом де-факто для хеширования паролей, что делает прямое использование md5() для этой цели устаревшей практикой. На уровне рекомендаций и best practices использование MD5 для новых проектов, связанных с безопасностью, крайне не рекомендуется.
<?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
// Хотя для безопасности лучше использовать random_bytes()/bin2hex()
// MD5 может использоваться для создания непредсказуемой строки на основе микросекунд
$token = md5(uniqid(mt_rand(), true));
echo 'Токен: ' . $token;
// Пример результата: 7f8a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2
?><?php
$params = ['user_id' => 123, 'action' => 'view', 'page' => 10];
// Создание уникального ключа для массива параметров
$cache_key = 'cache_' . md5(serialize($params));
echo $cache_key;
?>cache_6146c1b5c38b49e4a6a4c7c9f8b5a3d2
<?php
$data = 'Объемные данные для хеширования';
$bin_hash = md5($data, true);
// Хранение 16 байт вместо 32 символов
$hex_for_display = bin2hex($bin_hash); // Преобразование обратно для сравнения
echo 'Бинарный хеш (hex для просмотра): ' . $hex_for_display;
?>Бинарный хеш (hex для просмотра): 1a7b3c8d9e0f1a2b3c4d5e6f7a8b9c0d1