scrypt: параметры настройки и сравнение с bcrypt

Алгоритм scrypt относится к классу memory-hard функций, что означает значительную зависимость времени вычисления от объёма используемой оперативной памяти. Это ключевое отличие от bcrypt, где основной фактор нагрузки — количество итераций (cost factor), а не объём памяти.

В реализации через crypto.scrypt в Node.js и при использовании совместимых библиотек параметры задаются явно и определяют как безопасность, так и производительность.

Основные параметры scrypt

N (CPU/memory cost factor) Определяет степень сложности алгоритма и одновременно объём памяти, используемый в вычислениях.

  • Должен быть степенью двойки
  • Чем выше значение, тем выше устойчивость к перебору
  • Типичные значения: 2¹⁴ – 2²⁰

Влияние:

  • Рост N увеличивает потребление памяти экспоненциально
  • Является главным фактором стойкости к специализированным атакам (ASIC/FPGA)

r (block size parameter) Определяет размер блока внутри алгоритма.

  • Влияет на внутреннюю структуру памяти
  • Увеличение r повышает потребление памяти линейно
  • Типичные значения: 8

p (parallelization parameter) Отвечает за параллелизм вычислений.

  • Позволяет распределять нагрузку на несколько потоков
  • Увеличение p повышает CPU-использование
  • Типичные значения: 1–4

dkLen (derived key length) Длина итогового ключа.

  • Обычно 32 байта (256 бит)
  • Может быть увеличена в зависимости от требований системы

salt (соль) Случайное значение, добавляемое к паролю.

  • Минимум 16 байт
  • Должно быть уникальным для каждого пароля
  • Защищает от радужных таблиц

Пример использования scrypt в Node.js

const crypto = require('crypto');

crypto.scrypt('password', 'random_salt', 64, {
  N: 16384,
  r: 8,
  p: 1
}, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));
});

Особенности подбора параметров

При настройке scrypt необходимо учитывать баланс между безопасностью и производительностью:

  • Увеличение N резко повышает защиту, но требует больше памяти
  • r влияет на линейное увеличение нагрузки на память
  • p масштабирует нагрузку на CPU и позволяет адаптироваться к многопроцессорным системам

Типичный безопасный профиль для серверных приложений:

  • N = 2¹⁴ (16384)
  • r = 8
  • p = 1

Для более строгих требований безопасности:

  • N = 2¹⁶ – 2¹⁸
  • r = 8
  • p = 1–2

Сравнение scrypt с bcrypt

bcrypt и scrypt решают одну задачу — безопасное хеширование паролей, но используют принципиально разные подходы к усложнению вычислений.

Основная модель нагрузки

bcrypt

  • Основан на Blowfish
  • Использует cost factor (2^cost итераций)
  • CPU-bound алгоритм
  • Почти не использует память как фактор защиты

scrypt

  • Memory-hard алгоритм
  • Использует значительный объём RAM
  • Устойчив к GPU/ASIC атакам за счёт высокой памяти

Параметры сложности

Характеристика bcrypt scrypt
Основной параметр cost factor N, r, p
Масштабирование CPU (итерации) CPU + RAM
Память минимальная высокая
Атаки на GPU уязвимее значительно устойчивее

Производительность

bcrypt демонстрирует предсказуемую нагрузку, которая увеличивается экспоненциально при росте cost factor. Однако даже при высоких значениях он остаётся относительно экономным по памяти.

scrypt, напротив, требует существенного объёма оперативной памяти, что делает его менее удобным для систем с ограниченными ресурсами, но значительно более устойчивым к массовым атакам.


Устойчивость к аппаратным атакам

bcrypt

  • Оптимизируется под GPU
  • Эффективно параллелится на специализированных устройствах
  • Устаревающий с точки зрения защиты от ASIC

scrypt

  • Специально разработан для защиты от аппаратного ускорения
  • Требует большого объёма памяти на каждую операцию
  • Делает экономически невыгодным массовый перебор

Использование в JavaScript экосистеме

В контексте JavaScript чаще встречаются две реализации:

  • bcrypt.js — чистая JS-реализация bcrypt
  • crypto.scrypt — встроенный модуль Node.js

bcrypt.js удобен для совместимости и простоты интеграции, тогда как scrypt обычно используется через нативный API Node.js и даёт более высокий уровень безопасности при правильной настройке.


Практическая разница в сценариях

bcrypt предпочтителен, когда:

  • важна простота реализации
  • ограничены ресурсы по памяти
  • требуется широкая совместимость (включая браузеры через bcrypt.js)

scrypt предпочтителен, когда:

  • требуется максимальная защита от GPU/ASIC атак
  • сервер способен выделять значительный объём памяти
  • система ориентирована на повышенную криптографическую стойкость

Итоговое различие подходов

bcrypt усиливает безопасность через увеличение количества вычислительных циклов, тогда как scrypt увеличивает стоимость атаки за счёт памяти. Это фундаментальное различие делает scrypt более современным решением для систем, где атаки с использованием специализированного оборудования представляют реальную угрозу.