md5()
Статья о функции PHP md5(), которая вычисляет MD5-хеш строки. Синтаксис, параметры, примеры и рекомендации по безопасному использованию.
Функция PHP md5() вычисляет MD5-хеш строки. MD5 (Message-Digest Algorithm 5) — это односторонняя функция: она преобразует любые входные данные в фиксированное 128-битное значение, и восстановить исходную строку из результата невозможно. На этой странице рассматриваются синтаксис, параметры, выполняемые примеры, случаи, когда MD5 по-прежнему уместен, и ситуации, когда необходимо использовать более безопасную альтернативу.
Синтаксис
md5(string $str, bool $raw_output = false): stringФункция принимает два параметра:
$str— входная строка для хеширования.$raw_output— необязательный boolean. Когда значение равноfalse(по умолчанию),md5()возвращает 32-символьную строку в нижнем регистре в шестнадцатеричном формате. Когда значение равноtrue, возвращается необработанный 16-байтовый двоичный хеш.
Возвращаемое значение всегда имеет одинаковую длину для заданного режима, независимо от длины входных данных — однобуквенная строка и файл размером в один мегабайт дают одинаковый 32-символьный шестнадцатеричный дайджест.
Базовый пример
Здесь $string содержит некоторый текст, а md5() возвращает его шестнадцатеричный дайджест. Результат — 32-символьная шестнадцатеричная строка:
ed076287532e86365e841e92bfc50d8cОдни и те же входные данные всегда дают одинаковый дайджест, поэтому MD5 является детерминированной функцией — это удобно для сравнения или индексирования данных, но означает и то, что злоумышленник может заранее вычислить хеши распространённых значений.
Необработанный двоичный вывод
<?php
$hash = md5("Hello World!", true);
echo bin2hex($hash);
?>Когда $raw_output равно true, md5() возвращает необработанный 16-байтовый двоичный хеш вместо шестнадцатеричного. Это вдвое меньше, чем шестнадцатеричная форма, что удобно при хранении дайджеста в колонке базы данных BINARY(16). Здесь мы передаём его через bin2hex() для вывода, поэтому результат идентичен режиму по умолчанию:
ed076287532e86365e841e92bfc50d8cКогда использовать MD5 (и когда не стоит)
MD5 работает быстро, но криптографически скомпрометирован — коллизии (два различных входных значения с одинаковым хешем) можно создавать намеренно. Выбирайте в зависимости от задачи:
- Допустимо: быстрые контрольные суммы без требований к безопасности, ключи кеша, дедупликация файлов или взаимодействие с устаревшей системой, уже хранящей MD5-дайджесты.
- Недопустимо: хранение паролей и цифровые подписи. Используйте
password_hash()для паролей иhash('sha256', ...)или более стойкий алгоритм для обеспечения целостности данных при угрозе атаки.
<?php
// Bad — never store passwords like this:
$bad = md5($password);
// Good — purpose-built, salted, slow on purpose:
$good = password_hash($password, PASSWORD_DEFAULT);Предупреждение: Не используйте
md5()для хеширования паролей или цифровых подписей. Функция подходит только для контрольных сумм без требований к безопасности или для совместимости с устаревшими системами.
Связанные функции
sha1()— формирует более длинный 160-битный хеш; также утратил устойчивость к коллизиям.crc32()— быстрая 32-битная контрольная сумма для обнаружения ошибок, не для хеширования.bin2hex()— преобразует необработанный двоичный результатmd5(..., true)в читаемую шестнадцатеричную строку.