MD5 (Message Digest Algorithm 5) — криптографическая хеш-функция, разработанная Рональдом Ривестом в 1991 году. Она принимает входные данные произвольной длины и преобразует их в фиксированную строку длиной 128 бит (16 байт), обычно представляемую в виде 32-символьной шестнадцатеричной строки.
Основные свойства MD5:
Пример:
const CryptoJS = require("crypto-js");
const hash = CryptoJS.MD5("hello world").toString();
console.log(hash); // 5eb63bbbe01eeed093cb22bb8f5acdc3
Алгоритм MD5 работает по следующей схеме:
Дополнение сообщения (padding) Исходные данные дополняются до длины, кратной 512 битам.
Добавление длины сообщения В конец добавляется 64-битное представление длины исходного сообщения.
Инициализация буфера Используются четыре 32-битных регистра (A, B, C, D) с фиксированными начальными значениями.
Основной цикл обработки Сообщение разбивается на блоки по 512 бит и обрабатывается через 4 раунда по 16 операций.
Формирование итогового хеша Результат объединяет значения регистров A, B, C, D.
Библиотека Crypto-js предоставляет удобный интерфейс для работы с MD5.
const CryptoJS = require("crypto-js");
const hash = CryptoJS.MD5("password").toString();
const data = CryptoJS.enc.Utf8.parse("password");
const hash = CryptoJS.MD5(data);
hash.toString(CryptoJS.enc.Hex);
hash.toString(CryptoJS.enc.Base64);
Crypto-js позволяет обрабатывать данные частями:
const md5 = CryptoJS.algo.MD5.create();
md5.update("hello ");
md5.update("world");
const hash = md5.finalize().toString();
Подход полезен при работе с большими потоками данных.
Несмотря на устаревание с точки зрения безопасности, MD5 продолжает использоваться в ряде задач.
MD5 широко применяется для:
const fileHash = CryptoJS.MD5(fileContent).toString();
Используется для генерации ключей:
const cacheKey = CryptoJS.MD5(JSON.stringify(query)).toString();
Позволяет выявлять дубликаты:
const id = CryptoJS.MD5(data).toString();
Например:
MD5 считается криптографически небезопасным и не должен использоваться в задачах безопасности.
Коллизия — ситуация, когда два разных входа дают одинаковый хеш.
MD5 подвержен коллизиям:
Злоумышленник может:
Хотя атаки на прообраз сложнее, алгоритм не соответствует современным требованиям.
MD5:
Пример небезопасного использования:
const hash = CryptoJS.MD5(password).toString();
Быстрое вычисление — преимущество для целостности данных, но недостаток для безопасности.
Современные атаки:
| Алгоритм | Длина хеша | Безопасность | Скорость |
|---|---|---|---|
| MD5 | 128 бит | Низкая | Очень высокая |
| SHA-1 | 160 бит | Низкая | Высокая |
| SHA-256 | 256 бит | Высокая | Средняя |
| bcrypt | переменная | Очень высокая | Низкая |
| scrypt | переменная | Очень высокая | Низкая |
MD5 допустим в случаях:
Недопустим:
const hash = CryptoJS.SHA256("password").toString();
const hash = CryptoJS.SHA512("password").toString();
const hmac = CryptoJS.HmacSHA256("message", "secret").toString();
Crypto-js реализует MD5 как часть модуля
CryptoJS.algo:
Пример низкоуровневого API:
const md5 = CryptoJS.algo.MD5.create();
md5.update(CryptoJS.enc.Utf8.parse("data"));
const result = md5.finalize();
MD5 — быстрый и удобный инструмент для хеширования, но полностью устаревший в контексте криптографической безопасности. Его применение ограничено задачами, где не требуется защита от атак, а при малейшем риске компрометации необходимо использовать более современные алгоритмы.