Что такое scrypt?

scrypt — функция хеширования паролей, или функция выработки ключа, разработанная Колином Персивалем в 2009 году и опубликованная в RFC 7914. Как и bcrypt и Argon2, она намеренно работает медленно, чтобы каждая попытка угадывания отнимала у злоумышленника время. Кроме того, scrypt требует большого объёма памяти: при вычислении каждого хеша заполняется большой блок памяти, а затем данные из него считываются в непредсказуемом порядке. Это значительно повышает стоимость взлома с помощью GPU и специализированных микросхем. scrypt используют для хранения паролей во многих веб-фреймворках, в стандартных библиотеках Node.js, Python и Go, а также в криптовалютных кошельках, например в хранилищах ключей Ethereum.

Описание инструмента

Инструмент вычисляет хеш пароля с помощью scrypt прямо в браузере. По умолчанию он создаёт случайную соль и использует параметры, рекомендованные OWASP для хранения паролей. Вы можете изменить соль, трудоёмкость (N), размер блока (r), степень параллелизации (p) и длину ключа. Результат доступен в виде строки PHC для библиотек работы с паролями, а также в форматах hex и Base64 — для кода, который хранит соль и параметры отдельно.

Возможности

  • Вычисляет хеш пароля с помощью scrypt в соответствии с RFC 7914
  • Создаёт случайную соль длиной 16 байт; кнопка позволяет сгенерировать новую
  • Позволяет указать собственную соль, чтобы воспроизвести хеш, созданный в другом месте
  • Позволяет задать трудоёмкость (N) от 2⁴ до 2²⁰, размер блока (r), степень параллелизации (p) и длину ключа
  • Выдаёт хеш в виде строки PHC, а также в форматах hex и Base64
  • Показывает ход вычисления медленных хешей и предупреждает, если настройки требуют более 1 GiB памяти
  • Работает в браузере, поэтому пароль не покидает ваше устройство

Параметры

Параметр По умолчанию Описание
Трудоёмкость (N) 131072 (2¹⁷) Количество блоков памяти. Увеличение значения вдвое удваивает время и объём памяти.
Размер блока (r) 8 Размер каждого блока — 128 × r байт. Также влияет на время и объём памяти.
Параллелизация (p) 1 Количество независимых запусков. Увеличивает время, но не объём памяти.
Длина ключа 32 байта Длина хеша.

Для вычислений требуется 128 × N × r байт памяти. При значениях по умолчанию это 128 MiB.

Форматы результата

Строка PHC содержит всё необходимое для последующей проверки пароля: алгоритм, параметры, соль и хеш. Соль и хеш представлены в Base64 без дополнения:

$scrypt$ln=17,r=8,p=1$<salt>$<hash>

ln — это логарифм N по основанию 2, поэтому ln=17 означает, что N = 131072. Этот формат поддерживают для чтения и записи passlib в Python, крейт scrypt в Rust и пакет Node.js @phc/scrypt.

В полях hex и Base64 содержится только хеш, как и в результатах crypto.scrypt в Node.js, hashlib.scrypt в Python и scrypt.Key в Go. Соль и параметры храните рядом с ним.

Как это работает

Поле соли считывается как текст и кодируется в UTF-8 — так же, как при передаче строковой соли в crypto.scrypt Node.js. Случайная соль состоит из 16 случайных байт, записанных в виде 32 символов hex; именно эти 32 символа используются для вычисления хеша. Пароль также кодируется в UTF-8. Хеш вычисляется в фоновом потоке, поэтому страница остаётся отзывчивой. При изменении любого входного значения вычисление запускается заново.

Советы

  • Используйте новую случайную соль для каждого пароля. Один и тот же пароль с одной и той же солью всегда даёт одинаковый хеш.
  • OWASP рекомендует для хранения паролей использовать как минимум N = 2¹⁷, r = 8, p = 1. Увеличьте N настолько, насколько позволяют ресурсы сервера при каждой попытке входа.
  • По умолчанию Node.js ограничивает объём памяти для scrypt значением 32 MiB. Если вы используете N = 2¹⁷ или больше при r = 8, передайте в crypto.scrypt более высокое значение maxmem.
  • Чтобы проверить хеш из другой системы, введите тот же пароль, соль и параметры, а затем сравните результаты.