Каков наилучший способ отправки данных аутентификации веб-формы по протоколу HTTP?

StackOverflow https://stackoverflow.com/questions/715348

  •  23-08-2019
  •  | 
  •  

Вопрос

Одна моя знакомая компания ведет переговоры об ужесточении политики безопасности паролей во всех своих продуктах для веб-приложений.

Прямо сейчас они отправляют аутентификацию по имени пользователя / паролю в почтовых формах по HTTP, и, таким образом, они отправляются открытым текстом.

Самое простое решение проблемы - просто потребовать HTTPS для входа во все наши приложения, не так ли?

Ну, есть некоторая внутренняя дискуссия о том, чтобы вместо этого использовать какое-то собственное шифрование паролей на стороне клиента (пароль + соль и т.д.).

Существует ли общепринятое решение только для HTTP?

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

Я нашел рекомендации OWASP:http://www.owasp.org/index.php/Top_10_2007-A7#Protection

Так же, как и Microsoft:http://msdn.microsoft.com/en-us/library/aa302420.aspx

Редактировать: Недостаточно дать свою рекомендацию по использованию SSL.Мне нужна какая-то подтверждающая документация.Я ЗНАЮ, что внедрение нашего собственного шифрования на стороне клиента - это плохо.Мне нужно уметь убедительно продать это коллегам и руководству.

Также был упомянут HTTP Digest.Кажется приятным, но Digest предназначен ТОЛЬКО для HTTP-аутентификации, а не для данных, отправляемых через POST.

Это было полезно?

Решение

+1 к Ответ Мехрдада.Продвигаться вперед с использованием доморощенной криптографии рискованно.

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

TLS /SSL решает проблему не только безопасного обмена ключами, но и безопасной передачи данных.

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

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

Если вы создаете свое собственное решение для шифрования, вы должны безопасно обменять симметричный ключ. Самый простой способ сделать это - использовать TLS / SSL;более сложный способ - реализовать ваше собственное криптографическое решение для асимметричного обмена ключами.

Другие советы

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

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

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

Если вам нужно достойное объяснение того, как реализовать аутентификацию HTTP digest в вашем приложении, У Пола Джеймса есть отличная статья об этом.

Единственная реальная проблема с HTTP-аутентификацией кроется в самих браузерах:пользовательский интерфейс ужасен, но это может быть преодоленный с помощью некоторого Javascript.

Вы можете надежно хранить пароли, сохранив хэш A1.

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

Обновить: Вы не сможете защитить данные через POST, если вы либо (а) не выполните шифрование в JavaScript на клиенте, либо (б) не сделаете все через SSL.

Ты может, применив немного магии, используйте HTTP auth с формами.В конце концов, статья, на которую я ссылался выше, называется "HTTP Auth with HTML forms".Но это не будет сделано по ПОЧТЕ.

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

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

Вы потратите больше времени и денег на разработку собственного решения и не будете уверены в его безопасности.Отраслевой стандарт SSL прост в реализации и гораздо более безопасен "из коробки", чем вы можете позволить себе создать свое собственное решение.

время == деньги

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

Шифрование на стороне клиента бессильно против большинства MITM-атак.Злоумышленник может просто удалить ваш скрипт.

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

  • Хеширование реализовано в Javascript.Легко реализовать вызов-ответ для первоначального входа в систему, но не забывайте, что для злоумышленника сессионный файл cookie почти так же хорош, как пароль (вам пришлось бы ограничить вход одним IP-адресом и / или использовать скрипт для генерации одноразового файла cookie для каждого запроса, что, я полагаю, было бы сложным и хрупким решением).
  • Аутентификация с помощью HTTP-дайджеста.Более безопасный, так как он может использовать одноразовые хэши, взаимную аутентификацию и т.д., Но стандартный пользовательский интерфейс абсолютно отвратителен.

... просто используйте SSL.

Решения, работающие только по HTTP, всегда будут подвержены атакам типа "человек посередине".

Редактировать: Трассировка сети была бы простым способом доказать, что HTTP небезопасен.

Хорошо, вот единственный ответ, который вам нужен:Ваш БАНК поддерживает вход в систему / аутентификацию только через SSL.Если бы был лучший способ сделать это, они бы это сделали.

Ну, есть некоторая внутренняя дискуссия о том, чтобы вместо этого сделать какое-нибудь собственное шифрование на стороне клиента паролей (пароль + соль и т.д.).

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

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

Roll-your-own не будет подвергнут такой тщательной проверке, как существующее решение.В конечном итоге вы можете добавить дополнительные проблемы с безопасностью из-за кода.

Мы просто выпустили веб-/ мобильное приложение, чтобы делать кое-что из этого.Он создает случайные URL-адреса для входа в систему, используя HTTPS и метод шифрования hashed / AES для хранения базы данных.Есть простой JSON API, чтобы использовать его без нашего пользовательского интерфейса, вот наша статья, взгляните на нее.. http://blog.primestudiosllc.com/security/send-time-limited-secure-logins-with-timebomb-it

вы упомянули, что делаете свое собственное шифрование плюс соль...Я предлагаю использовать javascript md5 (он также используется yahoo на своих страницах, не связанных с ssl, по крайней мере, так он утверждает)...

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top