Browser Extension — Chrome + Firefox
A partir da v4.8, o CipherVault tem extensão de navegador nativa em Manifest V3, com builds separados pra Chrome e Firefox. Cobre os fluxos clássicos de password manager: autofill, capture-on-submit, secret list rápido, password generator.
Features
🔍 Secret list + busca + click-to-copy
Popup mostra todos os secrets do tenant com:
- Search incremental por name/tags
- Click-to-copy com auto-clear clipboard 30s (configurável)
- Badge inline se secret tem breach watch flag
🔒 ZK unlock + decrypt-on-reveal
Vaults marcados is_zero_knowledge=true aparecem com cadeado. Click →
prompt passphrase + decrypt no popup via @ciphervault/zk-sdk. Keystore
em memória do background service worker, TTL = idle timeout.
⚡ Autofill content script
Detecta forms login/registro via heurística (input type=password +
campo username adjacente). Inject highlight + popup com 1-click fill.
📥 Capture-on-submit
Intercepta <form> submit em domain não-CV. Se credentials parecem
novas (não match com secret existente), popup oferece "salvar como
secret" pré-preenchendo name/value.
⏰ Auto-lock timer
Idle timeout configurável (5min default). Background service worker limpa keystore + força re-auth.
🔑 Password generator
6 perfis built-in:
- Alfa (a-zA-Z)
- Alfanumérico (a-zA-Z0-9)
- Simbólico (a-zA-Z0-9 + 18 chars
!@#$...) - PIN (0-9, length 4-8)
- Passphrase (EFF wordlist, 4-6 palavras)
- Custom (toggle individuais)
Output direto no clipboard ou em campo focado.
Install
Chrome / Edge / Brave
- Chrome Web Store: pendente review (será atualizado no blog)
- Self-host:
git clone https://github.com/Martinez1991/ciphervaultcd ciphervault/tools/browser-extensionnpm installnpm run build# → dist/ ready to load unpacked em chrome://extensions
Firefox
- AMO: pendente listing
- Self-host:
npm run build:firefox# → dist-firefox/ ready to load em about:debugging
Configuração
Primeira execução pede:
- URL do CV (
https://cv.acme.com.br) - Login (SSO redirect se tenant SAML, ou email+password)
Settings (gear icon):
- Idle timeout (1-60 min)
- Clipboard auto-clear (10s - 300s)
- Autofill enabled (global toggle)
- Capture-on-submit prompt (silent | ask | off)
- ZK keystore TTL (= idle timeout default)
Manifest V3 permissions
{
"permissions": [
"storage", // session + persistent settings
"activeTab", // page interaction
"scripting", // inject autofill
"tabs", // detect URL changes
"alarms", // auto-lock timer
"clipboardWrite" // password copy + auto-clear
],
"host_permissions": ["https://*/*"]
}
Não solicita <all_urls> em content script broad — só https://*/* (no
HTTP plain) + escopo por aba (activeTab).
Architecture
┌─────────────────────────────────────────────────┐
│ Browser │
│ │
│ ┌───────────────────────────────────────────┐ │
│ │ Service Worker (background.js) │ │
│ │ ├── session storage │ │
│ │ ├── ZK keystore (in-memory, idle clears) │ │
│ │ ├── alarms (auto-lock) │ │
│ │ └── CV API client (mTLS+DPoP via cv-sdk) │ │
│ └─────────────┬─────────────────────────────┘ │
│ │ │
│ ┌────────────┴───────────┬─────────────────┐ │
│ ▼ ▼ ▼ │
│ Popup Content (autofill) Content (capture)
│ • secret list • detect forms • submit hook
│ • search • highlight • offer save
│ • password gen • inject fill UI
└─────────────────────────────────────────────────┘
Segurança
- No background fetch sem user gesture (best practice MV3)
object-src 'self'+script-src 'self'CSP locked-down (no eval)- mTLS + DPoP já no SDK base — extensão herda
- Session storage (não
localStorage) — clear em browser close web_accessible_resourcesminimal — apenascontent/autofill.jsexposto- Não armazena passphrase ZK em storage persistente (
chrome.storage.sessiononly, MV3)
Limitações
- No fingerprint biometric ainda — roadmap (Web Authentication API)
- No native messaging com app desktop — Chrome/Firefox only
- No mobile (iOS Safari extension) — MV3 iOS é diferente, roadmap separado
- Capture-on-submit limitado a
application/x-www-form-urlencodedsimples — SPAs comfetch()custom não detectados em todos os casos
Referências
tools/browser-extension/no repo do produto- Issue #264 — epic do extension
- Blog post v4.8