Подтвердить что ты не робот

Безопасность Websocket

Я ищу для внедрения веб-приложений (angular) и iPhone с помощью WebSockets для связи с нашим сервером. В прошлом, используя HTTP-запросы, мы использовали хеширование с использованием данных запроса, url, timestamp и т.д. Для аутентификации и защиты запросов.

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

Есть ли у кого-нибудь идеи или хорошие практики?

4b9b3361

Ответ 1

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

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

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

В мобильном приложении вы можете легко использовать один из нескольких криптографических библиотек, обеспечивающих безопасный сеансовый обмен сообщениями с сервером со значительно более высокими гарантиями безопасности, без зависимости:

  • https://github.com/mochtu/libsodium-ios, libsodium-ios, обертка ios для NaCl, одна из лучших современные криптографические библиотеки, которые имеют множество новых реализаций для криптографии ECC, высоко оценены в академических кругах и написаны сумасшедшим, стремящимся получить лучшую производительность при любых обстоятельствах (словом: я обожаю это:)).

  • Themis, проект, в который я внес свой вклад, у нас очень удобная версия iOS для нашей iOS-библиотеки, а также удобный учебник по безопасному трафику через веб-сайты в iOS: https://www.cossacklabs.com/building-secure-chat

Ответ 2

Чтобы защитить свои сообщения, используйте WebSockets через SSL/TLS (wss://вместо ws://). Не сворачивайте свой собственный криптографический файл.

Об аутентификации. Большая разница между HTTP и WebSockets заключается в том, что HTTP - это протокол без учета состояния, а WebSockets - нет.

С помощью HTTP вы должны отправлять заголовки (куки, токены, что угодно) с каждым запросом. С помощью WebSockets вы устанавливаете соединение. В первых взаимодействиях вы можете аутентифицировать клиента, а для остальной части соединения вы знаете, что клиент аутентифицирован.

Люди в Heroku описали шаблон, в котором клиент аутентифицируется с использованием HTTP, получает билет и затем отправляет этот билет в качестве первого сообщения через соединение WebSocket. См. https://devcenter.heroku.com/articles/websocket-security

Ответ 3

Я согласен с соединением wss://SSL/TLS. Всегда используйте зашифрованный трафик. Существует несколько способов реализации проверки подлинности. Глянь сюда: http://simplyautomationized.blogspot.com/2015/09/5-ways-to-secure-websocket-rpi.html

Для большинства примеров используются python или nodejs и предназначены для малины Pi, но общие понятия - это хорошие идеи для рассмотрения. В сообщении есть ссылки на вспомогательную библиотеку SocketRocket, которая позволяет вставлять аутентификацию в заголовок auth (SocketShuttle).