Хеш, используемый для хранения паролей, практически всегда представляет собой строковое значение фиксированного или ограниченно переменного размера. Несмотря на внешнюю простоту — это всего лишь строка — именно на уровне типа колонки и её длины закладывается устойчивость системы к ошибкам хранения, миграциям и несовместимостям алгоритмов.
Большинство алгоритмов хеширования для паролей (bcrypt, Argon2, scrypt, PBKDF2) возвращают результат в текстовом виде. Это связано с тем, что:
Типичная строка хеша включает:
Например, bcrypt-хеш имеет структуру:
$2b$10$..............................................
Именно поэтому он занимает фиксированную длину — 60 символов.
Выбор длины колонки напрямую зависит от используемого алгоритма. Ошибка на этом уровне часто приводит к критическим последствиям: обрезанный хеш становится недействительным, а восстановить его невозможно.
VARCHAR(60)
или с запасом:
VARCHAR(100)
(если предполагается миграция на другой алгоритм в будущем)
Argon2 формирует более длинные строки, содержащие параметры памяти, итераций и соль. Типичная длина:
Рекомендуемая колонка:
VARCHAR(255)
или
TEXT
Длина зависит от:
В среднем:
На практике используется:
VARCHAR(512)
или TEXT
Выбор типа колонки влияет не только на хранение, но и на индексирование и производительность.
Используется, когда:
Преимущества:
Недостатки:
Используется, когда:
Особенности:
Формат представления напрямую влияет на длину строки.
Используется реже в современных системах из-за неэффективности.
Пример:
Однако итоговая строка хеша включает не только бинарный результат, но и служебные поля, поэтому длина увеличивается.
При проектировании таблицы пользователей обычно учитывается не только текущий алгоритм, но и возможность его замены.
Пример универсальной схемы:
password_hash VARCHAR(255) NOT NULL
или более строгий вариант:
password_hash VARCHAR(100) NOT NULL
если используется исключительно bcrypt.
Для предотвращения повреждения данных применяются ограничения:
CHECK (LENGTH(password_hash) >= 20)
или более строго:
CHECK (LENGTH(password_hash) BETWEEN 50 AND 255)
Хеш пароля никогда не должен быть NULL, так как это нарушает модель безопасности.
Хеши паролей:
Индексирование колонки password_hash не имеет смысла и увеличивает накладные расходы при записи.
При использовании Node.js-экосистемы (Sequelize, TypeORM, Prisma) важно учитывать, что некоторые ORM:
При использовании библиотеки password-hash или аналогичных решений строка хеша обычно сохраняется без преобразований, поэтому ответственность за корректный тип колонки полностью лежит на схеме базы данных.
На практике встречаются следующие проблемы:
Особенно опасна ситуация, когда база данных не выбрасывает ошибку при переполнении VARCHAR, а просто обрезает значение.
| Алгоритм | Рекомендуемый тип | Длина | Причина |
|---|---|---|---|
| bcrypt | VARCHAR | 60–100 | фиксированная структура |
| Argon2 | VARCHAR/TEXT | 95–255+ | переменная длина |
| PBKDF2 | VARCHAR/TEXT | 128–512 | зависит от параметров |
| scrypt | VARCHAR/TEXT | 128–512 | высокая вариативность |
При переходе между алгоритмами хеширования важно избегать жёстких ограничений длины.
Распространённый подход:
VARCHAR(255) или TEXT;Такой подход исключает необходимость изменения схемы базы при обновлении криптографического стандарта.