Я пытаюсь создать безопасную систему для передачи данных из клиентского приложения Android на веб-сервер, работающий под управлением PHP.
Что я хочу сделать, так это убедиться, что система криптографически защищена таким образом, чтобы сообщения из приложения могли быть проверены как на самом деле от самого приложения, а не от коварного пользователя, который, возможно, написал собственный сценарий или, возможно, используя cURL для игры в систему.
Существует несколько вариантов использования такого рода проверки, например:
Если приложение содержит рекламу, из которой вы собираете метрики, вам следует убедиться, что данные о кликах отправляются из приложения, а не от злоумышленника, который вычислил ваш API и отправляет фиктивные данные.
В приложении может быть опрос с несколькими вариантами ответов, и, опять же, вам нужно убедиться, что результаты опроса собираются из приложения.
Приложение собирает данные GPS, и вы хотите убедиться, что данные отправляются из самого приложения.
В каждом из этих случаев вы хотели бы убедиться, что источником сообщений является само приложение, а не просто пользователь, запускающий простой скрипт для подделки данных.
Некоторые идеи, которые я рассмотрел: -
SSL — хорошо работает для защиты канала и предотвращения несанкционированного доступа (что соответствует некоторым требованиям), но все же не может гарантировать целостность источника данных.
Криптография с открытым ключом. Клиентское приложение может шифровать данные с помощью закрытого ключа, а затем передавать их на сервер, где их можно расшифровать. Проблема в том, что закрытый ключ должен быть жестко закодирован в приложении — приложение может быть декомпилировано, а закрытый ключ извлечен, а затем использован для отправки поддельных данных.
Домашние алгоритмы. Очень похожий вопрос задается здесь, где решения работают только до тех пор, пока "кто-то не вычислит ваш алгоритм" - т.е. не очень хорошее решение!
Хэш-цепочка. Это показалось очень интересным способом использования -time для проверки каждой полезной нагрузки данных от клиента к серверу, но опять же это зависит от того, что само приложение не декомпилируется, потому что пароль все еще должен храниться приложением.
Мои ограниченные познания в криптографии заставляют меня думать, что на самом деле теоретически невозможно построить систему, которая была бы полностью верифицируемой таким образом, потому что, если мы не можем доверять конечному клиенту или каналу, то на на чем можно основывать любое доверие... но, возможно, я что-то упустил из виду!