Платежная проверка Android в приложении

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

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

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

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

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

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

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

1 ответ

Решение

Первый вопрос: есть ли причина безопасности для удаленного сервера для создания / проверки одноразового номера?

Да, сервер должен сгенерировать одноразовый номер и выполнить проверку. Как правило, все, что связано с безопасностью, должно выполняться почти всегда на сервере. Одноразовый номер - это "число, используемое только один раз". Итак, правильная вещь для сервера:

  1. создать и сохранить одноразовый номер.
  2. получить ответ.
    • если ответ содержит сохраненный одноразовый номер, проверьте подпись и обработайте ее. Стереть NONCE.
    • если ответ содержит несохраненный одноразовый номер, он, скорее всего, является сфабрикованным / реплицированным, поэтому откажитесь.

Второй вопрос, почему имеет значение, если наш открытый ключ является литеральной строкой?

Немного, если вы выполняете проверки безопасности для приложения, совершенно не имеет значения, если вы делаете свою работу на сервере (как вы должны).

Если вы выполняете защиту в приложении, приложение может быть взломано, чтобы обойти защиту. Одним из способов является изменение открытого ключа, который проще, если он сохраняется в виде одной строки.

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

Нет, не будешь. Никто не может получить доступ / изменить код сервера. По крайней мере, так просто, как может в приложении.

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

Смотря как.

Самый "безопасный" способ осуществления покупок в приложении с использованием сервера подразумевает:

  • Вы сохраняете свой "покупаемый" контент на сервере. Если пользователь покупает его, вы загружаете его в приложение и каким-то образом сохраняете его для "копирования" на другой телефон.
  • с сервера отправляйте контент только в том случае, если процесс проверки выполнен правильно на СЕРВЕРЕ.
  • из приложения, если вы не обнаружите "сохраненный" контент, выполните операцию "восстановление транзакций", а затем загрузите все необходимое с сервера.
  • Покупки в приложении Google Play не предназначены для простого предоставления контента, они предназначены для совершения покупок с централизованного сайта и, следовательно, более просты для пользователя. Мы разработчики в конечном итоге с большим количеством работы, чтобы использовать его.
Другие вопросы по тегам