React Native / Expo

Gestor de secretos para React Native: claves que nunca viajan en tu bundle

Todo lo que metes en el bundle JS de tu app — valores de .env inyectados al compilar, claves en los extras de app.json, constantes 'escondidas' — se extrae del APK o del IPA en minutos con herramientas gratuitas. La ofuscación sube el esfuerzo, no cambia el resultado. Koove saca el secreto del binario por completo.

La verdad incómoda de los secretos en apps móviles

En React Native y Expo, .env no funciona como en un servidor: los valores se INYECTAN en el bundle de JavaScript al compilar. Tu 'variable de entorno' viaja dentro del artefacto que subes a la store, legible para cualquiera que lo descargue.

La ofuscación y el cifrado de strings son disuasión — suben el coste del atacante pero no eliminan la extracción, porque la app tiene que tener el plaintext en algún momento. Quien te prometa lo contrario te está vendiendo teatro.

La única arquitectura honesta: que el secreto nunca viaje en el binario. Vive cifrado en el servidor y se descifra SOLO en un dispositivo que demostró criptográficamente ejecutar tu app genuina sin modificar.

Cómo funciona Koove en una app React Native

El SDK genera una identidad de dispositivo (X25519), demuestra que la app es genuina vía Apple App Attest o Google Play Integrity, y solo entonces el escritor envuelve secretos para ese dispositivo. El descifrado ocurre en memoria, tras Face ID / huella.

El flujo completo está verificado en vivo de extremo a extremo en un iPhone físico (App Attest real, sin bypass): challenge → attestation en el Secure Enclave → verificación de la cadena de certificados en el servidor → dispositivo bendecido como destinatario → descifrado local tras biometría.

npm install @koove/sdk expo-local-authentication expo-secure-store

import { KooveClient } from '@koove/sdk';

const koove = new KooveClient({
  apiUrl: 'https://koove.io/api',
  appId: process.env.EXPO_PUBLIC_KOOVE_APP_ID,   // identificadores públicos
  appToken: process.env.EXPO_PUBLIC_KOOVE_TOKEN, // puerta, no secreto
});

// 1) Attesta y registra este dispositivo (App Attest / Play Integrity)
await koove.init();

// 2) Descifra en el dispositivo, tras biometría. El plaintext queda en memoria.
const apiKey = await koove.decryptSecret(envelope);

Lo que debes saber (edición honesta)

Requiere un development build de Expo o bare workflow — los módulos nativos de attestation no corren en Expo Go. iOS 14+ para App Attest. Ambas plataformas están verificadas en hardware físico: App Attest en iPhone y Play Integrity en un Pixel, sin dev-bypass.

Un dispositivo rooteado/con jailbreak, o un atacante decidido con TU app corriendo, puede leer lo que esa app lee — ningún cliente es de confianza. Por eso los controles reales viven en el servidor: gating por attestation, revocación por dispositivo con kill criptográfico, detección de anomalías y canary tokens que un cliente comprometido no puede apagar.

Y la revocación es honesta: un secreto ya descifrado y cacheado en un dispositivo no se des-entrega. Kill total = rotar el valor.

Enfoques para secretos en móvil, comparados con honestidad

EnfoqueLo que pasa en realidad
.env / extras de app.jsonSe inyecta en el bundle. Extraíble en minutos. Vale SOLO para config no secreta.
Ofuscación / cifrado de stringsDisuasión. Sube el esfuerzo; el plaintext sigue recuperable de una app en ejecución.
Proxear todo por tu backend¡Válido! Pero cada llamada a terceros cuesta un round-trip, y el backend concentra todas las claves.
Koove (attestation + envelope encryption)El secreto nunca va en el binario; se descifra solo en dispositivos verificados, tras biometría; revocación por dispositivo.

Preguntas frecuentes

¿Funciona con Expo Go?

No — la attestation requiere módulos nativos custom, así que necesitas un development build de Expo (npx expo prebuild + run) o una app bare. Es un paso de setup que se hace una vez.

¿Y los dispositivos rooteados o con jailbreak?

El SDK falla en local al detectarlo (disuasión), pero con honestidad: un dispositivo totalmente comprometido puede leer lo que tu app lee. La detección de anomalías server-side y los canaries existen precisamente porque el cliente nunca es de confianza.

Entonces, ¿el appToken de mi bundle es un secreto?

No. El appToken identifica tu app y limita el acceso a TEXTO CIFRADO únicamente. Sin la clave privada de un dispositivo attestado, los sobres son ilegibles. Ese es el punto de la arquitectura.

¿Paridad iOS y Android?

Sí: App Attest (iOS) y Play Integrity (Android) están verificados de extremo a extremo en hardware físico — attestation real, sin dev-bypass, con el veredicto almacenado server-side. Publicamos los walkthroughs con timestamps reales.

Publica una app React Native que no filtra claves

npm install @koove/sdk — plan gratuito, app de ejemplo en GitHub, documentación honesta.