Seguridad y diseño

Mientras diseñes tu implementación de facturación integrada, asegúrate de seguir las pautas de seguridad y diseño que se tratan en este documento. Estas pautas son prácticas recomendadas para cualquier usuario del servicio de facturación integrada de Google Play.

Prácticas recomendadas de seguridad

Realiza tareas de verificación de firma en un servidor

De ser posible, debes realizar la verificación de firma en un servidor remoto y no en un dispositivo. Implementar el proceso de verificación en un servidor hace que para los atacantes resulte difícil interrumpir el proceso de verificación mediante la aplicación de ingeniería inversa a tu archivo .apk. Si transfieres el procesamiento de seguridad a un servidor remoto, asegúrate de que el protocolo de enlace entre el dispositivo y el servidor sea seguro.

Protege tu contenido desbloqueado

Para evitar que los usuarios maliciosos distribuyan tu contenido desbloqueado, no lo incluyas dentro de tu archivo .apk. Como alternativa, toma una de estas medidas:

  • Usa un servicio en tiempo real para entregar tu contenido, como el feed de contenido. Entregar contenido a través de un servicio en tiempo real te permite mantener tu contenido actualizado.
  • Usa un servidor remoto para entregar tu contenido.

Cuando entregas contenido desde un servidor remoto o un servicio en tiempo real, puedes almacenar el contenido desbloqueado en la memoria o la tarjeta SD del dispositivo. Si almacenas contenido en una tarjeta SD, asegúrate de encriptarlo y usar una clave de encriptación específica del dispositivo.

Oculta tu código

Debes ocultar tu código de facturación integrada a fin de que sea difícil para un atacante aplicar ingeniería inversa a los protocolos de seguridad y a otros componentes de la aplicación. Como mínimo, te recomendamos ejecutar una herramienta de ocultamiento como Proguard en tu código.

Además de ejecutar un programa de ocultamiento, te recomendamos usar las siguientes técnicas para ocultar tu código de facturación integrada.

  • Integra métodos en otros métodos.
  • Construye strings en el momento en vez de definirlas como constantes.
  • Usa reflexión en Java para llamar a los métodos.

Usar estas técnicas puede ayudarte a reducir la superficie de ataque de tu aplicación y minimizar los ataques que puedan poner en peligro tu implementación de facturación integrada.

Nota: Si usas Proguard para ocultar tu código, debes agregar la siguiente línea a tu archivo de configuración de Proguard:

-keep class com.android.vending.billing.**

Modifica todo el código del ejemplo de aplicación

El ejemplo de aplicación para facturación integrada se distribuye públicamente y cualquiera puede descargarla. Esto significa que un atacante puede aplicar, con relativa facilidad, ingeniería inversa en tu aplicación si usas el ejemplo de código exactamente como se publicó. El propósito del ejemplo de aplicación es que se use únicamente como tal. Si usas cualquier parte del ejemplo de aplicación, debes modificarla antes de publicarla o lanzarla como parte de una aplicación de producción.

En especial, los atacantes buscan puntos de entrada y salida conocidos en una aplicación; por ello, es importante que modifiques estas partes de tu código que sean idénticas al ejemplo de aplicación.

Usa nonces aleatorios seguros

Los nonces no deben ser predecibles ni reutilizarse. Usa siempre un generador de números aleatorios criptográficamente seguro (como SecureRandom) cuando generes nonces. Esto puede ayudar a reducir los ataques de reproducción.

Además, si haces la verificación de nonces en un servidor, asegúrate de generar los nonces en este.

Establece la string de carga de desarrollador al hacer solicitudes de compra

Con la In-app Billing Version 3 API, puedes incluir un token de string “developerPayload” enviando tu solicitud de compra a Google Play. Normalmente, esto se usa para pasar un token de string que identifica esta solicitud de compra de manera exclusiva. Si especificas un valor de string, Google Play devuelve esta string junto con la respuesta de compra. Posteriormente, cuando hagas consultas sobre esta compra, Google Play devuelve esta string junto con los detalles de la compra.

Debes pasar un token de string que ayude a tu aplicación a identificar al usuario que realizó la compra, para que luego puedas verificar que sea una compra legítima hecha por ese usuario. Para los artículos consumibles puedes usar una string generada aleatoriamente, pero para artículos no consumibles debes usar una string que identifique al usuario de manera exclusiva.

Nota: No uses la dirección de correo electrónico del usuario en la string de carga, ya que esa dirección puede cambiar.

Cuando recibas la respuesta de Google Play, asegúrate de verificar que la string developerPayload concuerde con el token que enviaste anteriormente con la solicitud de compra. Como medida de seguridad adicional, debes realizar la verificación en tu propio servidor seguro.

Toma medidas contra violaciones de derechos de autor y marca registrada

Si ves que tu contenido se redistribuye en Google Play, actúa rápidamente y con determinación. Presenta una notificación de violación de marca registrada o una notificación de violación de derechos de autor.

Implementa un esquema de revocabilidad para contenido desbloqueado

Si usas un servidor remoto para entregar o gestionar contenido, haz que tu aplicación verifique el estado de compra del contenido desbloqueado cada vez que un usuario acceda a este. Esto te permite revocar el uso cuando sea necesario y minimizar la piratería.

Protege tu clave pública de Google Play

Para mantener tu clave pública protegida contra usuarios maliciosos y hackers, no la incorpores a ningún código como string literal. En cambio, construye la string en el tiempo de ejecución a partir de piezas o usa manipulación de bits (por ejemplo, XOR con alguna otra string) para ocultar la clave real. La clave en sí misma no representa información secreta, pero no será conveniente que un hacker o usuario malicioso puedan reemplazar fácilmente la clave pública por otra.