DevToys Pro

бесплатные веб-инструменты для разработчиков

Блог
Оцените нас:
Попробуйте расширение для браузера:
← Назад к блогу

Сравнение алгоритмов хеширования: MD5, SHA-1, SHA-256, SHA-512, BLAKE2

14 мин чтения

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

Краткая сравнительная таблица

АлгоритмРазмер выводаСтатус безопасностиСкоростьПрименение
MD5128 битВзломанОчень быстрыйТолько контрольные суммы без безопасности
SHA-1160 битУстарелБыстрыйУстаревшие системы (избегайте для новых)
SHA-256256 битБезопасенУмеренныйОбщего назначения, критичный для безопасности
SHA-512512 битБезопасенУмеренныйДополнительный запас безопасности, 64-бит системы
BLAKE2bДо 512 битБезопасенОчень быстрыйКритичные к производительности приложения
BLAKE2sДо 256 битБезопасенОчень быстрый32-битные системы, встраиваемые

Детальный обзор алгоритмов

MD5 (Message-Digest Algorithm 5)

MD5 создаёт хеш-значение размером 128 бит (16 байт), обычно представляемое как 32-символьная шестнадцатеричная строка. Выпущен в 1991 году и годами был стандартом.

# Пример хеша MD5
echo -n "Hello World" | md5sum
# b10a8db164e0754105b7a99be72e3fe5

# Контрольная сумма файла
md5sum large-file.zip
# a3b5c7d9e1f2... large-file.zip

Почему он взломан: В 2004 году исследователи продемонстрировали атаки коллизий — нахождение двух разных входных данных, дающих одинаковый MD5-хеш. К 2012 году вредоносное ПО Flame использовало коллизии MD5 для подделки сертификатов Windows Update.

# Пример коллизии (концептуально)
# Разные файлы могут давать одинаковый MD5-хеш
md5(file_A) = "d41d8cd98f00b204e9800998ecf8427e"
md5(file_B) = "d41d8cd98f00b204e9800998ecf8427e"
# file_A != file_B (коллизия!)

Когда использовать MD5:

  • Контрольные суммы без требований безопасности (проверка передачи файла без угрозы злонамеренного вмешательства)
  • Дедупликация и кэширование (когда устойчивость к коллизиям не критична)
  • Совместимость с устаревшими системами

Когда НЕ использовать MD5:

  • Цифровые подписи
  • Проверка сертификатов
  • Любые критичные для безопасности приложения
  • Хеширование паролей (используйте bcrypt/Argon2)

SHA-1 (Secure Hash Algorithm 1)

SHA-1 создаёт хеш размером 160 бит (20 байт). Он был преемником MD5 и широко использовался в SSL-сертификатах, коммитах Git и цифровых подписях.

# Пример хеша SHA-1
echo -n "Hello World" | sha1sum
# 0a4d55a8d778e5022fab701977c5d840bbc486d0

# Git использует SHA-1 для идентификаторов коммитов
git log --oneline
# a3b5c7d Fix authentication bug

Почему он устарел: В 2017 году Google и CWI Amsterdam продемонстрировали первую практическую атаку коллизий SHA-1 (SHAttered). Они создали два разных PDF-файла с идентичными SHA-1 хешами.

# Атака SHAttered
sha1(pdf_good.pdf) = "38762cf7f55934b34d179ae6a4c80cadccbb7f0a"
sha1(pdf_evil.pdf) = "38762cf7f55934b34d179ae6a4c80cadccbb7f0a"
# Разное содержимое, одинаковый хеш!

Текущий статус:

  • Основные браузеры перестали принимать SHA-1 сертификаты в 2017 году
  • Git переходит на SHA-256 (git config --global init.objectFormat sha256)
  • Всё ещё используется в устаревших системах, но требует миграции

SHA-256 (семейство SHA-2)

SHA-256 является частью семейства SHA-2, создаёт хеш размером 256 бит (32 байта). В настоящее время это отраслевой стандарт для критичных к безопасности приложений.

# Пример хеша SHA-256
echo -n "Hello World" | sha256sum
# a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

# Проверка скачанного файла
curl -O https://example.com/software.tar.gz
curl -O https://example.com/software.tar.gz.sha256
sha256sum -c software.tar.gz.sha256
# software.tar.gz: OK

Почему SHA-256 — стандарт:

  • Нет известных практических атак (на 2026 год)
  • 256-битный вывод обеспечивает 128-битную устойчивость к коллизиям
  • Широко реализован во всех основных языках и системах
  • Используется в TLS-сертификатах, Bitcoin, цифровых подписях
# Пример SHA-256 на Python
import hashlib

def hash_file(filepath):
    sha256 = hashlib.sha256()
    with open(filepath, 'rb') as f:
        for chunk in iter(lambda: f.read(8192), b''):
            sha256.update(chunk)
    return sha256.hexdigest()

# Хеширование файла
file_hash = hash_file('document.pdf')
print(f"SHA-256: {file_hash}")

Используйте Генератор хешей/контрольных сумм для вычисления SHA-256 хешей текста, или Серверный калькулятор хешей для больших файлов.

SHA-512 (семейство SHA-2)

SHA-512 создаёт хеш размером 512 бит (64 байта). Он обеспечивает больший запас безопасности и на самом деле работает быстрее SHA-256 на 64-битных процессорах.

# Пример хеша SHA-512
echo -n "Hello World" | sha512sum
# 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e6...

# Сравнение длины вывода
SHA-256: 64 шестнадцатеричных символа (256 бит)
SHA-512: 128 шестнадцатеричных символов (512 бит)

Производительность SHA-256 vs SHA-512:

# На 64-битных системах (контринтуитивные результаты)
# SHA-512 использует 64-битные операции, нативные для 64-бит CPU
# SHA-256 использует 32-битные операции

# Типичные бенчмарки на современном 64-бит CPU:
SHA-256: ~500 МБ/с
SHA-512: ~700 МБ/с  # Быстрее несмотря на больший вывод!

# На 32-битных системах SHA-256 быстрее

Когда использовать SHA-512:

  • 64-битные серверные среды, где важна производительность
  • Когда нужен дополнительный запас безопасности для долгосрочного хранения
  • Приложения, уже использующие 512-битные хеши (HMAC-SHA-512 и т.д.)

BLAKE2 (BLAKE2b и BLAKE2s)

BLAKE2 — криптографическая хеш-функция, разработанная быть быстрее MD5 при безопасности уровня SHA-3. Имеет два варианта: BLAKE2b (оптимизирован для 64-бит) и BLAKE2s (оптимизирован для 32-бит).

# Пример BLAKE2b (Python)
import hashlib

# 256-битный хеш BLAKE2b
h = hashlib.blake2b(b"Hello World", digest_size=32)
print(h.hexdigest())
# 256-битный вывод

# 512-битный хеш BLAKE2b (по умолчанию)
h = hashlib.blake2b(b"Hello World")
print(h.hexdigest())
# 512-битный вывод

Преимущества производительности BLAKE2:

# Типичные бенчмарки на современном CPU:
MD5:      ~1000 МБ/с
SHA-256:  ~500 МБ/с
SHA-512:  ~700 МБ/с
BLAKE2b:  ~1000 МБ/с  # Так же быстр как MD5, но безопасен!
BLAKE2s:  ~800 МБ/с   # Для 32-битных систем

Почему BLAKE2 быстрый:

  • Разработан для современных архитектур CPU
  • Меньше раундов чем SHA-256 (12 vs 64) при эквивалентной безопасности
  • Оптимизирован для параллельного выполнения
  • Встроенное ключевое хеширование (MAC) без накладных расходов HMAC
# Ключевое хеширование BLAKE2 (встроенный MAC)
import hashlib

key = b"my-secret-key"
h = hashlib.blake2b(b"Message to authenticate", key=key)
print(h.hexdigest())

# Эквивалент HMAC-SHA-512, но быстрее
# Не нужно внешнее/внутреннее дополнение ключа как в HMAC

Когда использовать BLAKE2:

  • Критичные к производительности приложения (хеширование файлов, адресация по содержимому)
  • Новые проекты без требований совместимости с SHA-256
  • Когда нужны и хеширование, и MAC-функциональность
  • Встраиваемые/IoT системы (BLAKE2s для 32-бит)

Тесты производительности

Реальная производительность зависит от реализации, оборудования и размера данных. Вот типичные бенчмарки на современном оборудовании:

# Бенчмарк: Хеширование 1 ГБ файла на AMD Ryzen 9 5900X

Алгоритм    | Время     | Пропускная способность
------------|-----------|------------------------
MD5         | 0.98с     | 1020 МБ/с
SHA-1       | 1.52с     | 658 МБ/с
SHA-256     | 1.95с     | 513 МБ/с
SHA-512     | 1.41с     | 709 МБ/с
BLAKE2b     | 0.96с     | 1041 МБ/с
BLAKE2s     | 1.24с     | 806 МБ/с

# С аппаратным ускорением (инструкции SHA-NI):
SHA-256     | 0.31с     | 3226 МБ/с  # В 6 раз быстрее!

# Современные CPU с SHA-NI делают SHA-256 очень конкурентоспособным

Примечание об аппаратном ускорении: Процессоры Intel и AMD с расширениями SHA-NI могут значительно ускорить SHA-256. Проверьте:

# Linux: Проверка поддержки SHA-NI
grep -o 'sha_ni' /proc/cpuinfo | head -1
# Вывод: sha_ni (если поддерживается)

# macOS (Apple Silicon имеет аппаратный SHA)
sysctl hw.optional.armv8_sha256
# hw.optional.armv8_sha256: 1

Сравнение безопасности

Устойчивость к коллизиям

Устойчивость к коллизиям измеряет, насколько сложно найти два разных входа с одинаковым хешем. Для n-битного хеша идеальная устойчивость к коллизиям — 2^(n/2) операций (атака дня рождения).

# Устойчивость к коллизиям (операций для нахождения коллизии)
Алгоритм    | Выходные биты | Идеально     | Фактически (2026)
------------|---------------|--------------|------------------
MD5         | 128           | 2^64         | 2^18 (ВЗЛОМАН)
SHA-1       | 160           | 2^80         | 2^63 (ВЗЛОМАН)
SHA-256     | 256           | 2^128        | 2^128 (БЕЗОПАСЕН)
SHA-512     | 512           | 2^256        | 2^256 (БЕЗОПАСЕН)
BLAKE2b     | 512           | 2^256        | 2^256 (БЕЗОПАСЕН)

Устойчивость к прообразу

Устойчивость к прообразу измеряет, насколько сложно найти вход, дающий заданный хеш-вывод. Все перечисленные алгоритмы (включая MD5) всё ещё имеют приемлемую устойчивость к прообразу.

# Устойчивость к прообразу (операций для обращения хеша)
Алгоритм    | Идеально     | Практический статус
------------|--------------|--------------------
MD5         | 2^128        | Ослаблен, но не взломан
SHA-1       | 2^160        | Ослаблен, но не взломан
SHA-256     | 2^256        | Безопасен
SHA-512     | 2^512        | Безопасен
BLAKE2b     | 2^512        | Безопасен

# Примечание: атаки коллизий MD5/SHA-1 не помогают обратить хеши
# Но их ослабленное состояние делает их непригодными для безопасности

Практическое руководство по выбору

Используйте MD5 когда:

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

Избегайте SHA-1, мигрируйте на SHA-256

  • SHA-1 не следует использовать в новых проектах
  • Планируйте миграцию существующего использования SHA-1
  • Git переходит: git config --global init.objectFormat sha256

Используйте SHA-256 когда:

  • Критичная для безопасности проверка: Скачивание ПО, проверка пакетов
  • Цифровые подписи: Подписание документов, кода, сертификатов
  • Блокчейн/криптовалюта: Bitcoin широко использует SHA-256
  • Аутентификация API: HMAC-SHA-256 для подписи запросов
  • Требования соответствия: Многие стандарты требуют SHA-256

Используйте SHA-512 когда:

  • 64-битные серверные среды: Может быть быстрее SHA-256
  • Долгосрочное архивирование: Дополнительный запас безопасности на десятилетия
  • Деривация ключей: PBKDF2-HMAC-SHA-512 для паролей

Используйте BLAKE2 когда:

  • Критична производительность: Высокопроизводительная обработка файлов
  • Новые проекты без ограничений совместимости: Современные приложения
  • Нужно ключевое хеширование: Встроенный MAC без накладных расходов HMAC
  • Встраиваемые/IoT: BLAKE2s для 32-битных систем

Примеры реализации

Python: Все алгоритмы

import hashlib

data = b"Hello World"

# MD5 (только без требований безопасности)
md5_hash = hashlib.md5(data).hexdigest()

# SHA-1 (устарел, избегайте)
sha1_hash = hashlib.sha1(data).hexdigest()

# SHA-256 (рекомендуется)
sha256_hash = hashlib.sha256(data).hexdigest()

# SHA-512
sha512_hash = hashlib.sha512(data).hexdigest()

# BLAKE2b (быстрый и безопасный)
blake2b_hash = hashlib.blake2b(data).hexdigest()

# BLAKE2s (для 32-битных систем)
blake2s_hash = hashlib.blake2s(data).hexdigest()

print(f"MD5:     {md5_hash}")
print(f"SHA-1:   {sha1_hash}")
print(f"SHA-256: {sha256_hash}")
print(f"SHA-512: {sha512_hash}")
print(f"BLAKE2b: {blake2b_hash}")
print(f"BLAKE2s: {blake2s_hash}")

Node.js: Хеширование файлов

const crypto = require('crypto');
const fs = require('fs');

function hashFile(filepath, algorithm = 'sha256') {
  return new Promise((resolve, reject) => {
    const hash = crypto.createHash(algorithm);
    const stream = fs.createReadStream(filepath);

    stream.on('data', data => hash.update(data));
    stream.on('end', () => resolve(hash.digest('hex')));
    stream.on('error', reject);
  });
}

// Использование
async function main() {
  const sha256 = await hashFile('document.pdf', 'sha256');
  const sha512 = await hashFile('document.pdf', 'sha512');
  const blake2b = await hashFile('document.pdf', 'blake2b512');

  console.log('SHA-256:', sha256);
  console.log('SHA-512:', sha512);
  console.log('BLAKE2b:', blake2b);
}

main();

Командная строка: Сравнение хешей

# Генерация всех хешей для файла
file="important-document.pdf"

echo "MD5:     $(md5sum "$file" | cut -d' ' -f1)"
echo "SHA-1:   $(sha1sum "$file" | cut -d' ' -f1)"
echo "SHA-256: $(sha256sum "$file" | cut -d' ' -f1)"
echo "SHA-512: $(sha512sum "$file" | cut -d' ' -f1)"

# BLAKE2b (если установлен b2sum)
echo "BLAKE2b: $(b2sum "$file" | cut -d' ' -f1)"

Практические инструменты

Для быстрой генерации хешей без написания кода:

Итоги

  • MD5: Быстрый, но криптографически взломан. Используйте только для контрольных сумм без безопасности и совместимости с legacy.
  • SHA-1: Устарел с практическими атаками коллизий. Мигрируйте на SHA-256.
  • SHA-256: Текущий стандарт. Безопасен, широко поддерживается и быстр с аппаратным ускорением.
  • SHA-512: Дополнительный запас безопасности, быстрее SHA-256 на 64-бит системах.
  • BLAKE2: Так же быстр как MD5, так же безопасен как SHA-256. Отлично подходит для новых проектов без ограничений совместимости.

Для большинства разработчиков SHA-256 — правильный выбор. Он безопасен, универсально поддерживается и всё быстрее с аппаратным ускорением. Используйте Генератор хешей/контрольных сумм для быстрого хеширования текста или Серверный калькулятор хешей для проверки больших файлов.