bcrypt-хеши, генерируемые библиотекой bcrypt.js, имеют фиксированную структуру и практически неизменную длину, что напрямую влияет на выбор типа поля в базе данных и его размер.
Строка bcrypt всегда состоит из нескольких частей:
$2a$12$....................................................
или
$2b$12$....................................................
или
$2y$12$....................................................
Где:
$2a$ / $2b$ / $2y$ — версия алгоритма12 — cost factor (число раундов)Ключевая особенность: итоговая длина bcrypt-строки всегда составляет 60 символов.
Это константа алгоритма, не зависящая от длины исходного пароля.
Библиотека bcrypt.js в Node.js возвращает строку в стандартном формате crypt, полностью совместимом с оригинальной реализацией bcrypt. Это означает:
Наиболее строгий и технически корректный вариант:
password_hash CHAR(60) NOT NULL
Особенности:
Используется в случаях, когда структура данных строго контролируется.
Наиболее распространённый вариант:
password_hash VARCHAR(60) NOT NULL
Особенности:
Недостаток — небольшие накладные расходы на хранение длины строки.
Иногда используется как универсальное решение:
password_hash VARCHAR(255) NOT NULL
Причины применения:
Недостаток:
password_hash TEXT NOT NULL
Используется редко и обычно считается избыточным:
Хранение bcrypt-хеша требует учитывать, что:
bcrypt.compare(), а не
SQLТем не менее, в некоторых системах поле может быть помечено уникальным (например, если используется как идентификатор восстановления):
CREATE UNIQUE INDEX idx_password_hash ON users(password_hash);
Однако такая практика встречается редко и обычно не имеет смысла.
bcrypt-строка содержит только символы:
. / $Это делает её безопасной для:
Критично избегать:
Если поле задано меньше 60 символов:
password_hash VARCHAR(50)
результат:
Иногда предполагается, что длина зависит от:
Фактически bcrypt всегда нормализует выход до 60 символов.
bcrypt не требует:
Любая попытка хранить его как JSON или BLOB усложняет систему без пользы.
CRE ATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash CHAR(60) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Альтернативный вариант:
password_hash VARCHAR(60) NOT NULL
Оба варианта эквивалентны при условии корректной длины.
В Node.js с использованием bcrypt.js:
const bcrypt = require('bcryptjs');
const hash = bcrypt.hashSync('password123', 12);
результат:
При переходе на другие алгоритмы хеширования (Argon2, scrypt):
Однако при фиксированном использовании bcrypt.js строгая длина 60 остаётся стабильной характеристикой и позволяет оптимизировать схему хранения данных.