# Seguridad

> Base de datos cifrada (SQLite3MC), biometría como puerta de acceso y cuidados con datos locales.

Source: https://crossfly.dev/es/docs/best-practices/seguranca — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Seguridad

Dos pilares prácticos para proteger datos en el dispositivo: **base de datos cifrada** y **biometría como
puerta de acceso**.

## Base de datos cifrada (SQLite3MC)
Abre SQLite con una clave — cifra **ChaCha20-Poly1305** por defecto (o `SQLCIPHER`):
```java
byte[] chave = derivarChaveDaSenha(senhaUsuario);   // ⚠️ deriva de la contraseña con KDF — NUNCA hardcode
try (SqliteDb db = SqliteDb.open("cofre.db", chave)) {
   // … datos cifrados de forma transparente …
   db.rekey(novaChave);                              // cambia la clave (ej.: cuando el usuario cambia la contraseña)
}
```
- **Costo-cero sin clave, cifra transparente con clave** — sin clave es SQLite normal; con clave, todo se
  cifra/descifra en el acceso, sin cambiar tu SQL.
- **Nunca hardcodees la clave.** Derívala de una contraseña del usuario con un KDF; guarda solo el material
  necesario en el keystore de la plataforma.
- Cuidado al **quitar la cifra** (`rekey` para desproteger) — el archivo pasa a ser legible en claro.

## Biometría como puerta de acceso
Antes de un área sensible (financiera, datos personales), exige biometría:
```java
if (Biometry.isAvailable()) {
   Biometry.authenticate("Acessar cofre", "Cancelar", false,
      (res, msg) -> Component.onUI(() -> {
         if (res == Biometry.AuthResult.SUCCESS) abrirCofre();
         else loginPorSenha();                 // fallback siempre
      }));
} else {
   loginPorSenha();
}
```
- Los **datos biométricos nunca salen del dispositivo** — la app solo recibe `SUCCESS`/`FAILURE`/etc.
- La biometría es autenticación **local**: **complementa**, no sustituye, la autenticación de la aplicación
  (login en el servidor).

## Otros cuidados
- **Clipboard:** no copies secretos al portapapeles (`Device.clipboardCopy`) — queda
  accesible a otras apps.
- **Archivos/`homeFolder`:** los datos en `Device.homeFolder` no están cifrados por defecto — usa la base
  cifrada para lo sensible.
- **Logs:** no registres contraseñas/tokens con `Debug.log`.

## Buenas prácticas
- Datos sensibles → **SQLite cifrado**; clave derivada de contraseña (KDF), nunca en el código.
- Biometría como gate local + **siempre** un fallback de aplicación.
- Nada de secretos en clipboard, archivo en claro o log.

## Errores comunes
- Clave hardcodeada en el código (cualquiera la extrae del binario).
- Tratar la biometría como si sustituyera el login del servidor.
- Guardar token/contraseña en archivo no cifrado en el `homeFolder`.

## Ver también
- [Persistencia con SQLite](/docs/data-and-services/storage-sqlite) · [Biometría](/docs/data-and-services/device-biometry)
