Алгоритм scrypt относится к классу memory-hard функций, что означает значительную зависимость времени вычисления от объёма используемой оперативной памяти. Это ключевое отличие от bcrypt, где основной фактор нагрузки — количество итераций (cost factor), а не объём памяти.
В реализации через crypto.scrypt в Node.js и при
использовании совместимых библиотек параметры задаются явно и определяют
как безопасность, так и производительность.
N (CPU/memory cost factor) Определяет степень сложности алгоритма и одновременно объём памяти, используемый в вычислениях.
Влияние:
r (block size parameter) Определяет размер блока внутри алгоритма.
p (parallelization parameter) Отвечает за параллелизм вычислений.
dkLen (derived key length) Длина итогового ключа.
salt (соль) Случайное значение, добавляемое к паролю.
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 необходимо учитывать баланс между безопасностью и производительностью:
Типичный безопасный профиль для серверных приложений:
Для более строгих требований безопасности:
bcrypt и scrypt решают одну задачу — безопасное хеширование паролей, но используют принципиально разные подходы к усложнению вычислений.
bcrypt
scrypt
| Характеристика | bcrypt | scrypt |
|---|---|---|
| Основной параметр | cost factor | N, r, p |
| Масштабирование | CPU (итерации) | CPU + RAM |
| Память | минимальная | высокая |
| Атаки на GPU | уязвимее | значительно устойчивее |
bcrypt демонстрирует предсказуемую нагрузку, которая увеличивается экспоненциально при росте cost factor. Однако даже при высоких значениях он остаётся относительно экономным по памяти.
scrypt, напротив, требует существенного объёма оперативной памяти, что делает его менее удобным для систем с ограниченными ресурсами, но значительно более устойчивым к массовым атакам.
bcrypt
scrypt
В контексте JavaScript чаще встречаются две реализации:
bcrypt.js — чистая JS-реализация bcryptcrypto.scrypt — встроенный модуль Node.jsbcrypt.js удобен для совместимости и простоты интеграции, тогда как scrypt обычно используется через нативный API Node.js и даёт более высокий уровень безопасности при правильной настройке.
bcrypt предпочтителен, когда:
scrypt предпочтителен, когда:
bcrypt усиливает безопасность через увеличение количества вычислительных циклов, тогда как scrypt увеличивает стоимость атаки за счёт памяти. Это фундаментальное различие делает scrypt более современным решением для систем, где атаки с использованием специализированного оборудования представляют реальную угрозу.