
Um gerenciador de senhas local para todos
<div align="center"> # APM **Um gerenciador de senhas local melhor para todos.** [](https://golang.org) [](LICENSE) [](https://aaravmaloo.github.io/apm) [](https://github.com/aaravmaloo/apm/actions/workflows/ci.yml) [](https://github.com/aaravmaloo/apm/releases/latest) [](https://github.com/aaravmaloo/apm/stargazers) [](https://github.com/aaravmaloo/apm/issues) </div> APM é um gerenciador de senhas CLI rápido e de conhecimento zero, escrito em Go e Rust. Ele armazena **mais de 25 tipos de segredos estruturados** em um único cofre criptografado — de senhas e códigos TOTP a chaves SSH, registros médicos, fotos e arquivos binários. Dois binários são distribuídos a partir deste repositório: `pm` para uso pessoal e `pm-team` para cofres organizacionais compartilhados. --- ### Por que APM? - **Rápido e fácil de aprender** — sem memorizar comandos ou flags. O APM solicita tudo o que precisa. Flags de CLI também estão disponíveis para usuários avançados que desejam máxima velocidade. - **Conhecimento zero** — sua senha mestra nunca é armazenada. Três chaves separadas de 32 bytes são derivadas usando Argon2id. Ninguém além de você pode descriptografar seu cofre. - **Criptografia dupla** — escolha entre AES-256-GCM ou XChaCha20-Poly1305. Integridade em camada dupla via HMAC-SHA256 sobre a autenticação AEAD. - **Portátil** — um arquivo de cofre, um binário. Leve seu cofre para qualquer lugar. - **Nuvem opcional** — sincronize com Google Drive, GitHub ou Dropbox. Totalmente opcional; nenhuma conta é necessária para usar o APM. - **Pronto para IA** — servidor MCP nativo com tokens com escopo para que Claude, Cursor ou qualquer agente compatível com MCP possa acessar seu cofre com segurança. - **Pronto para equipes** — RBAC completo, departamentos, fluxos de aprovação e cofres compartilhados no `pm-team`. --- ### Início Rápido ```sh go build -o pm . pm setup # initialize vault and choose security profile pm unlock # start a session pm add # add a secret (interactive) pm get github # fuzzy search and retrieve pm lock # end session ``` **Edição de equipe:** ```sh cd team go build -o pm-team . ``` ### Tipos de Segredos O APM suporta **25 tipos de segredos estruturados** com campos validados e lógica de exibição específica por tipo: | # | Tipo | # | Tipo | |---|------|---|------| | 1 | Senha | 14 | Registro Docker | | 2 | TOTP | 15 | Segredo de CI/CD | | 3 | Documento de Identidade Governamental | 16 | Nota Segura | | 4 | Registro Médico | 17 | Códigos de Recuperação | | 5 | Informações de Viagem | 18 | Certificado | | 6 | Contato | 19 | Bancário | | 7 | Wi-Fi | 20 | Documento | | 8 | Chave de API | 21 | Licença de Software | | 9 | Token | 22 | Contrato Legal | | 10 | Chave SSH | 23 | Foto | | 11 | Configuração SSH | 24 | Áudio | | 12 | Credenciais de Nuvem | 25 | Vídeo | | 13 | Kubernetes | | | --- ### Recursos **Segurança** - Derivação de chave Argon2id de conhecimento zero — a senha mestra nunca é armazenada - Cifras AEAD duplas: AES-256-GCM e XChaCha20-Poly1305 - Verificação de integridade em dupla camada HMAC-SHA256 - Quatro perfis de segurança ajustáveis: `standard`, `hardened`, `paranoid`, `legacy` - Watchtower (`pm watchtower`): uma pontuação de segurança de 0 a 100 com senhas fracas, reutilizadas, antigas, vazadas (opt-in, k-anônimo) e expostas, itens expirando, autenticação de dois fatores e passkeys ausentes, chaves de risco e verificações de configuração, além de pontuações de confiança por item e uma revisão de atividades - Senhas incorretas adicionam uma espera crescente (nunca um bloqueio permanente), compartilhada entre a CLI, o aplicativo e a extensão - Registro de auditoria à prova de adulteração armazenado fora do cofre **Cofre** - Arquivo de cofre criptografado único — portátil entre qualquer dispositivo - Espaços para compartimentação lógica (como pastas) - Busca difusa com navegador interativo e navegação por teclado - Inspetor de metadados: data de criação, último acesso, contagem de acessos, pontuação de confiança **TOTP** - Temporizadores de contagem regressiva ao vivo em uma lista interativa - Ordenação personalizada persistente - Cópia direta: `pm totp github` - Integração com daemon de preenchimento automático para injeção automática de códigos 2FA **Sincronização em Nuvem** - Google Drive (OAuth2 PKCE), GitHub (PAT), Dropbox (OAuth2 PKCE) - Criptografia de ponta a ponta — os provedores nunca veem o texto simples - `.apmignore` para filtrar entradas por provedor - Resolução de conflitos: sobrescrever, manter local ou cancelar - Sincronização automática em segundo plano **Sessões** - Desbloqueio/bloqueio explícito com expiração configurável e tempo limite de inatividade - Sessões efêmeras delegadas para automação e acesso de agentes de IA **Servidor MCP** - Servidor nativo do Model Context Protocol - Tokens de permissão com escopo: `read`, `secrets`, `write`, `admin` - Operações de escrita aguardam sua aprovação no aplicativo desktop; assistentes não podem aprovar suas próprias alterações - Funciona com Claude Desktop, Cursor, Windsurf e qualquer cliente MCP **Recuperação** | Fator | Comando | |--------|---------| | OTP por E-mail | `pm auth email` | | Chave de Recuperação | `pm auth recover` | | Compartilhamentos de Quórum (Shamir) | `pm auth quorum-setup` | | Passkey WebAuthn | `pm auth passkey register` | | Códigos de Recuperação de Uso Único | `pm auth codes generate` | **Importação / Exportação** | Formato | Importação | Exportação | |--------|--------|--------| | JSON | `pm import json` | `pm export json` | | CSV | `pm import csv` | `pm export csv` | | TXT | `pm import txt` | `pm export txt` | **Mecanismo de Políticas** ```yaml name: corporate-standard password_policy: min_length: 14 require_uppercase: true require_numbers: true require_symbols: true rotation_policy: rotate_every_days: 90 notify_before_days: 14 ``` ```sh pm policy load ./policies/ ``` **Team Edition (`pm-team`)** - RBAC com múltiplos papéis - Departamentos com domínios de encriptação isolados - Fluxos de aprovação para entradas sensíveis - Cofres partilhados para partilha de credenciais entre vários utilizadores --- ### Extensão de browser A extensão de browser do APM preenche inícios de sessão, oferece códigos de utilização única nos sites a que pertencem, guarda novos inícios de sessão e cria e utiliza passkeys. Nunca vê a sua palavra-passe mestra nem a chave privada de uma passkey. Comunica com uma pequena bridge que o APM disponibiliza na sua própria máquina em `127.0.0.1:41417` (defina `APM_BRIDGE_PORT` para usar outra porta). **Três formas de aceder ao cofre** - Com a aplicação de desktop: a bridge é executada enquanto a aplicação estiver aberta. Os pedidos de emparelhamento e os desbloqueios do browser aparecem na aplicação. - Apenas com a CLI, ligada (recomendado): execute `pm extension link` uma vez. Regista o `pm` como anfitrião de mensagens nativas em cada browser Chromium (Chrome, Edge, Brave, Arc, Vivaldi, Chromium) e, a partir daí, o browser inicia o `pm` por si próprio sempre que a aplicação estiver fechada. - Apenas com a CLI, a partir de um terminal: execute `pm extension serve` e deixe-o aberto. Disponibiliza a mesma API que a aplicação de desktop disponibiliza e mostra cada pedido de desbloqueio, bloqueio e emparelhamento à medida que ocorre. ```sh pm extension link # once per computer; confirm the code the extension shows pm extension serve # unlocks with your CLI session, or asks for the master password pm extension serve --locked # starts locked; unlock from the extension pm extension serve --idle 5m # locks after 5 minutes without browser activity (default 15m, 0 turns it off) ``` `pm extension serve` imprime uma linha quando o cofre está desbloqueado ou bloqueado. Pressione Ctrl+C para interrompê-lo; a chave do cofre é removida da memória. Se a porta estiver ocupada, ele encerra e informa que o aplicativo APM pode já estar servindo a extensão. **Emparelhando um navegador** 1. Na extensão, escolha Connect. A extensão mostra um código de 6 caracteres, por exemplo `K7M-2QX`. 2. Verifique se o APM mostra o mesmo código: o aplicativo desktop abre uma caixa de diálogo, e `pm extension link` ou `pm extension serve` pergunta no terminal, por exemplo `Connect Chrome on macOS? Code K7M-2QX [y/N]`. 3. Aprove. A extensão recebe seu token e é emparelhada. Uma solicitação expira após 2 minutos, e apenas uma pode aguardar por vez. `pm extension serve` nega solicitações por conta própria quando não está sendo executado em um terminal. Para emparelhar manualmente, execute `pm extension token --show` e cole o token no campo de emparelhamento manual da extensão. **Comandos** | Comando | O que faz | |---------|--------------| | `pm extension link [--browser chrome,edge] [--no-wait]` | Permite que o navegador inicie o `pm` para a extensão quando o aplicativo desktop estiver fechado | | `pm extension unlink` | Impede que os navegadores iniciem o `pm`. O emparelhamento é mantido | | `pm extension status [--port N]` | Mostra quais navegadores estão vinculados, o que está servindo a extensão no momento, o estado de bloqueio e a contagem de itens do cofre, e a impressão digital do token | | `pm extension serve [--port N] [--locked] [--idle 15m]` | Serve a extensão a partir deste terminal até Ctrl+C | | `pm extension token [--show]` | Imprime o token de emparelhamento, mascarado a menos que `--show` seja fornecido | | `pm extension rotate` | Substitui o token de emparelhamento. Todo navegador emparelhado deve emparelhar novamente. Uma bridge em execução adota o novo token na próxima solicitação | | `pm totp link <entry> <domain>` | Vincula um código de uso único a um site para que a extensão o ofereça nele | | `pm totp unlink <entry> [domain]` | Remove os vínculos de site de um código de uso único | `pm get` mostra as passkeys que um login possui e o código de uso único vinculado a ele, e `pm totp` mostra o site vinculado de cada código. **Como a bridge permanece privada** - Ela escuta apenas em `127.0.0.1` e só responde a solicitações endereçadas a `127.0.0.1` ou `localhost`, o que bloqueia DNS rebinding. - Ela rejeita qualquer solicitação cujo `Origin` seja uma página web. Apenas origens `chrome-extension://`, `moz-extension://` e `safari-web-extension://` recebem cabeçalhos CORS. - Toda chamada, exceto o emparelhamento, exige o token de emparelhamento, armazenado em `bridge_token` no diretório de configuração do APM e comparado em tempo constante. - Chamadas de listagem e detalhe nunca incluem valores secretos. A extensão solicita um campo por vez quando você revela ou preenche, e o APM registra esse acesso. - As passkeys são criadas e assinadas dentro do APM. A extensão envia a origem do site e um hash dos dados do cliente, e o APM verifica se o site pode usar essa relying party antes de assinar. **Vários sites por login** Um login mantém seu endereço principal em `website` e quaisquer outros em `urls`, exibidos como "Other websites" no aplicativo desktop. A extensão oferece o login em uma página que corresponda a qualquer um deles. Por padrão, uma correspondência é o mesmo domínio registrável, então `accounts.google.com` e `mail.google.com` correspondem ambos a `google.com`. - No popup, você pode adicionar o site em que está a um login, adicionar ou remover sites, e salvar um novo login com mais de um site. - Se você preencher um login em um site para o qual ele não está salvo, a extensão pergunta primeiro. Escolha "Fill and remember" para preenchê-lo e adicionar esse site ao login. - `pm totp link <entry> <domain>` faz o mesmo para um código de uso único. **Logos de sites** O aplicativo desktop e a extensão mostram o logo de cada login em vez de sua primeira letra. O APM busca o logo por conta própria, a partir do próprio site, e nunca recorre a um serviço de favicon de terceiros, que ficaria sabendo de todos os sites do seu cofre. - O quê: o host do primeiro site do login (um código de uso único usa o site vinculado a ele), em minúsculas e sem `www.` ou porta. `localhost`, endereços IP, `.local`, `.internal` e nomes sem ponto nunca são buscados. - Como: o APM carrega `https://<host>/` (no máximo 512 KiB), escolhe o melhor ícone que a página declara (`apple-touch-icon`, depois o maior PNG, depois SVG) e recorre a `https://<host>/favicon.ico`. Apenas HTTPS, no máximo 3 redirecionamentos, 6 segundos por site, imagens de até 256 KiB, sem cookies. Endereços que resolvem para faixas de loopback, privadas, link-local ou CGNAT são recusados. As requisições vão diretamente ao site, não por meio de um proxy do sistema. - Quando: apenas enquanto o cofre estiver desbloqueado e o aplicativo desktop ou `pm extension serve` estiver em execução, no máximo 4 sites por vez. Um site com falha é tentado novamente após 3 dias; um logo é atualizado após 30 dias. - Onde: `icons/` no seu diretório de configuração do APM (`~/Library/Application Support/apm/icons` no macOS, `~/.config/apm/icons` no Linux, `%AppData%\apm\icons` no Windows). Cada arquivo é nomeado pelo SHA-256 do seu host, e no máximo 2000 são mantidos. O cache não é criptografado: cada arquivo `.json` ao lado de uma imagem nomeia seu host, então qualquer pessoa que possa ler seu diretório de configuração pode ver quais sites têm logos. - O que o site descobre: seu endereço IP e que o APM solicitou seu ícone (o user agent é `APM/<version> (+icon)`). Nada sobre sua conta. - Como desativar: no aplicativo desktop, Settings, Appearance, desative "Show website icons" (a configuração do cofre `siteIcons`, que `pm extension serve` também respeita), e escolha "Clear icon cache" para excluir o cache. Defina `APM_ICONS_OFFLINE=1` para impedir toda busca a partir de um processo, por exemplo em testes ou CI. Logos em cache ainda são exibidos até que você os limpe. --- ### Perfis de Segurança | Perfil | Memória Argon2 | Iterações | Paralelismo | Caso de Uso | |---------|--------------|------------|-------------|----------| | `standard` | 64 MB | 3 | 2 | A maioria das máquinas | | `hardened` | 256 MB | 5 | 4 | Workstations (≥8 GB RAM) | | `paranoid` | 512 MB | 6 | 4 | Servidores (≥16 GB RAM) | | `legacy` | PBKDF2 | 600,000 | 1 | Compatibilidade retroativa | O APM detecta automaticamente os núcleos da CPU e a RAM para recomendar o perfil ideal durante o `pm setup`. ### Status de Desenvolvimento e histórico (Esta nota é do proprietário) Em 30 de março de 2026, estou atualmente trabalhando na GUI do APM. No início, ele começou como uma aplicação CLI. A issue #38 explica tudo em detalhes. No geral, quero que o APM alcance uma demografia ainda maior. Vou manter a GUI separada em um repositório apm-gui ou criar uma organização e mover ambos os repositórios para lá. Comecei o APM como um projeto verdadeiramente pessoal. Tudo começou em uma noite aleatória, quando eu queria criar meu próprio gerenciador de senhas. Eu estava cansado do zoho password, já que o usava para TOTPs. Era incrivelmente lento para funcionar, e eu usava arquivos de texto simples para meus tokens, o que não é seguro. Até o momento, eu NÃO pretendo abandonar/aposentar o projeto. Ele permanecerá funcional por muito tempo. Tento melhorá-lo todos os dias e o uso todos os dias. Às vezes, o repositório pode ficar inativo, e é quando testo e experimento com a aplicação. --- ### Estrutura de Releases | Nível | Estável? | Cofre Seguro? | Propósito | |------|---------|-------------|---------| | Canary | ❌ | ❌ | Prévia mais antecipada de recursos — pode corromper cofres | | Alpha | ❌ | ✅ | Recursos instáveis, integridade do cofre preservada | | Beta | ✅ | ✅ | Recursos totalmente testados, lançamento cuidadoso | | Stable | ✅ | ✅ | Releases prontos para produção | > Sempre faça backup do seu cofre antes de experimentar releases Canary. P.S. Para algumas releases, alguns níveis podem não ser lançados dependendo de quão rápido e fácil é enviá-los sem criar mais níveis do que o necessário. --- # Uso de IA Desenvolver o APM e manter toda a suíte não é fácil de fazer de uma só vez. Por isso, usamos **25%** de código gerado por IA (principalmente alterações de UI e mudanças não críticas e não criptográficas). No entanto, no APM, temos algumas políticas para o uso de IA; listadas abaixo. - A IA é usada apenas para desenvolver pequenas funcionalidades e funcionalidades que não interferem no vault - As edições feitas por IA devem ser tratadas com cuidado e revisadas minuciosamente - As edições feitas por IA devem ser testadas minuciosamente Essas políticas garantem que usamos a IA de forma responsável e tornam o APM melhor para todos! ### Documentação Documentação completa em **[aaravmaloo.github.io/apm](https://aaravmaloo.github.io/apm)** - [Instalação](https://aaravmaloo.github.io/apm/getting-started/installation/) - [Primeiros Passos](https://aaravmaloo.github.io/apm/getting-started/first-steps/) - [Referência da CLI](https://aaravmaloo.github.io/apm/reference/cli/) - [Arquitetura](https://aaravmaloo.github.io/apm/concepts/architecture/) - [Criptografia](https://aaravmaloo.github.io/apm/concepts/encryption/) - [Edição para Equipes](https://aaravmaloo.github.io/apm/guides/team-edition/) - [Integração com MCP](https://aaravmaloo.github.io/apm/guides/mcp-integration/) - [Contribuindo](https://aaravmaloo.github.io/apm/contributing/) --- ### Contribuindo Contribuições são bem-vindas. Consulte [CONTRIBUTING.md](https://aaravmaloo.github.io/apm/contributing/) para as diretrizes. --- ### Licença [Licença GPL-3.0](https://github.com/aaravmaloo/apm/blob/master/LICENSE) © Aarav Maloo