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

224

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

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

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

  • 0
    Также см. Фреймворк для хэширования паролей в PHP в PHP . Его портативный и защищенный от ряда распространенных атак на пароли пользователей. Парень, который написал фреймворк (SolarDesigner), тот же, кто написал Джона Потрошителя и является судьей в конкурсе хэширования паролей . Таким образом, он знает кое-что о атаках на пароли.
  • 2
    Пожалуйста, не устанавливайте верхний предел для ваших паролей. Вы их хешируете, для верхнего предела нет причины хранения. Если вы беспокоитесь о DoS-атаках с использованием хэша пароля, 1000 или 1024 - разумный верхний предел.
Показать ещё 2 комментария
Теги:
types
hash
cryptography
passwords

9 ответов

357
Лучший ответ

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

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

NIST рекомендует использовать SHA-256 или выше для паролей. Малые алгоритмы хеширования имеют свои применения, но они известны как трещины.

Перед применением функции хэширования вы должны salt ваши пароли. Солить пароль не влияет на длину результата хэша.

  • 0
    Соление может быть сделано путем добавления уникального значения (например, имени пользователя) к каждому паролю. Вот статья, которая объясняет, почему это необходимо: codinghorror.com/blog/2007/09/rainbow-hash-cracking.html . Короче говоря, это помогает предотвратить попытки взлома паролей, использующие метод радужной атаки.
  • 37
    @Hippo: Пожалуйста, не используйте имя пользователя в качестве соли. Генерация случайной соли для каждого пользователя.
Показать ещё 22 комментария
14

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

8

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

  • 3
    «или как MySQL называет это» - MYSQL называет это CHAR. Этот тип предназначен для фиксированной длины. Поэтому я думаю, что CHAR лучше, чем VARCHAR.
7

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

  • 2
    Это действительно очень полезно (+1), но это не отвечает на вопрос! (-1)
  • 3
    Да, но определенно актуально в этом контексте (+1)
Показать ещё 1 комментарий
3

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

  • 0
    Справедливость здесь совершенно верна - MySQL будет хранить их в виде числовых значений и сделает поиск по этому столбцу намного более эффективным, чем сопоставление строк, однако соли не должны храниться в базе данных, кроме соленых данных, что исключает безопасность, которую обеспечивают соли ,
  • 6
    Соли не секрет. Единственный секрет - это пароль. Просто убедитесь, что каждый новый пароль получает новую соль. Каждый раз, когда пользователь меняет свой пароль, система должна генерировать новую соль для этого пароля. Соли должны быть длинными и случайными, например, 16 байтов, сгенерированных из криптографически безопасного PRNG.
Показать ещё 1 комментарий
2

для md5 vARCHAR (32) является подходящим. Для тех, кто использует AES лучше использовать varbinary.

2

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

1

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню