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