Всегда используйте алгоритм хеширования пароля: Argon2 , scrypt , bcrypt или PBKDF2 .
Argon2 выиграл конкурс хэширования паролей в 2015 году. Scrypt , bcrypt и PBKDF2 - более старые алгоритмы, которые в настоящее время считаются менее предпочтительными, но все же являются фундаментально надежными, поэтому, если ваша платформа еще не поддерживает Argon2, сейчас можно использовать другой алгоритм.
Никогда не храните пароль непосредственно в базе данных. Также не шифруйте его: в противном случае, если ваш сайт будет взломан, злоумышленник получит ключ дешифрования и сможет получить все пароли. Пароли ДОЛЖНЫ быть хешированы .
Хэш пароля имеет различные свойства из хеш - таблицы хэш или криптографической хэш. Никогда не используйте обычный криптографический хеш, такой как MD5, SHA-256 или SHA-512 для пароля. Алгоритм хеширования паролей использует соль , которая является уникальной (не используется ни для какого другого пользователя или в чьей-либо другой базе данных). Соль необходима для того, чтобы злоумышленники не могли просто предварительно рассчитать хэши общих паролей: с солью они должны перезапустить расчет для каждой учетной записи. Алгоритм хеширования паролей по сути медленный - настолько медленный, насколько вы можете себе позволить. Медлительность причиняет злоумышленнику гораздо больше вреда, чем вам, потому что злоумышленнику приходится использовать много разных паролей. Для получения дополнительной информации см. Как безопасно хэшировать пароли .
Хэш пароля кодирует четыре фрагмента информации:
- Индикатор того, какой алгоритм используется. Это необходимо для ловкости : криптографические рекомендации меняются со временем. Вы должны быть в состоянии перейти на новый алгоритм.
- Индикатор сложности или твердости. Чем выше это значение, тем больше вычислений требуется для вычисления хэша. Это должно быть постоянное или глобальное значение конфигурации в функции смены пароля, но оно должно увеличиваться со временем, поскольку компьютеры работают быстрее, поэтому вам нужно запомнить значение для каждой учетной записи. Некоторые алгоритмы имеют одно числовое значение, другие имеют больше параметров (например, для индивидуальной настройки использования ЦП и ОЗУ).
- Соль. Поскольку соль должна быть уникальной во всем мире, она должна храниться для каждой учетной записи. Соль должна генерироваться случайным образом при каждой смене пароля.
- Собственно хеш, то есть вывод математического вычисления в алгоритм хеширования.
Многие библиотеки включают в себя пару функций, которые удобно упаковывают эту информацию в одну строку: одну, которая берет индикатор алгоритма, индикатор твердости и пароль, генерирует случайную соль и возвращает полную строку хеша; и тот, который принимает пароль и полную строку хеша в качестве входных данных и возвращает логическое значение, указывающее, был ли пароль правильным. Там нет универсального стандарта, но общая кодировка
$ алгоритм $ параметры $ соль $ вывод
где algorithm
это число или короткая буквенно - цифровая строка , кодирующий выбор алгоритма, parameters
является печатной строкой, а salt
и output
кодируются в Base64 без прекращения =
.
16 байт достаточно для соли и вывода. (См., Например, рекомендации для Argon2 .) Кодированный в Base64, это 21 символ каждый. Две другие части зависят от алгоритма и параметров, но обычно используются 20–40 символов. Это в общей сложности около 82 символов ASCII ( CHAR(82)
и не требует Unicode), к которым вы должны добавить запас прочности, если вы думаете, что будет трудно расширить поле позже.
Если вы закодируете хеш в двоичном формате, вы можете уменьшить его до 1 байта для алгоритма, от 1 до 4 байтов для твердости (если вы жестко кодируете некоторые параметры) и до 16 байтов для соли и выходных данных. , в общей сложности 37 байтов. Скажите 40 байтов ( BINARY(40)
), чтобы иметь хотя бы пару свободных байтов. Обратите внимание, что это 8-битные байты, а не печатные символы, в частности, поле может содержать нулевые байты.
Обратите внимание, что длина хеша совершенно не связана с длиной пароля.