Scrypt — один із перших алгоритмів хешування паролів, спеціально спроєктований так, щоб вимагати не лише обчислювального часу, а й значного обсягу оперативної пам'яті. Це принципово інший підхід порівняно з чисто "повільними" алгоритмами на кшталт bcrypt.
Що таке memory-hard функція
Memory-hard алгоритм навмисно проєктується так, щоб для обчислення одного хешу потрібно було утримувати в пам'яті великий обсяг проміжних даних. Спробувати заощадити пам'ять коштом перерахунку значень натомість різко збільшує час обчислення — тобто зловмиснику доводиться жертвувати або пам'яттю, або швидкістю.
Чому це ускладнює атаки на спеціалізованому обладнанні
ASIC-чипи та GPU дуже ефективні для масового паралельного виконання простих арифметичних операцій, але додавання пам'яті до кожного паралельного потоку обчислень коштує набагато дорожче й масштабується гірше. Scrypt робить атаку "в лоб" на такому обладнанні економічно менш вигідною порівняно з класичними хеш-функціями.
Де застосовується scrypt
Окрім хешування паролів, scrypt відомий як алгоритм proof-of-work у деяких криптовалютах (наприклад, Litecoin), обраний саме через стійкість до майнінгу на спеціалізованих ASIC-пристроях, характерну для біткоїна з його SHA-256.
Навіщо це потрібно
- Обирати алгоритм хешування паролів, стійкий до атак на GPU-фермах.
- Розуміти концепцію memory-hard функцій в контексті криптографії.
- Порівнювати компроміси scrypt проти bcrypt і Argon2 для конкретної системи.
Скільки пам'яті насправді потрібно
Обсяг пам'яті для одного обчислення scrypt наближено дорівнює 128 × N × r байтів. При типових параметрах (N=16384, r=8) це близько 16 мегабайтів на один хеш — незначно для одного логіну, але якщо сервер має обробляти тисячі одночасних автентифікацій, сумарний обсяг пам'яті швидко стає реальним обмеженням при виборі параметрів, а не лише абстрактною вимогою безпеки.