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

258
задан jww 11 October 2014 в 14:33
поделиться

8 ответов

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

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

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

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

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Использование тип данных SQL CHAR(60) для хранения этого кодирования хеша Bcrypt. Обратите внимание, что эта функция не кодирует строкой шестнадцатеричных цифр, таким образом, мы не можем как легко не преобразовать ее в шестнадцатеричную систему для хранения в двоичном файле.

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

<час>

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

  • MD5 генерирует 128-разрядное значение хэш-функции. Можно использовать CHAR (32) или ДВОИЧНЫЙ ФАЙЛ (16)
  • , SHA-1 генерирует 160-разрядное значение хэш-функции. Можно использовать CHAR (40) или ДВОИЧНЫЙ ФАЙЛ (20)
  • , SHA-224 генерирует 224-разрядное значение хэш-функции. Можно использовать CHAR (56) или ДВОИЧНЫЙ ФАЙЛ (28)
  • , SHA-256 генерирует 256-разрядное значение хэш-функции. Можно использовать CHAR (64) или ДВОИЧНЫЙ ФАЙЛ (32)
  • , SHA-384 генерирует 384-разрядное значение хэш-функции. Можно использовать CHAR (96) или ДВОИЧНЫЙ ФАЙЛ (48)
  • , SHA-512 генерирует 512-разрядное значение хэш-функции. Можно использовать CHAR (128) или ДВОИЧНЫЙ ФАЙЛ (64)
  • , BCrypt генерирует зависящее от реализации 448-разрядное значение хэш-функции. Вам, возможно, понадобился бы CHAR (56), CHAR (60), CHAR (76), ДВОИЧНЫЙ ФАЙЛ (56) или ДВОИЧНЫЙ ФАЙЛ (60)

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

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

440
ответ дан Bill Karwin 23 November 2019 в 02:41
поделиться

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

8
ответ дан Dana the Sane 23 November 2019 в 02:41
поделиться

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

13
ответ дан Noah Goodrich 23 November 2019 в 02:41
поделиться

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

7
ответ дан Treb 23 November 2019 в 02:41
поделиться

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

3
ответ дан willasaywhat 23 November 2019 в 02:41
поделиться

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

3
ответ дан yfeldblum 23 November 2019 в 02:41
поделиться

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

1
ответ дан Stephen Walcher 23 November 2019 в 02:41
поделиться

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

0
ответ дан 23 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: