Насколько это безопасно/разумно хранить соли в той же сфере, что хэшированный пароль?

Используя Argon2 для хэширования паролей в моем приложении, Я'вэ заметил он генерирует строку, как это (например, пароль и"кролик", у):

$argon2i$v=19$m=65536,t=3,p=1$YOtX2//7NoD/owm8RZ8llw==$fPn4sPgkFAuBJo3M3UzcGss3dJysxLJdPdvojRF20ZE=

Мое понимание заключается в том, что все, что до р= являются параметрами, тело Р= соль, и последняя часть-это хешированный пароль.

Допустимо ли хранить это в одном поле в базе данных SQL (`типа varchar(99) в данном случае), или должен строку быть разделены на составные части? Я должен хранить соли отдельно от хэшированный пароль и сохранить параметры в код?

Комментарии к вопросу (4)
Решение

Вы должны хранить это в одном поле. Не пытайтесь разделить ее на части.

Я знаю, это может показаться немного сложным для людей выходил из справочной базы данных, где образ действия является нормализация данных и использование сериализованных строк является грязный хак. Но с точки зрения безопасности, это имеет смысл.

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

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

Только хранение параметров в коде тоже плохая идея. В качестве процессоров становится все быстрее, вы можете увеличить фактор стоимости в будущем. Во время фазы миграции, разные пароли будут разные факторы стоимости. Поэтому вам понадобится информация на уровне пароля о том, что фактор стоимости был использован, чтобы обсудить это.

Комментарии (14)

То, что вы'Снова хватает того, что хэши работы на основе исходных данных, минус исходную строку. Когда вы хотите проверить строку на хэш, вы принять прилагаемый шнурок, плюс исходные данные хэш (стоимость, соль и т. д.) и создать новый хэш. Если новый хэш совпадает со старой, строка проверяется (другими словами, строка не расшифровывается, это лад).

Имея соль не'т помочь вам грубую силу. Соль является неотъемлемой частью хэш-таким же образом, тумблеры являются частью замка. Если вы берете либо, никто не может использовать его.

Отделения для хранения бессмысленно. Вы'll должны собрать заполненный хэш для проверки его в большинстве случаев. Что's, почему все компоненты хранятся в одном удобном строку по умолчанию.

Комментарии (2)

Да, вы можете хранить это в одном поле, и много баз данных/магазин приложений соль+хэш в одном поле файла/etc.

Самая известная ОС Linux (что это'т БД), в котором хранится хэш в /etc/shadow файл, используя формат:

" и$ИД$соль хэшируется и quot$;, для печати виде хэша пароля как произведено функция Crypt (с), куда " идентификатор" это используемый алгоритм. Я (на GNU/Linux, в том, что "$1$&; стенды для MD5, назальный$2а$; это Иглобрюх, и" и quot$2У$&; - это Иглобрюх (правильный обработку 8-разрядных символов), то "$5$" и является SHA-256 и "$6$то" является SHA-512,[4] В других Unix может иметь разные значения, как на NetBSD.

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

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

Представьте, что вы'ве получил кучу пользователей, и вы've использовали метод SHA1 в качестве алгоритма хэширования. Так что ваши поля базы данных будет что-то вроде в SHA1:соль:хэш.

Если вы хотели обновить свои базы данных осуществляется, как бы вы это сделали?

Как правило, вы'д развернуть какой-то код так, что когда пользователь входит в систему, проверки пароля, и если допустимый-вы'д ре-хеш пароль с новым алгоритмом. Теперь поле для пользователя выглядит так: осуществляется:соль:хэш.

А то некоторые пользователи будут SHA1 и другие на осуществляется, и поскольку это на уровне пользователя, вам нужны параметры, которые рассказывают свой код, который пользователи, которые будут в базе.

Короче говоря, хранение параметров и хэш в одном поле-это хорошо, но разделять их по каким-то причинам (эффективность, проще код и т. д.) тоже ОК. Что's не хорошо хранит это в коде :)

ТЛ:ДР

Трой Хант недавно опубликовал подкаст, предполагая, что вместо перехода на осуществляется в порядке, выше, это's более эффективным, чтобы просто принять все SHA1 хэши в настоящее время в БД и хэш их использованием bcrypt.

Эффективно осуществляется(в SHA1(clear_password))`

Когда пользователь входит в систему вы'д

BCRYPT(SHA1(clear_password)) == 

Таким образом, все на платформе обновляется сразу, и вы не'Т есть база данных с несколькими хэш форматы для паролей. Очень чистые и очень хорошие.

Я думаю, что эта идея имеет смысл, но хотя каждый человек переносит сразу, это's не мгновенно. Если вы'вновь готовы вы принять некоторые простои на приложение (в то время как вы повторно хэш все пароли), там еще будет небольшой промежуток времени, когда некоторые пользователи на bcrypt и некоторые на SHA1 и, следовательно, ваша БД должна по-прежнему сохранять параметры алгоритма хэширования, и ваш код будет выполняться на его основе.

Комментарии (8)

С точки зрения безопасности, это не'т имеет значения, если соль и хэш пароля хранится в одном поле или отдельные поля, хотя я бы склонялся к одному полю для простоты. Единственная причина, чтобы отделить их, если ваш код приложения должен проходить в соль и пароль отдельно в функцию проверки. Если код вашего приложения требуют только один комбинированный строки, то вы могли бы также сохранить его таким образом.

В качестве примера, старшая ASP.NET членство раскалывать хэш пароля и соль на два поля БД, и новее ASP.NET идентичности хэш и соль в одном поле БД, и, в свою очередь, новые функции были изменены, чтобы обработать одну строку, как входы и выходы.

Комментарии (0)

это приемлемо хранить это в одном поле в базе данных SQL (тип varchar(99) в данном случае)

Нет. Размер данных может меняться на какое-то время. Тип varchar(Макс) поле следует использовать, если в спецификациях указывается, что размер всегда будет ровно 99 и не должно быть никаких отклонений от этого никогда. Пусть база позаботится о требованиях к хранению.

Комментарии (0)

Знаете, если его более или менее безопасным, мы должны понять цель соли.

Соль служит несколько целей (что я могу думать)

  1. Предотвратить атаки по словарю

Атаки по словарю, где логическое слово используется как часть пароля. Архетип-это слово пароль или даже р@ssW0rd. Люди несовершенны, и это'ы для них легче запомнить слова, случайной строки из букв и цифр. Атака по словарю опирается на это, чтобы сократить путь перебором принимает. Очевидно, что если мы добавляем случайный кусок вещи, то это делает данный тип атаки невозможно, или бессмысленно и ставит их туда, перебирая все.

Если злоумышленник знает, используемой соли, они должны изменить все свои файлы словарей для каждого пароля, и предполагает, что они знают, как соль добавляется в исходный пароль. Большое преимущество список Словарь скажет вам взять 1000 паролей и 1 млн. словарных слов. Затем цикл через них пытались получить несколько игр на слабые пароли. Так что придется редактировать 1 миллиона слов в 1000 раз-это просто не очень практично.

  1. Предотвратить хэш или радужной таблице атаки.

Радужная таблица, где хэши предварительно вычисляется и хранится в некоторой базе данных. Например, вы можете взять MD5 и просто запустить хеширование случайные вещи и сохраняя его. Затем, когда вы хотите взломать пароль, ты просто посмотри в радужной таблице.

Если злоумышленник имеет соли, они должны перекомпилировать радужную таблицу для каждой используемой соли. Благо эта атака оказывает, что данные, собранные раньше времени и повторно использовать его снова и снова. Это ставит их обратно для перебора пароля. По солить и солить все пароли по-разному, что в основном означает, что вы должны повторно вычислить радужную таблицу для каждой соли. Это почему это's важно использовать различные соли для каждого пароля.

Рефераты

Ни одна из этих причин действительно полагаться на соль, которая не секрет. Очевидно, все они менее сильны, если злоумышленник знает соль. А дополнительную информацию они всегда будут помогать им. Так что я бы'т сказать реклама, но есть поговорка про безопасность, основанная на неизвестности ....

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

Надеюсь, что помогает.

Комментарии (2)

Соль используется только для того, чтобы блокировать атаки по радужным таблицам. Поэтому соль может храниться с хэшированный пароль, как это делается на самые последние системы GNU/Linux, где соль хранится в /etc/тень.

Комментарии (1)