Cómo migrar de la API de SafetyNet Attestation

Si ya usas un servidor de confianza para verificar las respuestas, te resultará sencillo realizar la migración de la API de SafetyNet Attestation a la API de Play Integrity. La API de Play Integrity también se puede usar como reemplazo de las verificaciones de App Licensing que se realizan directamente con la app de Play Store a través del AIDL, como las que realiza la biblioteca de Licensing Verification (LVL). La mayoría de los cambios necesarios estarán en el extremo del servidor de confianza, que necesita leer y analizar el token de respuesta de Play Integrity. Ten en cuenta que, durante la migración, tanto la aplicación como el servidor deben admitir ambas APIs de forma simultánea para que resulten compatibles con clientes más antiguos que aún no hayan realizado la actualización.

Si a tu app se le otorgaron límites de cuota más altos para la API de SafetyNet Attestation, debes verificar el nivel de uso asignado a la API de Play Integrity y, en caso de ser necesario, pasar a un nivel más alto.

Los siguientes cambios son necesarios a los efectos de admitir la API de Play Integrity:

Cliente de Android:

  • Asegúrate de que el código pase el nonce con el formato correcto al compilador IntegrityTokenRequest:
    • String (en lugar de un array de bytes)
    • Seguro para URL
    • Codificado en Base64 y sin unión
    • Con 16 caracteres como mínimo
    • Con 500 caracteres como máximo
  • Revisa la lógica de reintentos y asegúrate de que la aplicación maneje correctamente los errores.
  • Comprueba que los datos de respuesta enviados al servidor de confianza permitan distinguir entre las respuestas de la API de SafetyNet Attestation y aquellas de la API de Play Integrity.

Servidor de confianza:

  • Revisa la lógica de generación del nonce y asegúrate de que cumpla con los requisitos de la API de Play Integrity.
  • Comprueba que el código del servidor pueda distinguir entre las respuestas de la API de SafetyNet Attestation y aquellas de la API de Play Integrity. Asegúrate de que el código analice y valide esas respuestas de forma adecuada.
  • Agrega lógica para validar y analizar las respuestas de la API de Play Integrity.
  • Dado que la nueva respuesta de la API de Play Integrity proporciona detalles adicionales, es posible que sea necesario mejorar la lógica de toma de decisiones y los datos de los comentarios que se envían a los dispositivos del cliente. Si deseas obtener más información, consulta la sección Asignación de respuestas a la API dentro de este tema.

Codificación del nonce

Un nonce relacionado con la integridad se debe pasar a la API de Play Integrity como una String codificada en Base64, segura para URL y sin unión. Este formato difiere de la API de SafetyNet Attestation, que requiere byte[].

  • Ser "seguro para URL" significa usar la variante "segura para URL y nombres de archivo" de Base64 (consulta la sección 5 del documento RFC 4648), donde se usan "-" y "_" en lugar de "+" y "/". Si deseas obtener más información sobre la codificación en Base64, consulta el documento RFC 4648.
  • "Sin unión" significa omitir todos los terminadores de línea. Por lo tanto, el resultado constará de una sola línea larga.
.setNonce(Base64.encodeToString(NONCE_BYTES,
        Base64.URL_SAFE | Base64.NO_WRAP))

Además, asegúrate de que la generación del nonce cumpla con los lineamientos de la API de Play Integrity.

Asignación de respuestas a la API

En la siguiente tabla, se muestran los campos de la API de SafetyNet Attestation y sus equivalentes de la API de Play Integrity.

API de SafetyNet Attestation API de Play Integrity Notas
timestampMs requestDetails.timestampMillis
nonce requestDetails.nonce
apkPackageName appIntegrity.packageName
apkCertificateDigestSha256 appIntegrity.certificateSha256Digest Asegúrate de que appRecognitionVerdict esté configurado como PLAY_RECOGNIZED.
ctsProfileMatch Se integró a deviceIntegrity.deviceRecognitionVerdict
basicIntegrity Se integró a deviceIntegrity.deviceRecognitionVerdict
evaluationType Se integró a deviceIntegrity.deviceRecognitionVerdict
advice Not available
error Not available La lista de etiquetas de integridad del dispositivo estará vacía.

Asignación de veredictos de integridad del dispositivo

API de SafetyNet Attestation API de Play Integrity
ctsProfileMatch basicIntegrity evaluationType deviceRecognitionVerdict
FALSE FALSE Sin etiquetas
FALSE TRUE MEETS_BASIC_INTEGRITY
TRUE FALSE Sin etiquetas
TRUE TRUE BASIC MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY
TRUE TRUE HARDWARE_BACKED MEETS_STRONG_INTEGRITY, MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY

Es posible que debas configurar el conjunto de respuestas de integridad del dispositivo si tu app usa una estrategia de aplicación forzosa compleja y necesita todos los valores posibles.

Lógica de reintentos de la API de Play Integrity

Una app debería reintentar las llamadas a la API en caso de que se muestren ciertos códigos de error. Asegúrate de haber revisado todos los códigos de error y de que la aplicación haga el reintento cuando sea necesario con retirada exponencial. Verifica que el retraso mínimo sea de al menos 5 segundos y aumente de forma exponencial (5 s, 10 s, 20 s, 40 s, etc.) para brindar el tiempo suficiente a la API y evaluar la integridad del dispositivo y la aplicación.

Reemplazo opcional de la API de App Licensing

Si usas la API de App Licensing, también tienes la opción de migrar a la API de Play Integrity, ya que el token de esta API incluye información de licenciamiento de la aplicación. Al igual que con la migración de la API de SafetyNet Attestation, debes contemplar el caso en el que varios dispositivos todavía tengan una versión anterior de la aplicación. Tu servidor de confianza debe ser capaz de procesar tanto las respuestas de la API de App Licensing como las de la API de Play Integrity.

Cómo recibir respuestas hasta que se complete la baja

Si aún no migraste a la API de Play Integrity o no quitaste la certificación de SafetyNet antes de la fecha límite de migración (31 de enero de 2024), puedes completar este formulario para solicitar una extensión. Si se aprueba para una extensión, tu app seguirá recibiendo respuestas de la certificación de SafetyNet hasta la fecha límite de baja completa (31 de enero de 2025).