Сравнение хеш-функций
Хеш-функции — основа современной криптографии. От них зависит безопасность паролей, цифровых подписей, SSL-сертификатов, блокчейнов. MD5, SHA-1, SHA-256 — три самых известных алгоритма. Два из них уже сломаны и не должны использоваться для безопасности. Разберём что куда подходит.
Пример хешей строки "hello"
MD5: 5d41402abc4b2a76b9719d911017c592
(32 символа)
SHA-1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
(40 символов)
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
(64 символа)История взломов
MD5 — взлом 2004
В августе 2004 китайские исследователи Wang, Yin, Yu опубликовали алгоритм поиска коллизий MD5 за 1 час на стандартном компьютере. К 2008 атака была оптимизирована — коллизии находятся за 1 секунду. Реальная атака: создание двух X.509 сертификатов с одинаковым MD5 — атакующий получает легитимный сертификат для своего фейкового сайта.
В 2012 червь Flame (атрибутирован к спецслужбам) использовал коллизию MD5 для подделки Microsoft Windows Update подписи — массовое заражение в Иране. После этого Microsoft удалил MD5 из всех систем безопасности.
SHA-1 — взлом 2017 (SHAttered)
Google + CWI Amsterdam опубликовали SHAttered (shattered.io) — первая практическая коллизия SHA-1. Создали два разных PDF с одинаковым SHA-1 хешем. Стоимость атаки: 6500 GPU-лет ≈ $110 000. Звучит дорого, но для государственных актёров — копейки.
В 2020 атака улучшена: SHA-1 коллизия за $45k. Сегодня (2024) — за несколько $10k. Все основные платформы отказались от SHA-1: Chrome (2017), Firefox (2017), git (постепенно), GitHub (для commits — поддерживает но рекомендует переход).
SHA-256 — будущее
Теоретическая атака на SHA-256 потребует ~2^128 операций. Это больше суммарной энергии всех звёзд Млечного Пути за миллиард лет. С квантовыми компьютерами (алгоритм Гровера) — 2^128 уменьшается до 2^64, что всё ещё безопасно (десятилетия). Если квантовые компьютеры станут практическими — рекомендуется переход на SHA-3 или Argon2.
Federal agencies should stop using SHA-1 for digital signatures, digital time stamping, and other applications that require collision resistance as soon as practical. Use SHA-256 (or any of the SHA-2 family) instead.— National Institute of Standards and Technology (NIST), 2011
Где использовать что
MD5 — допустимо в 2024
- HTTP Etag. Хеш ответа для кэширования. Безопасность не критична.
- Cache key. Хеш объекта для ключа в Redis. Скорость важнее.
- Deduplication. Проверка идентичности файлов в backup-системах.
- Checksum при передаче. Проверка что файл не повреждён при копировании (НЕ при downloading с публичного сервера).
- Хеширование cache-busting URL. /style.css?v=md5(file_contents).
SHA-1 — legacy, не для нового кода
- Git commits. Исторически используется. Git поддерживает, но рекомендует переход.
- HMAC-SHA-1 в OAuth 1.0a. Для совместимости со старыми API. Для нового OAuth — используйте OAuth 2.0 с HS256.
- UUID v5. Если нужны namespace-based UUID (но лучше использовать v4 или v7).
SHA-256 — стандарт
- SSL/TLS-сертификаты. Все современные CA выпускают только SHA-256.
- JWT (HS256, RS256, ES256). Подпись токенов авторизации.
- Bitcoin / blockchain. Двойной SHA-256 для proof-of-work.
- File integrity критичных систем. Linux ISO, обновления ПО, security patches.
- Цифровые подписи. Документы, сертификаты, контракты.
- HMAC-SHA-256. API authentication, webhook verification (Stripe, GitHub).
Пароли — отдельная категория
Для хеширования паролей НЕ используйте ни MD5, ни SHA-1, ни SHA-256 напрямую. Все они слишком быстрые — современный GPU вычисляет миллиарды хешей в секунду.
- Argon2id (Argon2) — современный стандарт, рекомендуется для новых проектов.
- bcrypt — старый, но проверенный временем. Совместимость с большинством библиотек.
- scrypt — компромисс между bcrypt и argon2.
- PBKDF2 — стандарт NIST. Используется в WPA2, BitLocker. Минимум 100k итераций.
Генерация в коде
Node.js
import crypto from 'crypto';
const data = 'hello';
// MD5 — для checksum
const md5 = crypto.createHash('md5').update(data).digest('hex');
// 5d41402abc4b2a76b9719d911017c592
// SHA-1 — для git compatibility
const sha1 = crypto.createHash('sha1').update(data).digest('hex');
// aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
// SHA-256 — для security (РЕКОМЕНДУЕМ)
const sha256 = crypto.createHash('sha256').update(data).digest('hex');
// 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
// HMAC-SHA-256 для подписи
const hmac = crypto.createHmac('sha256', 'secret').update(data).digest('hex');Python
import hashlib import hmac data = b'hello' # Простые хеши md5 = hashlib.md5(data).hexdigest() sha1 = hashlib.sha1(data).hexdigest() sha256 = hashlib.sha256(data).hexdigest() # HMAC key = b'secret' hmac_sha256 = hmac.new(key, data, hashlib.sha256).hexdigest()
Bash
# Хеш файла md5sum file.txt # 5d41402abc4b2a76b9719d911017c592 sha1sum file.txt # aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d sha256sum file.txt # 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 # Хеш строки echo -n "hello" | md5sum echo -n "hello" | sha256sum # Проверка контрольной суммы sha256sum -c file.txt.sha256
- NIST SP 800-131A — Transitioning the Use of Cryptographic Algorithms. NIST. csrc.nist.gov/publications/detail/sp/800-131a/rev-2/final. 2019.
- SHAttered — first SHA-1 collision. Google + CWI Amsterdam. shattered.io. 2017.
- How to Break MD5 and Other Hash Functions. Wang, Yin, Yu. eprint.iacr.org/2004/199. 2005.
- FIPS 180-4 — Secure Hash Standard (SHS). NIST. csrc.nist.gov/publications/detail/fips/180/4/final. 2015.
