Ir al contenido
GrowScope
Abrir app

Cifrado de extremo a extremo del diario

Desde septiembre de 2026, GrowScope cifra el diario de cultivo de cada cuenta de extremo a extremo y por defecto — no es un interruptor opcional en Configuración. El contenido del diario (plantas, registros de riego/alimentación/clima/PPFD, notas, texto de historial de IA guardado) se cifra en el propio dispositivo del usuario antes de enviarse jamás al servidor, y se descifra solo en el propio dispositivo del usuario. El servidor almacena solo texto cifrado para este contenido; nunca posee una clave capaz de leerlo. Esta página documenta el mecanismo real, no un resumen de marketing sobre él.

Cómo hacerlo en GrowScope

  1. Al abrir la app por primera vez tras este despliegue (registro nuevo o cuenta existente), se ejecuta automáticamente un paso de configuración a pantalla completa — no hay botón que pulsar para iniciarlo.
  2. Se genera localmente, en el dispositivo, una frase de recuperación de 12 palabras (una mnemotecnia BIP-39, 128 bits de entropía), y se muestra una sola vez.
  3. El usuario debe confirmar dos palabras elegidas al azar de la frase antes de continuar — este paso no se puede omitir ni cerrar, porque es la única comprobación de que la frase realmente se anotó.
  4. Una vez confirmada, el diario se cifra y se migra con un único PUT de la instantánea actual; cada escritura posterior pasa automáticamente por el cifrado durante toda la vida de la cuenta.
  5. En un segundo dispositivo, o tras borrar el almacenamiento del navegador, la app pide en su lugar esa misma frase de 12 palabras para desbloquear el diario — nunca se vuelve a pedir en un dispositivo que ya la tiene almacenada localmente.

Cifrado del diario (grow_data)

Categoría
Privacidad y seguridad
Propósito
Cifrar todo el contenido del diario de cultivo del lado del cliente para que el servidor siempre almacene solo texto cifrado.
Entrada
Nada del usuario más allá de la confirmación única de la frase de recuperación — el propio cifrado es automático en cada guardado
Ubicación
Se ejecuta de forma transparente en cada guardado/carga del diario; el único paso visible es la pantalla de la frase de recuperación (obligatoria en el primer cifrado, y de nuevo si un dispositivo necesita desbloquearse)
Acción del usuario
  1. Confirmar dos palabras de la frase de recuperación de 12 palabras generada (solo en la configuración inicial)
  2. Volver a introducir la frase completa de 12 palabras para desbloquear en un dispositivo nuevo o tras borrar el almacenamiento del navegador
Resultado
El diario se almacena en el servidor como bytes cifrados opacos (`grow_data.ciphertext` + `grow_data.nonce` + un número de versión de clave) en lugar de un bloque JSON legible. También se almacena una clave de cifrado envuelta por cuenta y su sal (`users.wrapped_mek`, `wrapped_mek_nonce`, `kek_salt`), pero son criptográficamente inútiles sin la frase de recuperación del usuario.
Usado por
Cada lectura/escritura del diario — plantas, registros, notas, texto de historial de IA guardado
Relacionado
Ninguno

Notas

  • Jerarquía de claves, con precisión: la entropía de la frase de recuperación de 12 palabras se estira en una clave de cifrado de clave (KEK) mediante Argon2id (del lado del cliente, ~64 MiB de coste de memoria) con una sal aleatoria por cuenta. Esa KEK envuelve (cifra mediante AES-256-GCM) una clave maestra de cifrado (MEK) de 256 bits generada por separado — es la MEK envuelta, no la frase en sí, lo que se sube al servidor. Los registros individuales se cifran con claves derivadas de la MEK mediante HKDF-SHA256 con una cadena de contexto específica del registro (por ejemplo, el diario usa una cadena de contexto fija «grow_data», ya que hay un diario por cuenta), de modo que una clave derivada comprometida no expone la MEK ni ningún otro registro. El cifrado real del contenido usa AES-256-GCM (cifrado autenticado — un texto cifrado modificado falla al descifrarse en lugar de producir basura en silencio).
  • La frase de recuperación se genera una sola vez, localmente, y nunca se transmite ni se almacena en el servidor en forma utilizable — solo la MEK envuelta con AES-GCM y una sal pública de KDF. Esto significa que la frase es el único punto de recuperación: perderla junto con perder todos los dispositivos que ya tienen la clave almacenada en caché significa que los datos de ese diario no pueden ser recuperados por nadie, ni siquiera por GrowScope. Este es el coste deliberado de que el diseño sea genuinamente de conocimiento cero (zero-knowledge) y no solo «cifrado» — una opción de recuperación del lado del servidor requeriría que el servidor tuviera algo capaz de reconstruir la clave, que es exactamente lo que este diseño evita.
  • La única excepción revelada a «el servidor nunca ve texto plano», formulada con precisión: este diseño es de conocimiento cero para el almacenamiento y la sincronización, siempre; deliberadamente NO es de conocimiento cero para las funciones de IA, y nunca se describe como tal. Cada función con coste en créditos de IA funciona de la misma manera — Análisis de plantas con IA (puntuaciones de salud/desarrollo/dosel), Rastreador de tricomas, Detección de plagas con IA, el Asesor de fertilizantes, el análisis de texto libre del Optimizador de ubicación de equipos con IA, el análisis de diferencias con IA de Comparación de plantas, los informes semanales de Grow Coach, y el arte de tarjetas generado por IA. En cada uno de ellos, el disparador es pulsar el botón de acción: tu dispositivo descifra solo los datos concretos que esa acción necesita (por ejemplo, las fotos que seleccionaste, o los registros recientes de la planta — nunca el diario completo), los envía una vez al servidor de GrowScope, que los reenvía a un proveedor de modelo de terceros (Anthropic Claude o, vía OpenRouter, Google Gemini — elegido automáticamente según la tarea, no seleccionable por el usuario) para generar esa única respuesta, y la devuelve. Nada de esa solicitud se escribe después en una tabla de base de datos o en un registro del lado de GrowScope.
  • Por qué esto no se hace en el dispositivo en su lugar: un informe de diseño anterior pedía un modelo completamente local, en el dispositivo (vía WebLLM/MLC-LLM, un modelo cuantizado de 1–3 mil millones de parámetros ejecutándose en el navegador) como la única forma de mantener también las funciones de IA con conocimiento cero. Eso fue rechazado para GrowScope tal como existe: la optimización de dosis de fertilizante, el análisis de imágenes de tricomas/plagas y la resolución de entidades de múltiples plantas son exactamente las tareas en las que los modelos pequeños en el dispositivo son más débiles, y son funciones de pago, medidas por créditos (por ejemplo, el Asesor de fertilizantes cuesta 45 créditos por llamada) cotizadas para una calidad de nivel Claude/Gemini. Degradarlas silenciosamente bajo una bandera de «conocimiento cero» sería un peor resultado para los usuarios que dependen de esa calidad. El compromiso se tomó deliberadamente y se expone aquí claramente, en lugar de ocultarse: para la única acción que solicitas explícitamente, un proveedor de terceros procesa el texto plano relevante a ella.
  • Las cuentas existentes (previas al despliegue) se migran de forma perezosa: el paso de configuración se ejecuta la próxima vez que el propietario de esa cuenta realmente abre la app, no mediante una tarea en segundo plano/por lotes. Una cuenta que nunca se vuelve a abrir tras este despliegue simplemente permanece en el formato de almacenamiento antiguo, sin cifrar, indefinidamente — este es un compromiso aceptado de exigir que la frase de recuperación se muestre a un usuario real y presente, en lugar de generarse sin supervisión.

Preguntas frecuentes

¿Puede GrowScope leer mi diario de cultivo?

No. El diario se cifra en tu dispositivo antes de enviarse, y el servidor solo almacena los bytes cifrados más una copia envuelta de la clave de cifrado que es criptográficamente inútil sin tu frase de recuperación — que GrowScope nunca recibe ni almacena.

¿Qué pasa si pierdo mi frase de recuperación de 12 palabras?

Si además pierdes todos los dispositivos que ya tienen la clave almacenada en caché localmente, los datos de ese diario no se pueden recuperar — ni tú, ni GrowScope. Este es el coste directo de que el cifrado sea genuinamente de conocimiento cero: no existe en el servidor nada capaz de reconstruir tu clave a lo que recurrir.

¿Esto es opcional, como un interruptor en Configuración que puedo activar o desactivar?

No, ya no. Desde septiembre de 2026 toda cuenta — nueva y existente — está cifrada; no hay forma de optar por no participar, ni de revertir una cuenta ya cifrada a almacenamiento sin cifrar.

¿Cómo funciona esto con el análisis de fotos con IA o los consejos de cultivo con IA, si el servidor no puede leer mis datos?

Solo cuando ejecutas explícitamente una acción de IA (cualquier función con coste en créditos de IA — análisis de fotos, el Asesor de fertilizantes, generación de tarjetas y el resto): los datos relevantes se descifran en tu dispositivo, se envían una vez al servidor de GrowScope, y se reenvían a un proveedor de modelo de terceros (Anthropic Claude o, vía OpenRouter, Google Gemini) para generar esa única respuesta — y después no se almacenan. Nada se envía a un proveedor de IA automáticamente ni en segundo plano, y nunca más datos de los que esa acción concreta necesita.

¿Por qué la propia IA no está en el dispositivo, para que también sea de conocimiento cero?

Se consideró y se rechazó: un modelo pequeño que se ejecuta completamente en un navegador (1–3 mil millones de parámetros) no puede igualar la calidad de los modelos de nivel Claude/Gemini en las tareas que realmente hacen las funciones de IA de GrowScope — optimización de dosis de fertilizante, análisis de imágenes de tricomas/plagas, resolución de entidades de múltiples plantas — y son funciones de pago, medidas por créditos, cotizadas para esa calidad. En lugar de degradarlas silenciosamente, el diseño mantiene el almacenamiento y la sincronización con conocimiento cero siempre, y revela claramente que una solicitud de IA por acción es el único lugar donde se procesa texto plano del lado del servidor.