Дополнительно
Какой тип данных использовать для поля хэшированного пароля и какой длины?
Я не уверен, как работает хэширование паролей (буду реализовывать это позже), но сейчас мне нужно создать схему базы данных.
Я думаю ограничить пароли 4-20 символами, но, как я понимаю, после шифрования хэш-строка будет разной длины.
Как же хранить эти пароли в базе данных?
258
10
Обновление: просто используя хэш-функция не является достаточно сильным для хранения паролей. Вы должны прочитать ответ от Жиля на эту ветку для более подробного объяснения.
Для паролей, использовать ключ-укрепление алгоритм хеширования как bcrypt или Argon2i. Например, в PHP, используйте функция password_hash() функция, который использует осуществляется по умолчанию.
В результате 60-символьную строку, аналогичную следующей (Но цифры будут меняться, потому что он создает уникальное соли).
Использовать SQL тип данных типа char(60)` в магазине такое кодирование осуществляется хэш. Примечание эта функция не'т кодировать в виде строки шестнадцатеричных цифр, поэтому мы можем'т так легко, unhex его для хранения в двоичном.
Другие хэш-функции все еще используется, но не для хранения паролей, так Я'МР сохранить оригинальный ответ ниже написанному в 2008 году.
Это зависит от алгоритма хэширования, который вы используете. Хеширование всегда дает результат такой же длины, независимо от входного. Это характерно представлять двоичный результат хеш в текст, как последовательность шестнадцатеричных цифр. Или вы можете использовать клавишу [
UNHEX ()
] функция3, чтобы уменьшить строку шестнадцатеричных цифр в два раза.По состоянию на 2015 год, НИСТ рекомендует использовать SHA-256 или выше для любого применения хеш-функции, требующие взаимодействия. Но НИСТ не рекомендует использовать эти простые хэш-функции для хранения паролей надежно.
Меньшей алгоритмов хэширования их использует (как внутри приложения, а не для обмена), но они известно crackable.
Вы на самом деле можете использовать char(длина хэш), чтобы определить тип данных для MySQL, потому что каждый алгоритм хеширования всегда будут оценивать на то же количество символов. Например, в SHA1 всегда возвращает 40-символьного шестнадцатеричного числа.
Вам может пригодиться эта статья Википедии о солеобразовании достойно. Идея заключается в том, чтобы добавить определенный бит данных для рандомизации хэш-значения; это защитит ваши пароли от словарных атак, если кто-то получит несанкционированный доступ к хэшам паролей.
В виде строки фиксированной длины (VARCHAR(n) или как ее называет MySQL). Хэш всегда имеет фиксированную длину, например, 12 символов (в зависимости от используемого алгоритма хэширования). Таким образом, пароль из 20 символов будет сведен к хэшу из 12 символов, а пароль из 4 символов - к хэшу из 12 символов.
Всегда использовать алгоритм хэширования паролей: Argon2, скрипт, осуществляется или стандарт PBKDF2.
Argon2 выиграла в 2015 году хэширования паролей конкуренции. Скрипт, осуществляется и PBKDF2 с старше алгоритмы, которые считаются менее предпочтительными, но все-таки серьезный, так что если ваша платформа не'т поддерживать Argon2 еще, это's хорошо, чтобы использовать другой алгоритм сейчас.
Никогда не храните пароль напрямую в базе данных. Дон'т зашифровать его, либо: в противном случае, если ваш сайт получает взломан, злоумышленник получает ключ расшифровки и так может получить все пароли. Пароли должны быть hashed.
В password hash имеет различные свойства из хэш-таблицы хэш или криптографический хэш. Никогда не используйте обычный криптографический хэш, таких как MD5, SHA-256 или SHA-512 на пароль. Алгоритм хеширования паролей используется salt, которая является уникальной (не используются для других пользователей или кто-нибудь еще'базы данных). Соль необходима для того, что злоумышленники могут'Т просто предварительно посчитать хэши распространенных паролей: с солью, они должны перезапустить расчет для каждой учетной записи. Пароль хеширования алгоритм intrinsically slow — так медленно, как вы можете себе позволить. Медленность больно злоумышленника гораздо больше, чем вы, потому что злоумышленник должен попробовать много разных паролей. Дополнительные сведения см. В разделе Как надежно хеширования паролей.
Хэш пароля кодирует четыре элемента информации:
Многие библиотеки включают в себя пару функций, которые удобно пакеты этой информации в виде одной строки: тот, который исполняет алгоритм индикатора, показатель твердости и пароль, генерирует случайную соль и возвращает хэш строки, и тот, который берет пароль и полный хэш-строку в качестве входных данных и возвращает логическое значение, указывающее, является ли пароль был правильный. Там's нет универсального стандарта, но общее кодирование
где <код><ем>алгоритм</ЭМ></код> есть номера или короткие буквенно-цифровой кодировки на выбор алгоритма, но <код><ем>характеристики</ЭМ></код> есть текстовая строка, и <код><ем>соль</ЭМ></код> и <код><ем>выход</ЭМ></код> кодируются в base64, не выключая
=
.16 байт достаточно для соли и вывода. (См., например, рекомендации для Argon2.) Закодированных в base64, что'с 21 символов каждая. Две другие части зависит от алгоритма и параметров, но 20-40 персонажи являются типичными. Что'ы в общей сложности около 82 ASCII символы (
типа char(82)
, и нет необходимости в Юникоде), к которому следует добавить запас прочности, если вы думаете, что это's будет сложно увеличить поле позже.Если вы зашифровать хэш в двоичном формате, вы можете сделать это вплоть до 1 байта для алгоритма, 1-4 байт для жесткости (если вы жестко кодировать некоторые параметры), и 16 байт для соли и выходных, в общей сложности 37 байт. Сказать 40 байт (
двоичное(40)
), чтобы иметь хотя бы парочку лишних байт. Обратите внимание, что эти 8-битные байты, а не печатаемые символы, в частности, поле может содержать нулевые байты.Обратите внимание, что длина хэш полностью не соответствует длине пароля.
Хэши представляют собой последовательность битов (128 бит, 160 бит, 256 бит и т. д., в зависимости от алгоритма). Ваши колонки должны быть двоичный типизированный, а не текстовый/символьный набирается, если MySQL позволяет это (типа данных SQL Server-это бинарные(Н) " или " тип varbinary(Н)`). Вы должны также соли хэши. Солей может быть текст или двоичный файл, и вы будете нуждаться в соответствующем столбце.
Вы должны использовать
текст
(хранить неограниченное количество символов) ради совместимости. Алгоритмы хэширования (нужно) стать сильнее с течением времени и, таким образом, это поля базы данных должны поддерживать более символов с течением времени. Кроме того, в зависимости от вашей стратегии миграции может потребоваться магазине новые и старые хэши в одном поле, чтобы фиксировать длину на один тип хэша не рекомендуется.Это действительно зависит от алгоритма хеширования вы're, используя. Длина пароля имеет мало общего с длиной хэш, если я правильно помню. Посмотрите спецификации на алгоритм хеширования, который вы используете, выполните несколько тестов, и обрезать чуть выше.
Я всегда проверял, чтобы найти MAX длину строки зашифрованной строки и установить ее в качестве длины символа типа VARCHAR. В зависимости от того, сколько записей вы собираетесь иметь, это может действительно помочь размеру базы данных.
для MD5 тип varchar(32) является целесообразным. Для тех, используя AES лучше использовать varbinary.