Skip to content
Назад к блогу
Руководства

MD5 и SHA-256: сравнение алгоритмов хеширования для разработчиков

Сравниваем MD5, SHA-1, SHA-256 и SHA-512 по безопасности, скорости и размеру вывода. Выбираем хеш для контрольных сумм и хранения паролей.

12 мин чтения

MD5 и SHA-256: какой алгоритм хеширования выбрать?

Хеширование — одна из самых базовых операций в вычислениях, и тем не менее неверный выбор алгоритма может открыть систему для коллизионных атак, повреждения данных или ненужных потерь производительности. Это руководство сравнивает четыре самых распространённых алгоритма хеширования и даёт чёткую рамку для принятия решения.

Что такое хеш-функция?

Криптографическая хеш-функция принимает произвольные входные данные и выдаёт вывод фиксированного размера («digest» или «хеш»). Хорошая хеш-функция обладает тремя свойствами:

  1. Детерминированность: один и тот же вход всегда даёт один и тот же вывод.
  2. Однонаправленность: невозможно обратить хеш и восстановить исходный вход.
  3. Стойкость к коллизиям: вычислительно невозможно найти два разных входа, дающих одинаковый хеш.

Когда свойство №3 нарушается, алгоритм считают «криптографически сломанным» — именно это случилось с MD5 и SHA-1.

Сравнение алгоритмов с первого взгляда

СвойствоMD5SHA-1SHA-256SHA-512
Размер вывода128 бит (32 hex-символа)160 бит (40 hex-символов)256 бит (64 hex-символа)512 бит (128 hex-символов)
Размер блока512 бит512 бит512 бит1024 бит
Год появления1991199520012001
АвторRon RivestNSA / NISTNSA / NISTNSA / NIST
Стойкость к коллизиямСломан (2004)Сломан (2017)БезопасенБезопасен
Скорость (относительная)Самый быстрыйБыстрыйУмереннаяУмеренная (быстрее на 64-бит)
Статус NISTDeprecatedDeprecatedРекомендованРекомендован

MD5: быстрый, но сломанный

MD5 (Message-Digest Algorithm 5) разработан Рональдом Ривестом в 1991 году и стал де-факто стандартом для контрольных сумм в 1990-е и начале 2000-х. Производит 128-битный хеш из 32 шестнадцатеричных символов.

Почему MD5 сломан

В 2004 году Сяоюнь Ван продемонстрировала практические коллизионные атаки против MD5. К 2008 году исследователи создали поддельный SSL-сертификат на основе MD5-коллизии, доказав, что атака не теоретическая. Сегодня MD5-коллизии генерируются за секунды на потребительском железе.

// Получение MD5-хеша (только для не-secure сценариев)
// Web Crypto API не поддерживает MD5 — используйте библиотеку
import { md5 } from 'hash-wasm';

const hash = await md5('Hello, World!');
console.log(hash);
// → 'bea8252ff4e80f41719ea13cdf007273' (32 hex-символа)

Когда MD5 ещё уместен

Несмотря на криптографическую сломанность, MD5 остаётся полезен в задачах вне сферы безопасности:

  • Дедупликация файлов: обнаружение дубликатов в системах хранения
  • Ключи кеша: генерация коротких детерминированных ключей для поиска в кеше
  • Контрольные суммы целостности: быстрая проверка, что данные случайно не повредились (но не намеренно подделаны)
  • Совместимость с legacy: взаимодействие со старыми системами, требующими MD5

Ключевое различие: MD5 защищает от случайного повреждения, но не от намеренной манипуляции.

SHA-1: deprecated, но всё ещё встречается

SHA-1 (Secure Hash Algorithm 1) разработан NSA и опубликован NIST в 1995 году. Производит 160-битный хеш из 40 шестнадцатеричных символов.

В 2017 году Google и CWI Amsterdam продемонстрировали первую практическую коллизию SHA-1 (атака «SHAttered»), сгенерировав два разных PDF-файла с одинаковым SHA-1-хешем. К 2016 году крупные браузеры и удостоверяющие центры уже отказывались от SHA-1-сертификатов.

Используйте SHA-1 только для совместимости с системами, где он обязателен (например, Git хранит SHA-1 для commit-хешей, хотя и переходит на SHA-256). Для любой новой разработки выбирайте SHA-256 или сильнее.

SHA-256: текущий стандарт

SHA-256 — часть семейства SHA-2, разработанного NSA и опубликованного NIST в 2001 году. Производит 256-битный хеш из 64 шестнадцатеричных символов и в 2026 году рекомендован практически для любого хеширования.

// Получение SHA-256-хеша через Web Crypto API (нативно в браузере)
async function sha256(text) {
  const data = new TextEncoder().encode(text);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

const hash = await sha256('Hello, World!');
console.log(hash);
// → 'dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f'

Почему SHA-256 — выбор по умолчанию

  • Нет известных атак: на 2026 год не существует практических коллизионных или прообразных атак
  • Нативно в браузере: доступен через Web Crypto API во всех современных браузерах — библиотеки не нужны
  • Промышленный стандарт: применяется в TLS-сертификатах, Bitcoin, пакетных менеджерах (npm, pip), Docker image digest и большинстве систем проверки целостности
  • Одобрен NIST: рекомендован для всех security-критичных приложений

SHA-512: когда нужно больше

SHA-512 производит 512-битный хеш из 128 шестнадцатеричных символов. Использует размер блока 1024 бит (против 512 у SHA-256), что делает его быстрее на 64-битных процессорах — за один цикл обрабатывается больше данных.

# Python: SHA-512 такой же простой, как SHA-256
import hashlib

hash_256 = hashlib.sha256(b'Hello, World!').hexdigest()
hash_512 = hashlib.sha512(b'Hello, World!').hexdigest()

print(f"SHA-256: {hash_256}")  # 64 символа
print(f"SHA-512: {hash_512}")  # 128 символов

Применяйте SHA-512, когда:

  • Нужен больший security-margin (256-битная стойкость к коллизиям против 128-битной у SHA-256)
  • Платформа 64-битная и важна производительность (SHA-512 может быть в 1,5 раза быстрее SHA-256 на x86-64)
  • Этого требует протокол или спецификация (некоторые сертификатные схемы, специфические compliance-требования)

Для большинства приложений SHA-256 достаточен. Дополнительная длина SHA-512-хеша удваивает хранение и трафик без практической пользы по безопасности в типичных сценариях.

Рамка решения: какой хеш использовать

Для целостности файлов и контрольных сумм

Используйте SHA-256. Это стандарт для проверки скачиваемых файлов, сравнения содержимого и обнаружения повреждений. Если вы заменяете существующую MD5-систему, SHA-256 — drop-in замена.

# Проверка целостности скачанного файла
sha256sum downloaded-file.tar.gz
# Сравните вывод с опубликованным хешем

Для хранения паролей

Не применяйте напрямую ни MD5, ни SHA-256. Хеш-функции общего назначения слишком быстры для паролей — атакующий может проверять миллиарды вариантов в секунду. Вместо этого используйте специализированный алгоритм для паролей:

АлгоритмСтатусЗамечания
Argon2idРекомендованПобедитель Password Hashing Competition 2015; memory-hard
bcryptХорошоШирокая поддержка; встроенная соль; настраиваемый work factor
scryptХорошоMemory-hard; используется в некоторых криптовалютах
PBKDF2ПриемлемоОдобрен NIST, но не memory-hard; используйте ≥600 000 итераций
SHA-256НедостаточноСлишком быстрый; нет встроенной соли; уязвим к GPU-атакам
MD5ОпасноСломан + слишком быстрый; легко взламывается
// НЕВЕРНО: не хешируйте пароли через SHA-256
const hash = await sha256(password); // Подбирается миллиардами в секунду

// ВЕРНО: используйте bcrypt (пример Node.js)
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12); // 12 раундов = ~250 мс
const isValid = await bcrypt.compare(input, hash);

Для HMAC и аутентификации сообщений

Используйте SHA-256 с HMAC. HMAC (Hash-based Message Authentication Code) сочетает хеш-функцию с секретным ключом для проверки целостности и подлинности:

// HMAC-SHA256 для проверки подписи webhook
async function verifyWebhook(payload, signature, secret) {
  const key = await crypto.subtle.importKey(
    'raw', new TextEncoder().encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']
  );
  const sig = Uint8Array.from(atob(signature), c => c.charCodeAt(0));
  return crypto.subtle.verify('HMAC', key, sig, new TextEncoder().encode(payload));
}

Для content-addressable хранения

Используйте SHA-256. Git, Docker и IPFS применяют content-addressable storage, где хеш контента служит его адресом. SHA-256 даёт достаточную стойкость к коллизиям, чтобы гарантировать уникальность среди миллиардов объектов.

Бенчмарки производительности

Относительная скорость хеширования на современном x86-64 процессоре (выше = быстрее):

АлгоритмПропускная способность (МБ/с)Относительная скорость
MD5~32001,0× (базовая)
SHA-1~24000,75×
SHA-256~15000,47×
SHA-512~21000,66×

Замечание: SHA-512 быстрее SHA-256 на 64-битных процессорах из-за более широкого внутреннего состояния. На 32-битных системах ситуация обратная. Для большинства приложений разница в скорости не имеет значения — хеширование 1 МБ занимает менее 1 мс любым из этих алгоритмов.

Типичные ошибки, которых стоит избегать

1. Использование MD5 для безопасности

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

2. Хеширование паролей через SHA-256

SHA-256 — не парольный хеш. Он слишком быстрый, без встроенной соли и уязвим к радужным таблицам и GPU-ускоренной brute-force атаке. Используйте Argon2id или bcrypt — подробное сравнение в сравнении bcrypt, Argon2 и scrypt. Математика устойчивости к brute-force разобрана в руководстве по энтропии паролей.

3. Уверенность, что длина хеша равна безопасности

512-битный хеш не «более безопасен» автоматически по сравнению с 256-битным с точки зрения стойкости к коллизиям. Запас прочности SHA-256 (128-битная коллизионная стойкость) уже далеко за пределами возможностей brute-force. Выбирайте по реальным требованиям, а не по длине хеша.

4. Самописные комбинации хешей

Паттерны вроде SHA256(MD5(data)) или MD5(data + salt) не магически чинят сломанный алгоритм. Используйте один хорошо проверенный алгоритм (SHA-256) или правильную конструкцию (HMAC).

Попробуйте сами

Получайте и сравнивайте MD5, SHA-1, SHA-256 и SHA-512 хеши мгновенно с нашим генератором хешей — вставьте текст или загрузите файл и увидьте все четыре digest рядом. На 100% работает в браузере, данные никогда не покидают устройство.

Подборка материалов по веб-безопасности (аутентификация, валидация ввода, security-заголовки) разобрана в руководстве по основам веб-безопасности; обзор базовых инструментов разработчика (кодирование, хеширование и преобразование данных) см. в подборке базовых инструментов разработчика.

Часто задаваемые вопросы

MD5 ещё безопасен для контрольных сумм?

MD5 безопасен для обнаружения случайной порчи файла — если файл повредился при скачивании, MD5-хеш почти наверняка изменится. Однако MD5 не защищает от намеренной подделки: атакующий может подобрать модифицированный файл с тем же MD5-хешем. Для проверки целостности там, где атакующий — часть модели угроз (например, дистрибуция софта), используйте SHA-256.

Насколько SHA-256 медленнее MD5?

SHA-256 примерно в 2 раза медленнее MD5 по сырой пропускной способности. На современном железе MD5 выдаёт около 3200 МБ/с, а SHA-256 — около 1500 МБ/с. На практике эта разница незначима для большинства приложений: вычисление SHA-256 для файла 100 МБ занимает около 70 мс. Разница в скорости важна только для очень высоконагруженных сценариев — анализ сетевых пакетов или дедупликация в хранилище промышленного масштаба.

Использовать SHA-256 или SHA-512?

Используйте SHA-256 для большинства приложений — он даёт 128-битную коллизионную стойкость, что заметно превосходит возможности brute-force. Выбирайте SHA-512, если: (а) платформа 64-битная и нужна максимальная пропускная способность, (б) этого требует спецификация или compliance, (в) нужен больший security-margin для долгосрочной целостности данных. Дополнительная длина SHA-512 удваивает объём хранения и редко необходима.

Можно ли взломать или обратить SHA-256?

SHA-256 нельзя обратить — это однонаправленная функция. На 2026 год не существует практических прообразных или коллизионных атак против SHA-256. Лучшая известная атака требует 2¹²⁸ операций для коллизии, что вычислительно неосуществимо современными или обозримыми технологиями. SHA-256 одобрен NIST и применяется в критической инфраструктуре, включая TLS, Bitcoin и федеральные системы.

Почему некоторые системы всё ещё используют MD5, если он сломан?

Главная причина — совместимость с legacy. Многие существующие системы, протоколы и форматы файлов проектировались вокруг MD5 до обнаружения его слабостей. Миграция требует скоординированных изменений во всех компонентах. Для не-security сценариев — кеширование и дедупликация — преимущество MD5 в скорости и более коротком выводе делает его прагматичным выбором, где коллизионные атаки не часть модели угроз.

Похожие статьи

Все статьи