Внедрение (безопасное) Api Keys в приложение
Я написал веб-приложение и хотел бы позволить другим разработчикам получать информацию из него.
Сервер, над которым я работаю, не такой уж крутой и не может обработать столько запросов, поэтому идея состоит в том, чтобы генерировать и назначать ключи API каждому, кто хочет запросить нашу информацию. С помощью ключей Api я могу ограничить ежедневные запросы и, возможно, собрать некоторую статистику, чтобы увидеть, какая информация действительно полезна для других разработчиков.
Дело в том, что я обеспокоен аспектом безопасности. Поскольку ключ Api будет отправлен на наш сервер (через GET/POST и т. Д.), Кто-то может прослушать запрос с помощью wireshark и получить ключ API разработчика без особых усилий, верно?
Я думал о генерации секретного ключа и ключа API. Затем я мог бы поручить другим разработчикам объединить их и отправить их в наш API. Я бы тогда проверил, что хеш действителен и разрешил запрос... Но тогда та же проблема сохранится. Хакер все еще может прослушивать этот хеш и делать запросы от имени приложения другого разработчика.
Так что мои вопросы
- Как я могу избежать этой проблемы?
- Или еще лучше, действительно ли мое беспокойство действительно? Это настоящая проблема?
- Есть ли лучший и безопасный способ разрешить доступ к моей информации, не делая ее слишком сложной для других разработчиков?
Что, вы парни, думаете?
3 ответа
Я думаю, что вы пытаетесь решить кучу разных вопросов здесь.
Если ваша цель - ограничить количество запросов к вашему серверу, вы должны создать механизм регулирования. Это нетривиально, но я бы основывал его на IP-адресе, а не на лицензионном ключе - один лицензированный пользователь может заполнить вашу систему большим количеством запросов. Вы можете регулировать по IP-адресу без реализации механизма лицензирования.
Если вы хотите создать схему лицензирования, вы должны понимать криптографию и т. Д. - это нетривиальная проблема. Например, как вы мешаете законному пользователю поделиться своим лицензионным ключом со всеми своими друзьями? Как вы мешаете хакеру украсть ваш ключ и поделиться им со всеми своими друзьями?
Есть несколько решений для этого - все они причиняют определенную боль вашим пользователям. Например, вы можете запустить свой сервис по HTTPS; это останавливает слежку, но снижает производительность. Вы можете выдавать "токены" для вашей услуги, срок действия которых истекает после определенного количества использований; получение новых токенов требует криптографического обмена (который может проверить ваш IP-адрес). Вам может потребоваться логика типа "вызов / ответ" (включая проверку IP-адреса). Все эти шаги усложняют жизнь ваших пользователей; они, вероятно, не будут вам благодарны за дополнительную работу, которую они должны сделать.
Что касается сниффа, ваша проблема может быть решена с помощью HTTPS на вашем сервере.
Определенно имеет смысл поставить некоторую аутентификацию на API, если вы хотите ограничить доступ + потенциальные ограничения на использование. Если вы используете ключ API и хотите избежать перехвата, тогда HTTPS - это, безусловно, верный путь. Если это не вариант, вы также можете использовать аутентификацию в стиле хеш-функции, например oAuth 1.0 (http://oauth.net/core/1.0/) или аутентификацию Amazon AWS. Они работают, выдавая вашим пользователям API идентификатор и секрет. Они используют секрет на стороне клиента, вставляя его в тело сообщения, вычисляя хеш и включая хеш (не секрет) в запрос. На входящей стороне вы сравниваете хеш с той же самой операцией, которая выполняется над содержимым сообщения с включенным в него конкретным секретом.
Это означает, что вы можете проверить отправителя, не отправляя секрет по сети (обратите внимание, что содержимое по-прежнему не защищено, но вы избегаете передачи ключа по сети при каждом запросе). Недостатком является сложность реализации для разработчиков. Даже если вы используете шаблон oAuth 1.0, для которого есть библиотеки, это немного накладные расходы.
Я работаю в 3scale, и некоторые из наших инструментов также могут быть полезны - наши системы предоставляют ключи API, общий доступ к oAuth Secret, а также ограничения скорости API из коробки (http://www.3scale.net и библиотеки PHP здесь: https://github.com/3scale/3scale_ws_api_for_php).