протокол для использования хэширования пароля с солью

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

Когда пользователь входит в систему при входе в систему, имя пользователя и пароль вводятся на стороне клиента. Я хочу знать, какая информация отправляется. Отправляет ли веб-клиент пароль в виде обычного текста или использует javascript для хеширования пароля БЕЗ соли и отправляет результат hased? Или клиент получает соль в виде простого текста с сервера, а затем клиент отправляет hased пароль + соль?

Как лучше всего хэшировать и хэшировать с солью? Подходит ли MD5 как хэш? Чем отличается хэш (пароль_простой_текст + соль) от хеша (хеш (пароль_простой_текст) + соль), где + — это конкатенация строк?


person user670800    schedule 08.06.2011    source источник


Ответы (3)


Когда браузер отправляет предоставленные вами данные, он отправляет их в формате, который наиболее вероятно соответствует требованиям RFC для протокола, по которому он взаимодействует с сервером.

В случае HTTP-соединения имя пользователя и пароль отправляются в открытом виде (то есть в виде простого текста) на ваш веб-сервер.

В случае соединения HTTPS все, отправляемое клиентом на сервер с поддержкой HTTPS (после рукопожатия), шифруется — как только оно поступает на сервер, оно расшифровывается. Какой бы программный стек вы ни использовали на стороне сервера, он должен обрабатывать это прозрачно для вас, поэтому вы снова будете иметь дело с данными в открытом виде.

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

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

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

person Sean Vieira    schedule 08.06.2011
comment
Хеширование на стороне клиента — это дополнительный уровень безопасности (хотя и небольшой) и безопасно, если вы используете другой алгоритм и соль. Конечно, использование соли, хранящейся на вашем сервере, было бы небезопасно для хеширования на стороне клиента. - person Matt; 26.03.2013
comment
Что касается вашего примера соли, это нормально для базового хэша на стороне клиента, но для хеширования на стороне сервера соль должна быть намного длиннее. Часто рекомендуется иметь длину, равную выходу хэша (например, sha512 выводит 512 бит или 64 байта, поэтому ваша соль должна быть 64 байта). Если вам нужно добавить вычислительные затраты, хеширование в тысячи раз увеличивает время входа пользователей в систему. Лучше использовать алгоритм типа bcrypt или аналогичный. - person Matt; 26.03.2013

JavaScript отправляет все, что вы ему скажете. Если вы явно не хешируете пароли через JavaScript, они отправляются в виде открытого текста на сервер, который их хеширует.

Я не думаю, что было бы хорошей идеей хешировать на стороне клиента, так как это раскрыло бы вашу соль любому, кто просматривает ваш JavaScript. Кроме того, пользователи без включенного JavaScript не смогут войти в систему.

Хэш на стороне сервера.

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

Но если вы действительно беспокоитесь о безопасности, хэшируйте с помощью SHA256. Погуглите «коллизии md5», чтобы понять, почему MD5 — не самая лучшая функция хеширования (одна из самых быстрых).

person Blender    schedule 08.06.2011

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

person bjornd    schedule 08.06.2011