Криптография
Хэширование паролей
2012 год: LinkedIn слил 117 млн паролей, хэшированных SHA-1 без соли. CrackStation расшифровал 90% за несколько часов. 2024 год: rockyou2024.txt содержит 10 млрд реальных паролей для словарных атак. Правильное хэширование паролей - разница между взломом за минуты и взломом за годы.
- **Django**: PBKDF2-SHA256 с 720к итераций по умолчанию (4.2+), поддержка Argon2 через django-argon2. Автоматический rehash при смене алгоритма.
- **1Password**: использует PBKDF2-SHA256 + 2SK (Secret Key) для защиты хранилищ. Даже при утечке серверных данных без Secret Key не восстановить.
- **WPA3**: scrypt (N=2^19) вместо PBKDF2-SHA1 из WPA2. RTX 4090 перебирает WPA2-пароли в 100x быстрее WPA3 словарных паролей.
- **Have I Been Pwned**: 14+ млрд скомпрометированных записей в базе. API проверяет пароль через k-anonymity SHA-1 prefix без передачи полного хэша.
Rainbow Tables: почему соль обязательна
Rainbow table - предвычисленная таблица обратных хэшей. Для MD5 всех 8-символьных строчных паролей таблица занимает ~100 ГБ и позволяет обратить любой хэш за секунды. Без соли один hashcat-перебор ломает тысячи паролей одновременно.
В 2012 году LinkedIn слил 6.5 млн хэшей паролей SHA-1 без соли. CrackStation расшифровал 90% за несколько часов. В 2016 году выяснилось, что реально слито 117 млн записей. Данные продаются до сих пор. Это классический пример нарушения password hashing best practices.
Почему соль хранится открыто рядом с хэшем и не является секретной?
bcrypt: адаптивная стоимость
bcrypt создан Провос и Мазьерес в 1999 году. В его основе - параметр cost factor (work factor), который удваивает время вычисления при каждом увеличении на 1. По мере роста производительности CPU cost можно увеличивать без смены алгоритма.
bcrypt обрезает пароли длиннее 72 байт - это молчаливое усечение. Два разных пароля с одинаковыми первыми 72 байтами дадут одинаковый хэш. При bcrypt для длинных паролей нужно предварительно хэшировать SHA-256 и base64-кодировать.
bcrypt не memory-hard - GPU атакует в 30-50x быстрее CPU. RTX 4090 считает 184 000 bcrypt/sec при cost=10 (CPU: ~10 000/sec). Для современных систем Argon2id предпочтительнее, но bcrypt всё ещё приемлем при cost >= 12.
Что делает bcrypt адаптивным к росту мощности CPU?
scrypt: memory-hard защита от GPU
scrypt (Percival, 2009) - первый memory-hard KDF. Параметры: N (CPU/memory cost), r (block size), p (parallelism). Для работы требует O(N*r) памяти - GPU с ограниченной RAM на ядро не может эффективно параллелизировать.
scrypt используется в WPA3 (Wi-Fi Protected Access 3) для ключевого вывода из пароля - значительно сильнее WPA2/PBKDF2. Litecoin выбрал scrypt как PoW-функцию для 'ASIC-resistance', хотя специализированные Litecoin ASIC всё равно появились.
Почему scrypt эффективнее bcrypt против GPU-атак?
Argon2: победитель Password Hashing Competition
Argon2 победил Password Hashing Competition в 2015 году. Три варианта: Argon2d (против GPU), Argon2i (против side-channel), Argon2id (гибрид, рекомендуется). OWASP, NIST и RFC 9106 рекомендуют Argon2id для хэширования паролей в 2024.
bcrypt достаточен для защиты паролей в 2024 году, если выбрать высокий cost
bcrypt приемлем при cost>=12, но не memory-hard. Argon2id при 64MB памяти делает GPU-атаку на порядки дороже при той же CPU-задержке
RTX 4090 атакует bcrypt cost=12 со скоростью ~4600/sec. Тот же GPU с Argon2id (64MB) делает ~50-100/sec. Разница 40-90x при одинаковой задержке для легитимного пользователя.
Почему рекомендуется Argon2id, а не Argon2d или Argon2i?
Ключевые идеи
- **Соль обязательна**: без соли rainbow tables и batch-атаки ломают все хэши одновременно. Соль публична - её задача в уникальности хэшей.
- **bcrypt**: адаптивный cost, приемлем при cost>=12. Не memory-hard, GPU атакует в 30-50x быстрее CPU. Обрезает пароли > 72 байт.
- **scrypt**: memory-hard (O(N*r) RAM), используется в WPA3. GPU не может эффективно параллелизировать из-за ограниченной RAM на ядро.
- **Argon2id**: рекомендация OWASP 2024 и RFC 9106. Гибрид защит от GPU и side-channel. При 64MB/3 итерации: ~50-100 GPU-атак/sec vs 10000+ для MD5.
Связанные темы
Хэширование паролей - частный случай key derivation:
- KDF и управление ключами — PBKDF2 - это KDF для паролей. HKDF - для криптографических ключей. Общий принцип: замедление перебора через итерации.
- Атаки на симметричные шифры — Атаки на хэши паролей (rainbow tables, брутфорс) аналогичны по структуре атакам на симметричные ключи.
- Side-channel атаки — Argon2i защищает от timing side-channel. Проверка пароля должна быть constant-time, иначе timing-атака угадывает символы.
Вопросы для размышления
- Сервис хранит bcrypt cost=10 хэши. Как безопасно мигрировать на Argon2id без сброса паролей всех пользователей?
- Have I Been Pwned проверяет пароли через k-anonymity SHA-1 prefix. Почему это безопасно даже несмотря на то, что SHA-1 сломан?
- Если атакующий знает соль пользователя (из утечки БД), как это влияет на скорость взлома пароля по сравнению со случаем без утечки?