Add VISION and design docs (backup/recovery, G1 integration, network trust, security/privacy, open decisions); update domain boundary and data notes
This commit is contained in:
parent
59beadc03c
commit
8286d1fec8
8 changed files with 496 additions and 5 deletions
64
docs/design/security-privacy.md
Normal file
64
docs/design/security-privacy.md
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# Tanemaki — Seguridad y privacidad (modelo de amenaza)
|
||||
|
||||
*Nota de diseño (discusión). Nace del "peor caso legal": una persona en un país donde una variedad (p.ej. cannabis) está prohibida debe poder usar la app **sin dejar datos en claro**. Extiende y matiza [backup-and-recovery.md](backup-and-recovery.md) y la postura legal del [PLAN.md](../../PLAN.md) §6.*
|
||||
|
||||
## El peor caso, como brújula
|
||||
|
||||
Si diseñamos para la persona más expuesta —alguien cuyo inventario podría ser *prueba* en su contra si le requisan o le hacen desbloquear el móvil—, protegemos a todo el mundo de paso. Esto **corrige** la conclusión provisional anterior ("los datos son de baja sensibilidad, no cifrar"): eso valía para tomates en España, no para este caso. La regla pasa a ser más fuerte:
|
||||
|
||||
> **Nunca hay datos en claro en reposo. Ni el inventario, ni el backup, ni ficheros temporales o logs.**
|
||||
|
||||
## Tres superficies distintas (cada una su respuesta)
|
||||
|
||||
### A) Datos en reposo en el dispositivo (el inventario) — **cifrado siempre**
|
||||
La base de datos local va **cifrada** (SQLCipher, que Drift/Flutter soportan). No se escribe nada en claro en disco: ni la BD, ni caché de fotos, ni logs. Así, un móvil apagado o bloqueado que se requisa **no revela nada**.
|
||||
|
||||
### B) Bloqueo de la app — **opcional, recomendado**
|
||||
Para el caso "móvil desbloqueado en la mano" (o te obligan a desbloquear en una frontera), un **bloqueo propio de la app** (biométrico/PIN, aparte del desbloqueo del teléfono) evita que abrir el móvil muestre el inventario. Rápido con huella, y protege cuando el teléfono está desbloqueado pero la app cerrada (como hacen las apps de banca o Signal).
|
||||
|
||||
### C) La copia de seguridad — **cifrada también**
|
||||
Coherente con A: el backup **también va cifrado** (el usuario lo pedía). Un archivo de copia filtrado o requisado tampoco debe estar en claro.
|
||||
|
||||
### D) La red / las ofertas — **acto deliberado, privado por defecto**
|
||||
Publicar es lo más arriesgado. Por eso cada cosa es **privada por defecto**; ofrecer es un acto consciente por ítem. Quien tiene una variedad sensible simplemente **no la ofrece**: la tiene, cifrada, en su inventario, y punto. Cuando sí se ofrece: identidad seudónima (clave), **ubicación aproximada**, sin catálogo central. Gestionar el inventario nunca toca la red.
|
||||
|
||||
## La clave del asunto: cifrar **sin** contraseña que olvidar
|
||||
|
||||
El problema del cifrado en algo que debe durar (§ de backup) era: contraseña olvidada = pérdida total. Se resuelve **no usando una contraseña memorizada como llave.** En su lugar:
|
||||
|
||||
- **Llave = una clave aleatoria fuerte**, no algo que la persona recuerde.
|
||||
- **Uso diario:** esa llave vive en el **almacén de claves del sistema** (Android Keystore / iOS Keychain / Secure Enclave), y se libera con el desbloqueo que la persona *ya hace* (huella/PIN del móvil). Cifrado invisible: no hay contraseña nueva que aprender.
|
||||
- **Recuperación / cambio de móvil:** la misma llave se guarda en un **QR imprimible** — *"tu llave; guárdala como tu mejor semilla"*. Un objeto físico, no un secreto que memorizar. Se anima a tener **dos copias** en sitios distintos (como se hace con papeles importantes).
|
||||
- **Restaurar en un móvil nuevo:** escaneas el QR → la llave → descifra la copia → todo vuelve.
|
||||
|
||||
Con esto conseguimos las dos cosas a la vez, que parecían enfrentadas:
|
||||
- **Confidencialidad total:** nada en claro, ni en el móvil ni en la copia. Sirve para el peor caso legal.
|
||||
- **Durabilidad:** no hay contraseña que olvidar. Solo pierdes datos si pierdes **a la vez** el móvil y **todas** las copias del QR. La pérdida es un objeto físico extraviable (intuitivo), no un olvido.
|
||||
|
||||
Y encaja con el público de 10 a 80: **no se le pide ninguna contraseña nueva**; usa su huella de siempre, y guarda un papel. El cifrado es invisible por defecto.
|
||||
|
||||
## Lo que la protege además, "gratis"
|
||||
|
||||
- **Es una app de semillas, genérica e inocua.** No es "una app de cannabis": es un inventario de semillas. Lo que importa —el contenido— va cifrado. La app en sí no delata.
|
||||
- **Nada en la red por gestionar.** Tener no es publicar. El inventario vive local y cifrado.
|
||||
|
||||
## Avanzado / futuro (nombrarlo, no hacerlo ya)
|
||||
|
||||
- **Negación plausible / bóveda señuelo:** un inventario "de fachada" y otro oculto, para el caso de desbloqueo forzado. Potente pero delicado (puede volverse en contra) → función posterior, con cuidado.
|
||||
- **Modo discreto:** icono/nombre camuflado. A valorar; suele ser más humo que protección real.
|
||||
- No prometer lo que no se puede cumplir: si a alguien le **obligan** a desbloquear y abrir la app, el cifrado en reposo no basta; ahí ayudan el bloqueo de app y, en su caso, la negación plausible. Ser honestos sobre los límites.
|
||||
|
||||
## Decidido
|
||||
|
||||
- **Inventario cifrado en reposo, siempre** (SQLCipher). Sin datos en claro en disco.
|
||||
- **Copia cifrada, siempre.**
|
||||
- **Llave = clave aleatoria en el almacén del sistema + QR imprimible.** **Nunca** una contraseña memorizada como único secreto (default). El QR es el mecanismo de recuperación y de portabilidad.
|
||||
- **Bloqueo de app (biométrico/PIN): opcional, recomendado** para variedades sensibles.
|
||||
- **Privado por defecto** en la red; ofrecer es opt-in por ítem.
|
||||
|
||||
## A decidir
|
||||
|
||||
- ¿Bloqueo de app **activado por defecto**, o sugerido la primera vez que marcas algo como sensible?
|
||||
- ¿Se permite una contraseña *además* del QR para quien la quiera (defensa en profundidad), asumiendo su riesgo?
|
||||
- ¿La negación plausible entra en el radar de la v1 o se aparca claramente para después?
|
||||
- Identidad: **una sola clave para todo** (perfil, ofertas, mensajes, certificaciones, Ğ1), tipo Duniter — decidido (ver [g1-integration.md](g1-integration.md)). Matiz: la **clave simétrica que cifra la BD en reposo** es un **detalle interno distinto** (no es una "identidad"), así que no contradice el "una sola identidad"; el cifrado de mensajes E2E sí deriva de la clave de identidad (ECDH), como en Cesium/Duniter.
|
||||
Loading…
Add table
Add a link
Reference in a new issue