Какой тип данных использовать для поля хэшированного пароля и какой длины?

Я не уверен, как работает хэширование паролей (буду реализовывать это позже), но сейчас мне нужно создать схему базы данных.

Я думаю ограничить пароли 4-20 символами, но, как я понимаю, после шифрования хэш-строка будет разной длины.

Как же хранить эти пароли в базе данных?

Комментарии к вопросу (5)
Решение

Обновление: просто используя хэш-функция не является достаточно сильным для хранения паролей. Вы должны прочитать ответ от Жиля на эту ветку для более подробного объяснения.

Для паролей, использовать ключ-укрепление алгоритм хеширования как bcrypt или Argon2i. Например, в PHP, используйте функция password_hash() функция, который использует осуществляется по умолчанию.

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

В результате 60-символьную строку, аналогичную следующей (Но цифры будут меняться, потому что он создает уникальное соли).

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Использовать SQL тип данных типа char(60)` в магазине такое кодирование осуществляется хэш. Примечание эта функция не'т кодировать в виде строки шестнадцатеричных цифр, поэтому мы можем'т так легко, unhex его для хранения в двоичном.

Другие хэш-функции все еще используется, но не для хранения паролей, так Я'МР сохранить оригинальный ответ ниже написанному в 2008 году.


Это зависит от алгоритма хэширования, который вы используете. Хеширование всегда дает результат такой же длины, независимо от входного. Это характерно представлять двоичный результат хеш в текст, как последовательность шестнадцатеричных цифр. Или вы можете использовать клавишу [UNHEX ()] функция3, чтобы уменьшить строку шестнадцатеричных цифр в два раза.

  • Алгоритм MD5 создает 128-битное хэш-значение. Вы можете использовать char(32) или двоичный(16)
  • Алгоритм SHA-1 создает 160-битное хэш-значение. Вы можете использовать char(40) или бинарные(20)
  • Ша-224 генерирует 224-битной хэш-значение. Вы можете использовать char(56) или бинарные(28)
  • Ша-256 генерирует 256-битное хэш-значение. Вы можете использовать char(64) или двоичный(32)
  • Ша-384 создает 384-битной хэш-значение. Вы можете использовать char(96) или двоичном(48)
  • Ша-512 генерирует 512-битной хэш-значение. Вы можете использовать char(128) или двоичном(64)
  • Осуществляется генерирует реализацию-зависимые 448-битной хэш-значение. Вам может понадобиться Чаре(56), тип char(60), голец(76), бинарные(56) или бинарные(60)

По состоянию на 2015 год, НИСТ рекомендует использовать SHA-256 или выше для любого применения хеш-функции, требующие взаимодействия. Но НИСТ не рекомендует использовать эти простые хэш-функции для хранения паролей надежно.

Меньшей алгоритмов хэширования их использует (как внутри приложения, а не для обмена), но они известно crackable.

Комментарии (30)

Вы на самом деле можете использовать char(длина хэш), чтобы определить тип данных для MySQL, потому что каждый алгоритм хеширования всегда будут оценивать на то же количество символов. Например, в SHA1 всегда возвращает 40-символьного шестнадцатеричного числа.

Комментарии (1)

Вам может пригодиться эта статья Википедии о солеобразовании достойно. Идея заключается в том, чтобы добавить определенный бит данных для рандомизации хэш-значения; это защитит ваши пароли от словарных атак, если кто-то получит несанкционированный доступ к хэшам паролей.

Комментарии (3)

В виде строки фиксированной длины (VARCHAR(n) или как ее называет MySQL). Хэш всегда имеет фиксированную длину, например, 12 символов (в зависимости от используемого алгоритма хэширования). Таким образом, пароль из 20 символов будет сведен к хэшу из 12 символов, а пароль из 4 символов - к хэшу из 12 символов.

Комментарии (1)

Всегда использовать алгоритм хэширования паролей: Argon2, скрипт, осуществляется или стандарт PBKDF2.

Argon2 выиграла в 2015 году хэширования паролей конкуренции. Скрипт, осуществляется и PBKDF2 с старше алгоритмы, которые считаются менее предпочтительными, но все-таки серьезный, так что если ваша платформа не'т поддерживать Argon2 еще, это's хорошо, чтобы использовать другой алгоритм сейчас.

Никогда не храните пароль напрямую в базе данных. Дон'т зашифровать его, либо: в противном случае, если ваш сайт получает взломан, злоумышленник получает ключ расшифровки и так может получить все пароли. Пароли должны быть hashed.

В password hash имеет различные свойства из хэш-таблицы хэш или криптографический хэш. Никогда не используйте обычный криптографический хэш, таких как MD5, SHA-256 или SHA-512 на пароль. Алгоритм хеширования паролей используется salt, которая является уникальной (не используются для других пользователей или кто-нибудь еще'базы данных). Соль необходима для того, что злоумышленники могут'Т просто предварительно посчитать хэши распространенных паролей: с солью, они должны перезапустить расчет для каждой учетной записи. Пароль хеширования алгоритм intrinsically slow — так медленно, как вы можете себе позволить. Медленность больно злоумышленника гораздо больше, чем вы, потому что злоумышленник должен попробовать много разных паролей. Дополнительные сведения см. В разделе Как надежно хеширования паролей.

Хэш пароля кодирует четыре элемента информации:

  • Индикатор, который используется алгоритм. Это необходимо для ловкость: криптографические рекомендации меняются с течением времени. Вы должны быть в состоянии перехода на новый алгоритм.
  • Трудность или показатель твердости. Чем выше это значение, тем больше вычислений требуется для вычисления хэша. Это должно быть постоянной или глобальное значение конфигурации в функцию смены пароля, но она должна со временем увеличиваться, так как компьютеры становятся все быстрее, так что вы должны помнить значение для каждой учетной записи. Некоторые алгоритмы имеют одно числовое значение, другие имеют больше параметров (например, для настройки загрузку процессора и использование оперативной памяти отдельно).
  • Соль. Поскольку соли должен быть уникальным, он должен быть сохранен для каждой учетной записи. Соли должны быть сгенерированы случайным образом при каждой смене пароля.
  • Хэш правильный, т. е. выход математических расчетов в алгоритме хэширования.

Многие библиотеки включают в себя пару функций, которые удобно пакеты этой информации в виде одной строки: тот, который исполняет алгоритм индикатора, показатель твердости и пароль, генерирует случайную соль и возвращает хэш строки, и тот, который берет пароль и полный хэш-строку в качестве входных данных и возвращает логическое значение, указывающее, является ли пароль был правильный. Там's нет универсального стандарта, но общее кодирование

$algorithm$parameters$salt$output

где <код><ем>алгоритм</ЭМ></код> есть номера или короткие буквенно-цифровой кодировки на выбор алгоритма, но <код><ем>характеристики</ЭМ></код> есть текстовая строка, и <код><ем>соль</ЭМ></код> и <код><ем>выход</ЭМ></код> кодируются в base64, не выключая =.

16 байт достаточно для соли и вывода. (См., например, рекомендации для Argon2.) Закодированных в base64, что'с 21 символов каждая. Две другие части зависит от алгоритма и параметров, но 20-40 персонажи являются типичными. Что'ы в общей сложности около 82 ASCII символы (типа char(82), и нет необходимости в Юникоде), к которому следует добавить запас прочности, если вы думаете, что это's будет сложно увеличить поле позже.

Если вы зашифровать хэш в двоичном формате, вы можете сделать это вплоть до 1 байта для алгоритма, 1-4 байт для жесткости (если вы жестко кодировать некоторые параметры), и 16 байт для соли и выходных, в общей сложности 37 байт. Сказать 40 байт (двоичное(40)), чтобы иметь хотя бы парочку лишних байт. Обратите внимание, что эти 8-битные байты, а не печатаемые символы, в частности, поле может содержать нулевые байты.

Обратите внимание, что длина хэш полностью не соответствует длине пароля.

Комментарии (0)

Хэши представляют собой последовательность битов (128 бит, 160 бит, 256 бит и т. д., в зависимости от алгоритма). Ваши колонки должны быть двоичный типизированный, а не текстовый/символьный набирается, если MySQL позволяет это (типа данных SQL Server-это бинарные(Н) " или " тип varbinary(Н)`). Вы должны также соли хэши. Солей может быть текст или двоичный файл, и вы будете нуждаться в соответствующем столбце.

Комментарии (3)

Вы должны использовать текст (хранить неограниченное количество символов) ради совместимости. Алгоритмы хэширования (нужно) стать сильнее с течением времени и, таким образом, это поля базы данных должны поддерживать более символов с течением времени. Кроме того, в зависимости от вашей стратегии миграции может потребоваться магазине новые и старые хэши в одном поле, чтобы фиксировать длину на один тип хэша не рекомендуется.

Комментарии (0)

Это действительно зависит от алгоритма хеширования вы're, используя. Длина пароля имеет мало общего с длиной хэш, если я правильно помню. Посмотрите спецификации на алгоритм хеширования, который вы используете, выполните несколько тестов, и обрезать чуть выше.

Комментарии (0)

Я всегда проверял, чтобы найти MAX длину строки зашифрованной строки и установить ее в качестве длины символа типа VARCHAR. В зависимости от того, сколько записей вы собираетесь иметь, это может действительно помочь размеру базы данных.

Комментарии (0)

для MD5 тип varchar(32) является целесообразным. Для тех, используя AES лучше использовать varbinary.

Комментарии (1)