Защита доступа к веб-API

У меня есть простой веб-API, доступный через HTTP, с некоторыми соответствующими мобильными приложениями, читающими эти данные. Теперь кто-то декомпилировал приложение / понюхал HTTP-трафик, получил URL-адрес моего веб-API и создал своего собственного клиента, действующего как один из моих.

Как я могу защитить доступ к моему API только для своих собственных клиентов? Даже с мыслью о том, что кто-то декомпилирует мое приложение.

Изменение кода сервера и клиента – это вариант!

Изменение кода сервера и клиента – это вариант!

Во-первых, вы не можете полностью его предотвратить (без судебного иска :). Используйте SSL / TLS, что поможет с возможностью обнюхивания.

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

Используйте TLS (преемник SSL).

Короче говоря, никто не сможет обнюхать трафик, потому что он будет зашифрован. Базовая версия включает только сертификат сервера – создать сертификат (самозаверяющий для запуска) и позволить серверу использовать. Что происходит (я не буду вдаваться в рукопожатие):

  • клиент отправляет запрос
  • сервер отвечает своим открытым ключом
  • клиент генерирует симметричный секретный ключ (используя AES или 3DES), шифрует его с помощью открытого ключа сервера (RSA) и отправляет его на сервер
  • сервер расшифровывает симметричный секретный ключ (только сервер, владеющий закрытым ключом, может расшифровать его)
  • связь продолжается, когда каждое сообщение (запрос / ответ) зашифровывается секретным ключом, который был надежно передан

Большинство из них обрабатываются API, которые вы будете использовать, но хорошо знать, как обстоят дела.

Как проверить подлинность веб-запроса?

Основная HTTP-аутентификация, очевидно, недостаточна, если существует риск того, что трафик будет обнюхать, если его передача не будет передана через HTTPS (что было бы безопасно).

Существует множество других подходов – механизмы, основанные на вызовах (например, аутентификация дайджеста), клиентские сертификаты и SSL.

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

Или просто ограничьте доступ URL (через .htaccess) к фиксированному набору ip-адресов (опционально проверенных с использованием IPSEC).

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

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

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