§1O problema
O cofre de senhas já existia e funcionava, mas a interface do programa de desktop era pouco prática para o dia a dia. Eu queria uma tela moderna sem trocar de formato nem abrir mão da chave física.
§2O que eu construí
- Interface webLê e grava o próprio arquivo KeePass (o arquivo é o banco, sem outro banco por trás).
- Desbloqueio pela YubiKeyDesafio e resposta, com toque, sem botão: a tela espera o toque e para quando a janela perde o foco.
- Recursos do cofrePastas, campos protegidos, tipos livres de item e lixeira, tudo gravado dentro do formato KeePass.
- Bloqueio automáticoPor inatividade.
- Teste de ponta a pontaContra um cofre falso (fixture) com chave simulada por software.
§3As partes difíceis
4 itens- 01
Desbloqueio compatível com o KeePassXC
Derivação de chave com Argon2 montada à mão em WebAssembly e resposta da YubiKey tratada do jeito do formato.
- 02
Cada gravação pede um novo toque
Cada gravação gera nova semente e exige novo toque na chave; por isso existe exclusão em lote (uma gravação, um toque).
- 03
Escrita segura do arquivo
Grava em temporário e renomeia, mantém backups rotativos, e se o arquivo mudou por fora a gravação é recusada e o app tranca.
- 04
Testar sem nunca tocar no cofre real
Cofre de teste e YubiKey falsa por software.
§4Resultado
Em produção desde agosto de 2026 e já testado e provado compatível com o cofre real do KeePassXC. O app só roda localmente; de propósito, não é exposto na rede.
§5Stack
- Next.js 16
- React 19
- TypeScript 7
- Tailwind 4
- kdbxweb (KeePass / KDBX 4.1)
- hash-wasm (Argon2)
- YubiKey (ykman)
- Design system próprio
- pm2