# Segurança

> Banco criptografado (SQLite3MC), biometria como porta de acesso e cuidados com dados locais.

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

# Segurança

Dois pilares práticos para proteger dados no dispositivo: **banco criptografado** e **biometria como
porta de acesso**.

## Banco criptografado (SQLite3MC)
Abra o SQLite com uma chave — cifra **ChaCha20-Poly1305** por padrão (ou `SQLCIPHER`):
```java
byte[] chave = derivarChaveDaSenha(senhaUsuario);   // ⚠️ derive de senha com KDF — NUNCA hardcode
try (SqliteDb db = SqliteDb.open("cofre.db", chave)) {
   // … dados cifrados de forma transparente …
   db.rekey(novaChave);                              // troca a chave (ex.: ao usuário mudar a senha)
}
```
- **Custo-zero sem chave, cifra transparente com chave** — sem chave é SQLite normal; com chave, tudo é
  cifrado/decifrado no acesso, sem mudar o seu SQL.
- **Nunca faça hardcode da chave.** Derive de uma senha do usuário com um KDF; guarde só o material
  necessário no keystore da plataforma.
- Cuidado ao **remover a cifra** (`rekey` para desproteger) — o arquivo passa a ser legível em claro.

## Biometria como porta de acesso
Antes de uma área sensível (financeiro, dados pessoais), exija biometria:
```java
if (Biometry.isAvailable()) {
   Biometry.authenticate("Acessar cofre", "Cancelar", false,
      (res, msg) -> Component.onUI(() -> {
         if (res == Biometry.AuthResult.SUCCESS) abrirCofre();
         else loginPorSenha();                 // fallback sempre
      }));
} else {
   loginPorSenha();
}
```
- Os **dados biométricos nunca saem do dispositivo** — o app só recebe `SUCCESS`/`FAILURE`/etc.
- Biometria é autenticação **local**: ela **complementa**, não substitui, a autenticação da aplicação
  (login no servidor).

## Outros cuidados
- **Clipboard:** não copie segredos para a área de transferência (`Device.clipboardCopy`) — fica
  acessível a outros apps.
- **Arquivos/`homeFolder`:** dados em `Device.homeFolder` não são cifrados por padrão — use o banco
  cifrado para o que é sensível.
- **Logs:** não registre senhas/tokens com `Debug.log`.

## Boas práticas
- Dados sensíveis → **SQLite cifrado**; chave derivada de senha (KDF), nunca no código.
- Biometria como gate local + **sempre** um fallback de aplicação.
- Nada de segredo em clipboard, arquivo em claro ou log.

## Erros comuns
- Chave hardcoded no código (qualquer um extrai do binário).
- Tratar biometria como se substituísse o login do servidor.
- Guardar token/senha em arquivo não cifrado no `homeFolder`.

## Veja também
- [Persistência com SQLite](/docs/data-and-services/storage-sqlite) · [Biometria](/docs/data-and-services/device-biometry)
