Проверка биллинга в приложении Android

Если я переложу проверку на удаленный сервер, я думаю, что процесс будет примерно таким:

Android Market                  Application     Remote Server
       |--------IN_APP_NOTIFY------->|                |
       |                             |-----nonce----->|
       |                             |<----nonce------|
       |<-GET_PURCHASE_STATE_CHANGED-|                |
       |---PURCHASE_STATE_CHANGED--->|                |
       |                             |--verification->|
       |                             |<-verification--|

Если я правильно понимаю, одноразовый метод заключается в том, чтобы уменьшить уязвимость атак повторного воспроизведения, а проверка - уменьшить уязвимость спуфинга. Кроме того, причина, по которой документы рекомендуют разгрузить обработку безопасности, заключается в том, что на этапе проверки требуется доступ к моему общедоступному ключу издателя Android Market, а цель удаленного сервера - предотвратить включение / вычисление указанного ключа в моем коде.

Первый вопрос, есть ли причина безопасности, по которой удаленный сервер может генерировать / проверять одноразовые номера? Если этап проверки выполнен правильно, мы узнаем с удаленного сервера, было ли сообщение подделано. Мне кажется, что nonce нужен только для того, чтобы обнаружить, что кто-то ретранслирует IN_APP_NOTIFY.

Второй вопрос, почему имеет значение, является ли наш открытый ключ буквальной строкой? В документации говорится: «Вы не хотите, чтобы хакеру или злоумышленнику было легко заменить открытый ключ другим ключом». Я не понимаю, как кто-то может использовать мое приложение, даже если они могут отредактировать двоичный файл, чтобы включить вредоносный открытый ключ, без необходимости отказываться от приложения.

Третий вопрос, не возникнут ли у меня все те же проблемы, пытаясь проверить подтверждение с моего удаленного сервера (например,хранение открытого ключа к моему удаленному серверу в приложении)?

Четвертый вопрос, неужели вся эта дополнительная безопасность напрасна, если я хочу сохранить результаты этой проверки покупки на телефоне (т. е. я не хочу, чтобы проверять состояние покупки разблокированного контента всякий раз, когда пользователь обращается к контенту)?

8
задан lwiseman 19 December 2011 в 09:20
поделиться