Алгоритм Blowfish — это симметричный блочный шифр,
разработанный Брюсом Шнайером в 1993 году. Он предназначен для быстрого
и безопасного шифрования данных и стал основой для ряда
криптографических решений, включая механизм хеширования паролей в
bcrypt.
Blowfish работает с:
Ключевая особенность — сложная процедура генерации подключей (key schedule), которая делает алгоритм устойчивым к атакам перебора.
Blowfish построен на основе сети Фейстеля — криптографической конструкции, которая делит входной блок на две части:
Каждый раунд выполняет преобразования по схеме:
После 16 раундов производится финальное преобразование без обмена.
Blowfish использует:
Этот процесс делает генерацию подключей вычислительно дорогой, что важно для защиты от атак.
Функция F — центральный элемент Blowfish. Она принимает 32-битное значение и возвращает 32-битный результат.
Разбиение входа:
Далее выполняются операции:
Все операции выполняются по модулю 2³².
Функция F обеспечивает:
Входной блок делится на L и R
Выполняются 16 раундов:
После раундов:
Результат объединяется в один 64-битный блок.
Расшифрование выполняется аналогично шифрованию, но подключи используются в обратном порядке. Это свойство характерно для сетей Фейстеля и упрощает реализацию.
Blowfish обладает рядом характеристик, обеспечивающих его надежность:
Однако:
bcrypt применяет модифицированную версию Blowfish —
EksBlowfish (Expensive Key Schedule Blowfish).
Основные изменения:
Это делает bcrypt устойчивым к:
EksBlowfish добавляет два ключевых элемента:
Случайное значение, добавляемое к паролю перед хешированием. Обеспечивает уникальность хеша даже для одинаковых паролей.
Параметр, определяющий количество повторений генерации ключей:
Это делает вычисление хеша намеренно медленным.
В библиотеке bcrypt.js:
Формат результата:
$2a$10$[22 символа соли][31 символ хеша]
Где:
2a — версия алгоритма10 — cost factorГлавное преимущество — возможность искусственно замедлить вычисления, что критично для защиты паролей.
Несмотря на надежность, Blowfish и bcrypt имеют ограничения:
Современные альтернативы:
Тем не менее, bcrypt остается широко используемым благодаря стабильности и проверенной безопасности.
В bcrypt.js алгоритм реализован полностью на JavaScript
без нативных зависимостей:
Это позволяет:
Blowfish не просто шифр, а фундамент, на котором построен механизм
защиты паролей в bcrypt.js.