Предположим, у вас есть мобильное приложение (Windows Phone или Android), которое соединяет ваш сервер с SOAP.
Для упрощения, скажем, у нас есть веб-сервис, реализованный на С#. Сервер предоставляет следующий метод:
[WebMethod]
public string SayHallo() { return "Hallo Client"; }
С точки зрения сервера вы не можете определить, является ли вызывающее устройство вашим мобильным приложением или разработчиком, пытающимся отладить ваш веб-сервис или хакер, пытающийся перепроектировать/использовать ваш back-end.
Как можно определить, что источником вызова веб-службы является приложение? так как любой, кто имеет WSDL, может вызывать WS.
Я знаю, что могу реализовать некоторые стандартные меры безопасности для веб-службы, например:
- Внедрить HTTPS на сервере, чтобы сообщения проходили зашифрованными, а опасность подслушивания снижалась.
- Подпишите запросы на стороне клиента с помощью алгоритма дайджеста/хэширования, проверьте подпись на сервере и отклоните сообщения, которые не были правильно подписаны.
- Запись пользовательских заголовков в HTTP-запросе. В любом случае можно моделировать заголовки.
Однако любой хорошо опытный хакер или разработчик, который знает алгоритм подписи, все равно может генерировать хорошо подписанное, хорошо отформатированное сообщение. Или действительно хороший хакер может разобрать приложение и получить доступ к скрытому ноу-хау моего "секретного" протокола связи.
Любые идеи, как заставить метод SayHallo() отвечать ТОЛЬКО на запрос, сделанный из моего мобильного приложения?
Мы работаем в контексте мобильного приложения с аппаратным доступом, может быть что-то, что можно сделать, используя аппаратные возможности.
Если кто-то задается вопросом, я думаю о том, как сделать мобильное приложение достаточно безопасным для таких важных приложений, как банковское дело, например.
Спасибо за ваши идеи.