Если я переложу проверку на удаленный сервер, я думаю, что процесс будет примерно таким:
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.
Второй вопрос, почему имеет значение, является ли наш открытый ключ буквальной строкой? В документации говорится: «Вы не хотите, чтобы хакеру или злоумышленнику было легко заменить открытый ключ другим ключом». Я не понимаю, как кто-то может использовать мое приложение, даже если они могут отредактировать двоичный файл, чтобы включить вредоносный открытый ключ, без необходимости отказываться от приложения.
Третий вопрос, не возникнут ли у меня все те же проблемы, пытаясь проверить подтверждение с моего удаленного сервера (например,хранение открытого ключа к моему удаленному серверу в приложении)?
Четвертый вопрос, неужели вся эта дополнительная безопасность напрасна, если я хочу сохранить результаты этой проверки покупки на телефоне (т. е. я не хочу, чтобы проверять состояние покупки разблокированного контента всякий раз, когда пользователь обращается к контенту)?