Cómo cuidamos tu cuenta
Resumen en lenguaje claro. Si te gusta el detalle, cada sección tiene un “ver detalles técnicos” que abre la versión completa.
En 30 segundos
- Tu contraseña de Cookidoo se cifra en tu dispositivo antes de subirla. Nadie del lado del servidor la puede leer en claro, ni siquiera nosotros.
- Entras con tu passkey (huella digital, FaceID o biometría de tu dispositivo). No hay contraseñas que recordar ni que filtrarse.
- Cada cliente conectado (Claude, ChatGPT, Cursor, navegador) tiene su propio permiso que tú otorgas y puedes revocar al instante.
- Todo viaja cifrado en cada salto: Cloudflare al frente como WAF y protección DDoS, Google Cloud (us-east4, Virginia) por detrás. Ambos tramos usan TLS válido.
Cómo entras (passkeys)
Cuando creas tu cuenta, tu dispositivo (iPhone, Mac, Android, llave física) genera una llave única - un passkey. No tienes que recordar nada: la llave queda guardada en el sistema y se desbloquea con tu huella, FaceID o el método que tu dispositivo use.
Esa llave nunca sale del dispositivo. Nosotros guardamos solo una copia pública que sirve para verificar que eres tú, pero que no permite hacerse pasar por ti.
Ver detalles técnicos
Implementamos WebAuthn / FIDO2 con la extensión PRF activa. La librería server-side es @simplewebauthn/server v13.
El authenticator (Touch ID, Windows Hello, llave hardware, etc.) genera un par de claves asimétricas. La privada nunca abandona el authenticator. Nosotros guardamos en Firestore la clave pública, un signCounter para protección anti-replay (RFC 9527), un prfSalt de 32 bytes, y metadatos de display (label, fechas).
En cada login el authenticator firma un challenge único que verificamos contra esa clave pública. Si tu passkey se compromete (lo cual es extremadamente difícil), la única forma de explotarla es teniendo el authenticator físicamente desbloqueado.
La extensión PRF nos da una segunda función: el authenticator deriva determinísticamente una semilla de 32 bytes a partir del salt que guardamos. Esa semilla se usa para descifrar tus credenciales de Cookidoo (ver siguiente sección). Importante: la semilla nunca sale del navegador.
Tus credenciales de Cookidoo
Para hablar con Cookidoo necesitamos tu email y contraseña de esa cuenta. Lo que hacemos con ellos:
1. Cuando los escribes al registrarte, tu navegador los cifra ahí mismo, antes de enviar nada. La clave de cifrado se deriva de tu passkey, así que solo tú puedes desbloquearla.
2. Subimos solo el blob cifrado. En nuestra base de datos no hay forma de leer tu contraseña, ni siquiera con acceso administrativo. Es matemática: no tenemos la clave.
3. Cuando vuelves a entrar, tu passkey desbloquea la clave, descifras el blob en tu navegador, y nos lo pasas solo para esa sesión. Cuando te desconectas, lo borramos de memoria.
Ver detalles técnicos
Cadena criptográfica:
prfOutput = WebAuthn PRF(credential, prfSalt) [32 bytes]
K_credential = HKDF-SHA256(prfOutput, "cookisync.credkey.v1") [32 bytes]
K_master = random(32) [generado una vez]
wrapped = AES-GCM(K_credential, iv₁, K_master) [guardado por device]
blob = AES-GCM(K_master, iv₂, "email\0pass") [guardado 1 vez]
Envelope encryption: cada passkey tiene su propio wrap de K_master. Agregar un dispositivo no requiere re-cifrar el blob; revocar uno solo borra ese wrap. Si pierdes todas tus passkeys, el blob queda inservible - ni nosotros podemos recuperarlo. El precio de la garantía.
Las credenciales en plano solo viven en memoria del proceso mientras tu sesión está activa, dentro de un Map<sessionToken, {email, password}> que se borra al expirar la sesión, al hacer logout, o cuando el contenedor se reinicia (entonces te vuelves a autenticar con tu passkey, que toma un toque biométrico).
Cómo viaja la información
Todo lo que entra y sale pasa por HTTPS con TLS válido en cada salto. Hay dos tramos cifrados:
- Tu dispositivo → Cloudflare: TLS contra el cert universal de Cloudflare, terminado en el datacenter de CF más cercano a ti.
- Cloudflare → Google Cloud Run: TLS contra el cert Let's Encrypt gestionado por Google, validado estrictamente por Cloudflare (modo "Full strict"). Si alguien intentara MITM entre CF y el origen, el handshake falla.
Cloudflare al frente nos da WAF, protección DDoS y rate limiting de borde sin costo extra. Importante ser honesto: Cloudflare es un proxy, no cifrado de extremo a extremo en sentido criptográfico estricto - en su edge ve el tráfico en claro (como cualquier CDN/WAF). Si esto te preocupa, puedes auditar tu propio tráfico contra el origen directo de Google Cloud Run en lugar de cookisync.com.
Ver detalles técnicos
Cloudflare termina TLS 1.3 en el edge con cert universal. La cadena upstream a Google usa TLS 1.3 con cert Let's Encrypt gestionado por Cloud Run y validado por SNI. Cabeceras de seguridad estándar vía helmet: Strict-Transport-Security (HSTS), Content-Security-Policy, X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer, Cross-Origin-*.
El servidor lee la IP real del cliente desde CF-Connecting-IP (o X-Forwarded-For respetando TRUST_PROXY) para que rate limiter y audit log atribuyan eventos al cliente correcto y no al edge de Cloudflare.
La autenticación con clientes MCP usa OAuth 2.1 con PKCE S256 (RFC 7636). Sin secretos compartidos: cualquier cliente público puede registrarse pero solo el que inició el flujo puede canjear el código de autorización por un token.
Quién puede ver qué
Cada herramienta que conectas (un cliente MCP de Claude, ChatGPT, Cursor, o el navegador mismo) crea su propia sesión separada. Cada una se identifica como tuya pero es independiente del resto.
En cualquier momento puedes ver desde tu cuenta todos los clientes conectados y revocar el que quieras con un click. Esa revocación es instantánea: el cliente revocado deja de funcionar.
Nadie más que tú puede ver tu lista de sesiones, tus passkeys, ni tu blob cifrado. Los administradores tampoco.
Ver detalles técnicos
Cada sesión es una fila en Firestore con un uid, un origin (web o mcp), un oauthClientId opcional, y un expiresAt (12 horas por default). El bearer token usado en las llamadas es el ID del documento; revocar = borrar el documento.
Los endpoints de gestión (GET /auth/sessions, DELETE /auth/sessions/:id, ídem para credentials) filtran por uid, así que aunque alguien adivinara el displayId de la sesión de otra persona no podría revocarla.
El bridge de revocación entre Firestore y memoria: hay un sweep cada 60 segundos que tira en memoria las sesiones cuyo doc ya no existe o cuyo expiresAt ya pasó. Cuando revocas manualmente, también limpiamos el map en el mismo request.
Dónde corre todo
El servidor de Cookisync vive en Google Cloud Platform, en el datacenter us-east4 (Ashburn, Virginia, EE.UU.). Esa elección minimiza la latencia hacia los proveedores de IA (Anthropic, OpenAI, Cursor, casi todos en us-east) y hacia Cookidoo, que está en Europa - desde us-east4 son ~85 ms vs ~210 ms desde Sudamérica. Por delante del origen está Cloudflare proxiando todo el tráfico, agregando WAF, mitigación DDoS y caché de borde.
Ver detalles técnicos
Stack:
- Cloudflare al frente como proxy/WAF/DDoS. Modo SSL "Full (strict)" - valida el cert del origen contra Let's Encrypt. Bot Fight Mode desactivado para no interferir con clientes MCP automatizados.
- Cloud Run (serverless containers) en la región
us-east4con un solo contenedor activo. Auto-escala a cero cuando nadie usa. - Firestore en modo Native en
us-east4, co-localizada con Cloud Run para mantener la latencia interna por debajo de 5 ms (passkeys, blobs cifrados, sesiones, invitaciones, OAuth clients, audit log). - Cloud Build orquesta el deploy: cada push a
maindispara un build de la imagen Docker (Node.js 20 Alpine) y un nuevo revision en Cloud Run. - Application Default Credentials para que el contenedor acceda a Firestore - sin claves embebidas en el código.
Si quieres borrar tu cuenta
Lo haces tú mismo desde tu cuenta, en la sección Eliminar cuenta. Te pedimos dos cosas para confirmar: escribir la frase exacta confirmo eliminar mi cuenta y un toque biométrico con una de tus passkeys. No hay correos, formularios, ni esperas.
En el mismo request borramos tu fila de usuarios, todas tus passkeys, el blob cifrado, todas tus sesiones activas (web y MCP), todos los refresh tokens emitidos a las IAs conectadas y todas tus API keys. La operación es irreversible: si más adelante quieres volver, hace falta una invitación nueva.
Borrar la cuenta no borra tu cuenta en Cookidoo: esa es de Vorwerk, nosotros solo somos un cliente que llamaba a su API en tu nombre.
Esta página es nuestro intento de no esconder nada. Si algo no se entiende, te falta contexto, o quieres ver código específico, escríbenos. Lo agregamos.