Каковы лучшие практики для защиты веб-API?

15

Мне нужно создать API веб-службы для нашего мобильного приложения для взаимодействия с нашим сервером и базой данных (в ASP.Net MVC 4, но это вряд ли актуально). Поскольку большинство действий не требует регистрации пользователей в нашем сервисе, мы хотели бы ограничить доступ только пользователям нашего приложения.

Каковы методы, позволяющие гарантировать, что вызовы, сделанные откуда-то еще (например, кто-то хочет получить все наши данные или создает неофициальное приложение), отклоняются?

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

Это кажется довольно простым для реализации и, хотя, вероятно, не на 100% доказательством, это, кажется, хорошая идея. Как вы думаете?

Antoine
источник

Ответы:

15

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

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

Представьте себе следующую схему:

  1. Клиент подключается и отправляет свой уникальный идентификатор (один идентификатор на пользователя).
  2. Сервер отвечает отправкой запроса в зашифрованном виде с открытым ключом. Этот открытый ключ связан с ранее отправленным уникальным идентификатором.
  3. Клиент решает проблему путем дешифрования данных с помощью закрытого ключа и отправляет расшифрованный секрет в открытом виде обратно на сервер.
  4. Сервер проверяет, что представленный секрет соответствует первоначально сгенерированному.

Разработчик, который взломает ваше приложение и успешно получит закрытый ключ, сможет использовать ваш API из своего собственного приложения, но он будет идентифицировать себя для вашего сервера.

Если один и тот же пользователь может делать 10 000 запросов к вашему API в день, и в среднем активный пользователь делает 2000 запросов в день, это означает, что этот разработчик сможет использовать свое приложение сам и, возможно, передать его своим друзьям, но скажем, он не сможет продать его тысячам людей только потому, что утром он будет работать всего несколько минут.

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


Дополнительное примечание, которое не отвечает на ваш вопрос, но все же может быть полезно: не думайте об API как инструменте для вашего основного продукта (мобильного приложения). Думайте об этом как о первоклассном продукте , продукте, который может быть оплачен. Одна и та же модель годами используется Amazon и Google, она начинает активно использоваться Microsoft с Azure и т. Д.

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

  • Создание API-интерфейса таким образом, чтобы оно использовалось только вашими приложениями, является сложным и дорогостоящим. Это время и деньги могут быть использованы для чего-то более полезного.

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

  • Вы никогда не представляете, как другие люди могут использовать ваши API. Это то, что случилось с Kinect. Первоначально Microsoft создала Kinect для игр. Когда Microsoft открыла API для широкой публики, они даже не предполагали, что через несколько лет его будут использовать научные приложения, сектор здравоохранения и т. Д. Он похож на веб-API: чем больше разработчиков его использует, тем шире распространяются идеи.

Арсений Мурзенко
источник
Очень интересный ответ. Возможно, нам нужно подумать, как мы можем сделать API общедоступным. Также для справки: целевой рынок во Франции, где реверс-инжиниринг и разборка запрещены, поэтому мы должны слишком много заниматься этим.
Антуан
2
@ Antoine: Revere Engineering будет незаконным в любой стране, как только лицензия запрещает это. Но тот факт, что это незаконно, не означает, что никто не будет почитать вашего приложения.
Арсений Мурзенко,