Я не уверен, как работает хеширование паролей (будет выполняться позже), но теперь нужно создать схему базы данных.
Я подумываю ограничить пароли 4-20 символами, но, как я понимаю, после того, как шифрование хэш-строки будет иметь разную длину.
Итак, как хранить эти пароли в базе данных?
Это зависит от используемого алгоритма хэширования. Хеширование всегда производит результат той же длины, независимо от ввода. Типично представлять двоичный хэш-результат в тексте, как ряд шестнадцатеричных цифр. Или вы можете использовать функцию UNHEX()
, чтобы уменьшить длину шестнадцатеричных цифр наполовину.
NIST рекомендует использовать SHA-256 или выше для паролей. Малые алгоритмы хеширования имеют свои применения, но они известны как трещины.
Перед применением функции хэширования вы должны salt ваши пароли. Солить пароль не влияет на длину результата хэша.
Фактически вы можете использовать CHAR (length of hash) для определения вашего типа данных для MySQL, потому что каждый алгоритм хэширования всегда будет оценивать одинаковое количество символов. Например, SHA1 всегда возвращает шестнадцатеричное число из 40 символов.
Как строка с фиксированной длиной (VARCHAR (n), но MySQL вызывает ее). Хэш всегда имеет фиксированную длину, например, 12 символов (в зависимости от используемого алгоритма хеширования). Таким образом, пароль 20 char будет уменьшен до 12 char хэшей, а пароль 4 char также даст хеш 12 char.
Вы можете найти эту статью в Википедии о том, чтобы солить стоящий. Идея состоит в том, чтобы добавить набор бит данных для рандомизации вашего значения хэша; это защитит ваши пароли от атак на словах, если кто-то получит несанкционированный доступ к хэшам паролей.
Хэши - это последовательность бит (128 бит, 160 бит, 256 бит и т.д., в зависимости от алгоритма). Ваш столбец должен быть двоично-типизированным, а не текстовым или символьным, если это позволяет MySQL (тип данных SQL Server - binary(n)
или varbinary(n)
). Вы также должны солить хеши. Соли могут быть текстовыми или двоичными, и вам понадобится соответствующий столбец.
для md5 vARCHAR (32) является подходящим. Для тех, кто использует AES лучше использовать varbinary.
Это зависит от алгоритма хеширования, который вы используете. Длина пароля имеет мало общего с длиной хэша, если я правильно помню. Посмотрите спецификации на алгоритм хеширования, который вы используете, запустите несколько тестов и обрезайте чуть выше этого.
Я всегда тестировал, чтобы найти длину строки MAX зашифрованной строки и установить ее как длину символа типа VARCHAR. В зависимости от того, сколько записей у вас будет, это может реально помочь размеру базы данных.
Вы должны использовать TEXT
(сохраняя неограниченное количество символов) для обеспечения прямой совместимости. Хеширующие алгоритмы (необходимость) становятся более прочными с течением времени, и поэтому этому полю базы данных потребуется поддержка большего количества символов с течением времени. Кроме того, в зависимости от вашей стратегии миграции вам может потребоваться сохранить новые и старые хэши в одном поле, поэтому не рекомендуется устанавливать длину одного типа хэшей.