Переход с незащищённых MD5/SHA хешей

MD5 и семейство SHA-1 исторически применялись для контроля целостности данных и быстрых вычислений контрольных сумм. Однако их использование для хранения паролей приводит к критическим уязвимостям. Основная проблема заключается в высокой скорости вычисления и отсутствии механизмов адаптации к вычислительной мощности атакующего.

MD5:

  • обеспечивает крайне высокую скорость вычисления
  • подвержен коллизиям
  • не содержит встроенного механизма «замедления» вычислений

SHA-1:

  • также демонстрирует уязвимости к коллизиям
  • не предназначен для хранения секретов
  • не включает адаптивную стоимость вычислений

SHA-2 (SHA-256, SHA-512), несмотря на криптографическую устойчивость к коллизиям, также не подходит для хранения паролей по причине высокой скорости вычисления.

Почему быстрые хеши непригодны для паролей

Хеширование паролей требует не только необратимости, но и сопротивления массовому перебору. MD5 и SHA позволяют выполнять миллиарды операций в секунду на современной GPU-инфраструктуре, что делает перебор словарей и brute-force атаки практически неограниченно эффективными.

Ключевые проблемы:

  • отсутствие адаптивной стоимости вычислений
  • высокая параллелизуемость алгоритмов
  • эффективность атак с использованием GPU и ASIC
  • возможность предварительных атак через rainbow tables

Атаки на хеши паролей

Перебор (brute force)

Полный перебор всех возможных комбинаций становится реалистичным при использовании быстрых хеш-функций.

Словарные атаки

Используются базы распространённых паролей и утёкших данных.

Rainbow tables

Предварительно вычисленные таблицы соответствий «хеш → пароль», особенно эффективные против MD5 и SHA без соли.

Требования к современным алгоритмам хранения паролей

Современные схемы хранения паролей строятся вокруг следующих принципов:

  • медленное вычисление (настраиваемая сложность)
  • уникальная соль для каждого пароля
  • устойчивость к GPU-ускорению
  • адаптивные параметры (cost factor)

Наиболее распространённые алгоритмы:

  • bcrypt
  • scrypt
  • Argon2 (рекомендуемый современный стандарт)

Password-hash в Jav * aScript: концепция

Библиотека Password-hash в JavaScript используется как абстракция над криптографическими алгоритмами хеширования паролей и механизмами проверки. Её назначение — унификация работы с различными стратегиями хранения паролей и упрощение перехода от устаревших схем.

Типовая функциональность:

  • генерация хеша пароля с солью
  • проверка пароля
  • поддержка нескольких алгоритмов
  • возможность миграции между схемами хранения

Архитектурно Password-hash выступает как слой совместимости между legacy-системами (MD5/SHA) и современными алгоритмами (bcrypt/argon2).

Сравнение подходов хранения паролей

MD5 / SHA

  • высокая скорость
  • отсутствие соли (в типичных реализациях)
  • полная уязвимость к перебору

bcrypt / scrypt / Argon2

  • контролируемая вычислительная сложность
  • обязательная соль
  • защита от GPU-ускоренных атак
  • устойчивость к массовому перебору

Переходная модель хранения паролей

Миграция с MD5/SHA требует сохранения обратной совместимости с существующей базой пользователей. Полная перерасчётная миграция паролей невозможна без знания исходных значений, поэтому используется стратегия постепенного обновления.

Основные принципы перехода:

  • сохранение старых хешей в базе
  • добавление метаданных об алгоритме хеширования
  • проверка входа через legacy-алгоритм при необходимости
  • автоматическое обновление хеша при успешной аутентификации

Гибридная стратегия миграции

Гибридная схема позволяет одновременно поддерживать старые и новые методы:

  1. Проверка, какой алгоритм использовался
  2. Если MD5/SHA — выполнение проверки через legacy-функцию
  3. При успешной аутентификации — повторное хеширование современным алгоритмом
  4. Замена старого значения в хранилище

Такая модель постепенно очищает базу от устаревших хешей без принудительного сброса паролей.

Структура хранения паролей при миграции

Типичная запись пользователя в базе может включать:

  • hash — значение хеша
  • algorithm — идентификатор алгоритма (md5, sha1, bcrypt, argon2)
  • salt — соль (если применимо)
  • cost — параметр сложности (для bcrypt/argon2)

Реализация перехода с использованием Password-hash

JavaScript-ориентированная логика может быть построена вокруг единой точки проверки:

import PasswordHash from "password-hash";

function verifyPassword(inputPassword, storedRecord) {
  if (storedRecord.algorithm === "md5") {
    const legacyHash = md5(inputPassword);
    const isValid = legacyHash === storedRecord.hash;

    if (isValid) {
      const newHash = PasswordHash.generate(inputPassword, {
        algorithm: "argon2"
      });

      updateUserHash(storedRecord.userId, {
        hash: newHash.hash,
        algorithm: "argon2",
        salt: newHash.salt
      });
    }

    return isValid;
  }

  if (storedRecord.algorithm === "bcrypt") {
    return PasswordHash.verify(inputPassword, storedRecord.hash);
  }

  return false;
}

Роль соли в процессе миграции

Соль предотвращает использование заранее вычисленных таблиц и делает каждый хеш уникальным. При переходе с MD5/SHA часто возникает проблема отсутствия соли в старых данных, что усиливает необходимость немедленной миграции при первом успешном входе пользователя.

Особенности безопасной миграции

При проектировании перехода учитываются следующие факторы:

  • невозможность декодирования старых хешей
  • необходимость поддержки обратной совместимости
  • постепенное обновление данных без блокировки пользователей
  • унификация интерфейса проверки пароля через библиотеку Password-hash

Структурная эволюция системы хранения паролей

Эволюция обычно проходит этапы:

  • простое MD5-хеширование
  • MD5/SHA + соль
  • bcrypt с фиксированным cost
  • Argon2 с адаптивными параметрами
  • централизованный слой Password-hash как абстракция

Каждый следующий этап увеличивает стоимость атаки и снижает вероятность компрометации данных.

Причины отказа от SHA-256 как основного хеша паролей

Несмотря на криптографическую стойкость, SHA-256 остаётся неподходящим для паролей из-за:

  • высокой скорости вычисления
  • отсутствия встроенного cost-фактора
  • слабой защиты от аппаратного ускорения атак

Использование SHA-256 допустимо только в составе HMAC или специализированных конструкций, но не как самостоятельный механизм хранения паролей.

Итоговая архитектурная модель миграции

Современная система хранения паролей строится на следующих компонентах:

  • единый API проверки паролей (Password-hash)
  • поддержка legacy-алгоритмов
  • автоматическое обновление хеша при входе
  • централизованное управление параметрами сложности
  • постепенное исключение MD5/SHA из базы данных

Такая модель позволяет трансформировать систему без нарушения пользовательского доступа и без массового сброса паролей.