Обновление: Просто использование хеш-функции не достаточно сильно для хранения паролей. Необходимо читать ответ от Gilles на этом потоке для более подробного объяснения.
Для паролей, используйте усиливающий ключ хеш-алгоритм как Bcrypt или Argon2i. Например, в PHP, используйте password_hash () функция , который использует Bcrypt по умолчанию.
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
результатом являются 60 символьных строк, подобных следующему (но цифры будут варьироваться, потому что он генерирует уникальную соль).
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
Использование тип данных SQL CHAR(60)
для хранения этого кодирования хеша Bcrypt. Обратите внимание, что эта функция не кодирует строкой шестнадцатеричных цифр, таким образом, мы не можем как легко не преобразовать ее в шестнадцатеричную систему для хранения в двоичном файле.
Другие хеш-функции все еще имеют использование, но не для хранения паролей, таким образом, я сохраню исходный ответ ниже, записанным в 2008.
<час> Это зависит от алгоритма хеширования, который Вы используете. Хеширование всегда приводит к результату той же длины, независимо от входа. Это типично для представления двоичного результата хеша в тексте как серия шестнадцатеричных цифр. Или можно использовать UNHEX()
функция для сокращения строки шестнадцатеричных цифр наполовину.
По состоянию на 2015, NIST рекомендует использовать SHA-256 или выше для любых приложений хеш-функций, требующих совместимости. Но NIST не рекомендует использовать эти простые хеш-функции для хранения паролей надежно.
Меньшие алгоритмы хеширования имеют свое использование (как внутренний к приложению, не для обмена), но они известны быть вскрываемы .
Вы могли бы найти эту статью Wikipedia о солении стоящей . Идея состоит в том, чтобы добавить бит набора данных для рандомизации значения хэш-функции; это защитит Ваши пароли от атак с подбором по словарю, если кто-то получит несанкционированный доступ к хэшам пароля.
Можно на самом деле использовать CHAR (длина хеша) для определения типа данных для MySQL, потому что каждый алгоритм хеширования будет всегда оценивать к тому же количеству символов. Например, SHA1 всегда возвращает шестнадцатеричное число с 40 символами.
Как строка фиксированной длины (VARCHAR (n) или однако MySQL называет его). Хеш всегда имеет фиксированную длину, например, 12 символов (в зависимости от хеш-алгоритма, который Вы используете). Таким образом, 20 символьных паролей были бы уменьшены до 12 символьных хешей, и 4 символьных пароля также приведут к 12 символьным хешам.
Это действительно зависит от алгоритма хеширования, который Вы используете. Длина пароля имеет мало общего с длиной хеша, если я помню правильно. Ищите спецификации на алгоритме хеширования, Вы используете, запускаете несколько тестов и усекаете чуть выше этого.
Хеши являются последовательностью битов (128 битов, 160 битов, 256 битов, и т.д., в зависимости от алгоритма). Ваш столбец должен быть введен двоичным файлом, не text/character-typed, если MySQL позволяет его (тип данных SQL Server binary(n)
или varbinary(n)
). Необходимо также посолить хеши. Соли могут быть текстом или двоичным файлом, и Вам будет нужен соответствующий столбец.
Я всегда тестировал, чтобы найти МАКС. длину строки зашифрованной строки и установить это как длину знака типа VARCHAR. В зависимости от того, сколько записей Вы собираетесь иметь, это могло действительно помочь размеру базы данных.
для md5 vARCHAR(32) является подходящим. Для тех, кто использует AES, лучше использовать варбинарий.