Нужно ли хешировать пароль перед отправкой на сервер? - PullRequest
92 голосов
/ 02 августа 2010

Я заметил, что большинство сайтов отправляют пароли в виде простого текста через HTTPS на сервер.Есть ли преимущество, если вместо этого я отправил хэш пароля на сервер?Будет ли это более безопасно?

Ответы [ 11 ]

138 голосов
/ 12 февраля 2014

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

ОП никогда не упоминал об отправке пароля в незашифрованном виде по HTTP - только по протоколу HTTPS, однако многие, похоже, отвечают на вопрос об отправке пароля по HTTP по какой-то причине. Это сказало:

Я считаю, что пароли никогда не должны храниться (не говоря уже о передаче) в виде простого текста. Это означает, что не хранится на диске или даже в памяти.

Люди, которые отвечают здесь, похоже, думают, что HTTPS - это серебряная пуля, а это не так. Это, безусловно, очень помогает, и его следует использовать в любом сеансе аутентификации.

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

Итак, у нас есть ключ. Теперь нам нужно очистить любой след пароля на клиентском устройстве.

Далее нам нужно получить этот ключ для ваших систем. Вы никогда не должны передавать ключ или пароль «в открытом виде». Даже не по HTTPS. HTTPS не непробиваем. На самом деле, многие организации могут стать доверенными MITM - не с точки зрения атаки, а с целью проверки трафика для реализации своих собственных политик безопасности. Это ослабляет HTTPS, и это не единственный способ, которым это происходит (например, перенаправление на атаки HTTP MITM). Никогда не думайте, что это безопасно.

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

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

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

TL; DR:

Использовать HTTPS. Надежно хешируйте пароли, необратимо, с уникальной солью за пароль. Сделайте это на клиенте - не передавайте свой действительный пароль. Передача оригинального пароля пользователя на ваши серверы никогда не бывает «OK» или «Fine». Очистите все следы оригинального пароля. Используйте nonce независимо от HTTP / HTTPS. Это гораздо более безопасно на многих уровнях. (Ответ на ОП).

22 голосов
/ 02 августа 2010

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

17 голосов
/ 02 августа 2010

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

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

Неиспользование https является нарушением OWASP Top 10: A9-Недостаточная защита транспортного уровня

EDIT: Если в вашей реализации вы рассчитываетеsha256(client_salt+plain_text_password), а затем вычислите еще один хэш на стороне сервера sha256(server_salt+client_hash), тогда это не является серьезной уязвимостью.Тем не менее, он все еще подвержен перехвату и повторному запросу.Таким образом, это все еще явное нарушение WASP A9.Тем не менее, это все еще использует дайджест сообщения в качестве уровня безопасности.

Самым близким, что я видел при замене https на стороне клиента, является diffie-hellman в обмене ключами в javascript .Однако это предотвращает активные атаки MITM и, таким образом, до тех пор является техническим нарушением OWASP A9.Авторы кода согласны с тем, что это не полная замена HTTPS, однако это лучше, чем ничего и лучше, чем система хеширования на стороне клиента.

8 голосов
/ 03 августа 2010

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

6 голосов
/ 22 октября 2015

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

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

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

Мой подход к проблеме в веб-приложении на основе сокетов, который я создаю, заключается в том, что при подключении к клиенту сервер генерирует соль (случайную строку, которая должна быть добавлена ​​перед хэшированием) и сохраняет ее в переменной сокетовЗатем он передает этот хэш клиенту.Клиент берет пароль пользователя, хэширует его, добавляет соль с сервера и хэширует все это перед тем, как передать его на сервер.Затем он отправляется на сервер, который сравнивает этот хеш с хешем (хеш в БД + соль).Насколько я знаю, это хороший подход, но, если честно, я не слишком много читал по этой теме, и если я ошибаюсь, я бы хотел, чтобы меня исправили :)

3 голосов
/ 04 августа 2010

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

Однако базовая клиентская обфускация паролей (не хеш), отправляемая по HTTPS, имеет некоторое значение. Если я не ошибаюсь, этот метод на самом деле используется некоторыми банками. Цель этой техники - не защитить пароль от перехвата. Скорее, это препятствует тому, чтобы пароль был применим к тупым шпионским инструментам и плагинам браузера, которые просто захватывают каждый запрос HTTPS GET / POST, который они видят. Я видел файл журнала, захваченный со злонамеренного веб-сайта, который содержал 400 МБ случайных транзакций GET / POST, захваченных из пользовательских сессий. Вы можете себе представить, что веб-сайты, использующие только HTTPS, будут отображаться с открытыми паролями в журнале, но веб-сайты с очень простой обфускацией (ROT13) также будут отображаться с паролями, которые не используются сразу.

2 голосов
/ 15 июля 2017

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

Выполните оба

Выполните оба действия, потому что:

  1. Хеширование при переходе помогает покрыть уязвимости транспорта, если SSL-соединение скомпрометировано, они все равно не могут видеть необработанныепароль.Это не имеет значения с точки зрения возможности выдавать себя за авторизованных пользователей, но это защитит ваших пользователей от прочтения их паролей вместе с их электронной почтой.Большинство людей не следуют передовым методам и используют один и тот же пароль для многих своих учетных записей, поэтому это может стать серьезной уязвимостью для ваших посетителей.

  2. Если кто-то каким-то образом смог прочитать паролииз базы данных (это случается, подумайте, инъекция SQL), они все равно не смогут выполнять привилегированные действия, выдавая себя за пользователей через мой API.Это из-за асимметрии хэша;даже если они знают хэш, хранящийся в вашей БД, они не будут знать исходный ключ, использованный для его создания, и именно это ваше промежуточное программное обеспечение для аутентификации использует для аутентификации.По этой же причине вы всегда должны солить свое хеш-хранилище.

Конечно, они могут нанести много другого ущерба, если у них будет свободная воля для чтения того, что они хотят из вашей базы данных.

Я просто хочу подчеркнуть, что если вы решите хешировать ключ перед отъездом от своих клиентов, этого не достаточно - хеширование на сервере, по-моему, гораздо важнее, и вот почему: есликто-то перехватывает трафик от вашего клиента, тогда он увидит содержимое поля password.Неважно, хэш это или простой текст, они могут дословно скопировать его, чтобы выдать себя за авторизованного клиента.(Если вы не выполняете действия, описанные @ user3299591, и я рекомендую вам это сделать).Хэширование столбца БД, с другой стороны, является необходимостью и совсем не трудным для реализации.

2 голосов
/ 03 августа 2010

Использовать дайджест HTTP - он защищает пароль даже по протоколу http (но лучше всего использовать http-дайджест по протоколу https)

Википедия:

Аутентификация доступа к дайджесту HTTP является одним из согласованных методоввеб-сервер можно использовать для согласования учетных данных с веб-пользователем (с использованием протокола HTTP).Дайджест-аутентификация предназначена для того, чтобы заменить незашифрованное использование базовой аутентификации доступа, позволяя безопасно устанавливать личность пользователя без необходимости посылать пароль в виде открытого текста по сети.Дайджест-аутентификация - это в основном применение криптографического хеширования MD5 с использованием одноразовых значений для предотвращения криптоанализа.

Ссылка: http://en.wikipedia.org/wiki/Digest_access_authentication

Если вы хотите увидеть «реальное» использование, вы можете посмотреть на phpMyID - провайдера php openid, который использует http-дайджест-аутентификацию http://siege.org/phpmyid.php

.. или вы можете начать с примеров php auth по адресу http://php.net/manual/en/features.http-auth.php

Http digest rfc: http://www.faqs.org/rfcs/rfc2617

Из моих тестов все современные браузеры поддерживают его ...

1 голос
/ 03 августа 2010

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

0 голосов
/ 05 января 2017

Разве SSL / TLS не заменяет одноразовый номер? Я не вижу в этом особой ценности, поскольку SSL / TLS также защищает от повторных атак.

Ref. https://en.wikipedia.org/wiki/Cryptographic_nonce

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...