При проверке того, что пользователь приобрел или загрузил легальную копию вашего приложения из Google Play Store, лучше всего выполнить проверку лицензии на сервере, который вы контролируете.
В этом руководстве представлен пошаговый процесс проверки лицензии на стороне сервера, а также некоторые рекомендации по выполнению этой проверки.
Обзор процесса
На рисунке 1 показано, как информация передается между вашим приложением, Google Play и вашим частным сервером:
- Ваше приложение отправляет запрос в Google Play, спрашивая, приобрел ли конкретный пользователь или загрузил легальную копию вашего приложения.
- Google Play отвечает, отправляя объект данных ответа (объект типа
ResponseData
) в ваше приложение. Этот объект представляет собой подписанную информацию, в которой указывается, приобрел ли пользователь или загрузил законную копию вашего приложения. - Ваше приложение отправляет запрос на частный сервер, которым вы управляете, проверяя содержимое данных ответа.
- Сервер отвечает, отправляя вашему приложению статус, указывающий, действительно ли пользователь приобрел или загрузил законную копию вашего приложения. Если сервер выдает сообщение об успехе, проверьте ответ , а затем предоставьте пользователю доступ к ресурсам, для которых требуется лицензия.
Поскольку данные ответа подписываются Google Play, а затем проверяются на вашем сервере, изменить объект на устройстве, на котором работает ваше приложение, невозможно. Если ваше приложение зависит от сервера и предоставляет ресурсы только законным пользователям, ваше приложение значительно более защищено от неавторизованных пользователей.
В следующих разделах приводятся дополнительные соображения, которые следует учитывать при проверке лицензии на стороне сервера.
Защита от атак повторного воспроизведения
После получения ответа от Google Play относительно статуса лицензии пользователя пользователь может скопировать данные ответа и использовать их несколько раз или передать их другим пользователям, которые затем смогут подделать свои собственные запросы к частному серверу вашего приложения. Этот вид действий известен как атака повтора .
Чтобы снизить вероятность успешного выполнения пользователями атак повторного воспроизведения, примите следующие меры перед отправкой запроса на сервер вашего приложения:
Проверьте временную метку, включенную в данные ответа, и убедитесь, что Google Play сгенерировал ответ недавно.
Ограничьте скорость запроса вашего сервера, например экспоненциальную задержку, чтобы уменьшить количество попыток вашего приложения отправить одни и те же данные ответа на сервер вашего приложения.
Прежде чем проверять содержимое данных ответа Google Play на вашем частном сервере, сделайте первоначальный запрос на основе аутентификации на ваш частный сервер. В этом первом запросе отправьте учетные данные пользователя на ваш сервер, и ваш сервер затем ответит nonce или номером, который используется только один раз. Затем вы можете включить этот одноразовый номер в свой следующий запрос к вашему частному серверу, запрашивая данные проверки лицензии. Подробную информацию о том, как выбрать подходящее значение для nonce, см. в разделе « Создание подходящего значения nonce» .
Создайте подходящее значение nonce
Используйте один из следующих методов, чтобы создать значение nonce, которое трудно угадать:
- Сгенерируйте хеш-значение на основе идентификатора пользователя.
- Генерируйте случайное значение для каждого пользователя. Сохраните это случайное значение на сервере вашего приложения как часть атрибутов данного пользователя.
Проверьте данные ответа с вашего сервера
Просматривая данные ответа, которые сервер вашего приложения отправляет в ваше приложение, убедитесь, что ответ библиотеки проверки лицензии не поддельный. Проверьте подпись, включенную в данные ответа сервера приложений, сравнив ее с ключом, который ваше приложение получило от Google Play на предыдущем шаге.
Также стоит помнить, что блок, относящийся к библиотеке проверки лицензий (LVL), является единственной подписанной частью. Таким образом, это единственная часть данных ответа вашего сервера приложений, которой ваше приложение должно доверять.