
Un gestore di password locale per tutti
<div align="center"> # APM **Un gestore di password locale migliore per tutti.** [](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 è un gestore di password CLI veloce e a conoscenza zero scritto in Go e Rust. Memorizza **oltre 25 tipi di segreti strutturati** in un unico vault crittografato — dalle password e codici TOTP alle chiavi SSH, cartelle cliniche, foto e file binari. Da questo repository vengono distribuiti due binari: `pm` per uso personale e `pm-team` per vault organizzativi condivisi. --- ### Perché APM? - **Veloce e facile da imparare** — nessun comando o flag da memorizzare. APM ti chiede tutto ciò di cui ha bisogno. Sono disponibili anche flag CLI per gli utenti esperti che desiderano la massima velocità. - **A conoscenza zero** — la tua password principale non viene mai memorizzata. Tre chiavi separate da 32 byte vengono derivate usando Argon2id. Nessuno tranne te può decrittografare il tuo vault. - **Doppia crittografia** — scegli AES-256-GCM o XChaCha20-Poly1305. Integrità a doppio livello tramite HMAC-SHA256 sopra l'autenticazione AEAD. - **Portatile** — un file vault, un binario. Porta il tuo vault ovunque. - **Cloud opzionale** — sincronizza con Google Drive, GitHub o Dropbox. Completamente facoltativo; nessun account richiesto per usare APM. - **Pronto per l'IA** — server MCP nativo con token con ambito limitato, così Claude, Cursor o qualsiasi agente compatibile con MCP può accedere al tuo vault in modo sicuro. - **Pronto per i team** — RBAC completo, reparti, flussi di approvazione e vault condivisi in `pm-team`. --- ### Avvio rapido ```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 ``` **Edizione Team:** ```sh cd team go build -o pm-team . ``` ### Tipi di segreto APM supporta **25 tipi di segreto strutturati** con campi validati e logica di visualizzazione specifica per tipo: | # | Tipo | # | Tipo | |---|------|---|------| | 1 | Password | 14 | Docker Registry | | 2 | TOTP | 15 | CI/CD Secret | | 3 | Government ID | 16 | Secure Note | | 4 | Medical Record | 17 | Recovery Codes | | 5 | Travel Info | 18 | Certificate | | 6 | Contact | 19 | Banking | | 7 | Wi-Fi | 20 | Document | | 8 | API Key | 21 | Software License | | 9 | Token | 22 | Legal Contract | | 10 | SSH Key | 23 | Photo | | 11 | SSH Config | 24 | Audio | | 12 | Cloud Credentials | 25 | Video | | 13 | Kubernetes | | | --- ### Funzionalità **Sicurezza** - Derivazione della chiave Argon2id a conoscenza zero — la password principale non viene mai memorizzata - Doppio cifrario AEAD: AES-256-GCM e XChaCha20-Poly1305 - Controllo di integrità a doppio livello HMAC-SHA256 - Quattro profili di sicurezza configurabili: `standard`, `hardened`, `paranoid`, `legacy` - Watchtower (`pm watchtower`): un punteggio di sicurezza da 0 a 100 con password deboli, riutilizzate, vecchie, compromesse (opt-in, k-anonimo) ed esposte, elementi in scadenza, autenticazione a due fattori e passkey mancanti, chiavi rischiose e controlli di configurazione, oltre a punteggi di affidabilità per singolo elemento e una revisione delle attività - Le password errate aggiungono un'attesa crescente (mai un blocco permanente), condivisa tra CLI, app ed estensione - Registro di controllo a prova di manomissione memorizzato all'esterno della cassaforte **Cassaforte** - Singolo file di cassaforte cifrato — portabile su qualsiasi dispositivo - Spazi per la compartimentazione logica (come le cartelle) - Ricerca fuzzy con browser interattivo e navigazione da tastiera - Ispettore dei metadati: data di creazione, ultimo accesso, numero di accessi, punteggio di affidabilità **TOTP** - Timer di conto alla rovescia in tempo reale in un elenco interattivo - Ordinamento personalizzato persistente - Copia diretta: `pm totp github` - Integrazione con il demone di compilazione automatica per l'iniezione automatica dei codici 2FA **Sincronizzazione cloud** - Google Drive (OAuth2 PKCE), GitHub (PAT), Dropbox (OAuth2 PKCE) - Cifratura end-to-end — i provider non vedono mai il testo in chiaro - `.apmignore` per filtrare le voci per provider - Risoluzione dei conflitti: sovrascrivere, mantenere locale o annullare - Sincronizzazione automatica in background **Sessioni** - Blocco/sblocco esplicito con scadenza configurabile e timeout di inattività - Sessioni effimere delegate per l'automazione e l'accesso degli agenti AI **Server MCP** - Server nativo Model Context Protocol - Token di autorizzazione con ambito: `read`, `secrets`, `write`, `admin` - Le operazioni di scrittura attendono la tua approvazione nell'app desktop; gli assistenti non possono approvare le proprie modifiche - Funziona con Claude Desktop, Cursor, Windsurf e qualsiasi client MCP **Recupero** | Fattore | Comando | |--------|---------| | Email OTP | `pm auth email` | | Recovery Key | `pm auth recover` | | Quorum Shares (Shamir) | `pm auth quorum-setup` | | WebAuthn Passkey | `pm auth passkey register` | | One-time Recovery Codes | `pm auth codes generate` | **Importazione / Esportazione** | Formato | Importazione | Esportazione | |--------|--------|--------| | JSON | `pm import json` | `pm export json` | | CSV | `pm import csv` | `pm export csv` | | TXT | `pm import txt` | `pm export txt` | **Motore delle policy** ```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 con più ruoli - Reparti con domini di crittografia isolati - Flussi di approvazione per le voci sensibili - Vault condivisi per la condivisione delle credenziali tra più utenti --- ### Estensione per browser L'estensione per browser di APM compila i login, offre codici monouso sui siti a cui appartengono, salva nuovi login e crea e utilizza passkey. Non vede mai la tua master password né la chiave privata di una passkey. Comunica con un piccolo bridge che APM espone sulla tua macchina all'indirizzo `127.0.0.1:41417` (imposta `APM_BRIDGE_PORT` per usare un'altra porta). **Tre modi per raggiungere il vault** - Con l'app desktop: il bridge è in esecuzione finché l'app è aperta. Le richieste di pairing e gli sblocchi dal browser compaiono nell'app. - Solo con la CLI, collegata (consigliato): esegui `pm extension link` una volta. Registra `pm` come host di messaggistica nativa con ciascun browser Chromium (Chrome, Edge, Brave, Arc, Vivaldi, Chromium) e da quel momento il browser avvia `pm` autonomamente ogni volta che l'app è chiusa. - Solo con la CLI, da un terminale: esegui `pm extension serve` e lascialo aperto. Espone la stessa API dell'app desktop e mostra ogni richiesta di sblocco, blocco e pairing nel momento in cui avviene. ```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` stampa una riga quando il vault è sbloccato o bloccato. Premi Ctrl+C per fermarlo; la chiave del vault viene rimossa dalla memoria. Se la porta è occupata, termina e ti avvisa che l'app APM potrebbe già stare servendo l'estensione. **Accoppiamento di un browser** 1. Nell'estensione, scegli Connect. L'estensione mostra un codice di 6 caratteri, ad esempio `K7M-2QX`. 2. Verifica che APM mostri lo stesso codice: l'app desktop apre una finestra di dialogo, e `pm extension link` o `pm extension serve` chiede nel terminale, ad esempio `Connect Chrome on macOS? Code K7M-2QX [y/N]`. 3. Approva. L'estensione riceve il suo token ed è accoppiata. Una richiesta scade dopo 2 minuti, e solo una può essere in attesa alla volta. `pm extension serve` rifiuta le richieste da solo quando non è in esecuzione in un terminale. Per accoppiare manualmente, esegui `pm extension token --show` e incolla il token nel campo di accoppiamento manuale dell'estensione. **Comandi** | Comando | Cosa fa | |---------|--------------| | `pm extension link [--browser chrome,edge] [--no-wait]` | Consente al browser di avviare `pm` per l'estensione quando l'app desktop è chiusa | | `pm extension unlink` | Impedisce ai browser di avviare `pm`. L'accoppiamento viene mantenuto | | `pm extension status [--port N]` | Mostra quali browser sono collegati, cosa sta servendo l'estensione in questo momento, lo stato di blocco del vault e il numero di elementi, e l'impronta del token | | `pm extension serve [--port N] [--locked] [--idle 15m]` | Serve l'estensione da questo terminale fino a Ctrl+C | | `pm extension token [--show]` | Stampa il token di accoppiamento, mascherato a meno che non venga specificato `--show` | | `pm extension rotate` | Sostituisce il token di accoppiamento. Ogni browser accoppiato deve accoppiarsi di nuovo. Un bridge in esecuzione rileva il nuovo token alla sua richiesta successiva | | `pm totp link <entry> <domain>` | Collega un codice monouso a un sito in modo che l'estensione lo offra lì | | `pm totp unlink <entry> [domain]` | Rimuove i collegamenti ai siti di un codice monouso | `pm get` mostra le passkey di un login e il codice monouso ad esso collegato, e `pm totp` mostra il sito collegato di ciascun codice. **Come il bridge rimane privato** - Ascolta solo su `127.0.0.1` e risponde solo alle richieste indirizzate a `127.0.0.1` o `localhost`, il che blocca il DNS rebinding. - Rifiuta qualsiasi richiesta il cui `Origin` sia una pagina web. Solo le origini `chrome-extension://`, `moz-extension://` e `safari-web-extension://` ricevono gli header CORS. - Ogni chiamata tranne l'accoppiamento richiede il token di accoppiamento, memorizzato in `bridge_token` nella directory di configurazione di APM e confrontato in tempo costante. - Le chiamate di elenco e dettaglio non includono mai valori segreti. L'estensione richiede un campo alla volta quando riveli o compili, e APM registra quell'accesso. - Le passkey vengono create e firmate all'interno di APM. L'estensione invia l'origine del sito e un hash dei dati del client, e APM verifica che il sito possa usare quella relying party prima di firmare. **Più siti web per login** Un login mantiene il suo indirizzo principale in `website` e gli altri in `urls`, mostrati come "Other websites" nell'app desktop. L'estensione offre il login su una pagina che corrisponde a uno qualsiasi di essi. Per impostazione predefinita una corrispondenza è lo stesso dominio registrabile, quindi `accounts.google.com` e `mail.google.com` corrispondono entrambi a `google.com`. - Dal popup puoi aggiungere il sito su cui ti trovi a un login, aggiungere o rimuovere siti web, e salvare un nuovo login con più di un sito web. - Se compili un login su un sito per cui non è salvato, l'estensione chiede prima. Scegli "Fill and remember" per compilarlo e aggiungere quel sito al login. - `pm totp link <entry> <domain>` fa lo stesso per un codice monouso. **Loghi dei siti web** L'app desktop e l'estensione mostrano il logo di ciascun login invece della sua iniziale. APM recupera il logo da solo, dal sito stesso, e non si rivolge mai a un servizio favicon di terze parti, che verrebbe a conoscenza di ogni sito nel tuo vault. - Cosa: l'host del primo sito web del login (un codice monouso usa il suo sito collegato), in minuscolo e senza `www.` o una porta. `localhost`, indirizzi IP, `.local`, `.internal` e nomi senza un punto non vengono mai recuperati. - Come: APM carica `https://<host>/` (al massimo 512 KiB), sceglie la migliore icona dichiarata dalla pagina (`apple-touch-icon`, poi il PNG più grande, poi SVG) e ripiega su `https://<host>/favicon.ico`. Solo HTTPS, al massimo 3 reindirizzamenti, 6 secondi per sito, immagini fino a 256 KiB, nessun cookie. Gli indirizzi che risolvono a intervalli loopback, privati, link-local o CGNAT vengono rifiutati. Le richieste vanno direttamente al sito, non attraverso un proxy di sistema. - Quando: solo mentre il vault è sbloccato e l'app desktop o `pm extension serve` è in esecuzione, al massimo 4 siti alla volta. Un sito fallito viene ritentato dopo 3 giorni; un logo viene aggiornato dopo 30 giorni. - Dove: `icons/` nella tua directory di configurazione di APM (`~/Library/Application Support/apm/icons` su macOS, `~/.config/apm/icons` su Linux, `%AppData%\apm\icons` su Windows). Ogni file è nominato con lo SHA-256 del suo host, e ne vengono conservati al massimo 2000. La cache non è cifrata: ogni file `.json` accanto a un'immagine indica il suo host, quindi chiunque possa leggere la tua directory di configurazione può vedere quali siti hanno dei loghi. - Cosa apprende il sito: il tuo indirizzo IP e che APM ha richiesto la sua icona (lo user agent è `APM/<version> (+icon)`). Nulla riguardo al tuo account. - Come disattivarlo: nell'app desktop, Impostazioni, Aspetto, disattiva "Show website icons" (l'impostazione del vault `siteIcons`, che anche `pm extension serve` rispetta), e scegli "Clear icon cache" per eliminare la cache. Imposta `APM_ICONS_OFFLINE=1` per fermare ogni recupero da un processo, ad esempio nei test o in CI. I loghi in cache vengono comunque mostrati finché non li cancelli. --- ### Profili di sicurezza | Profilo | Memoria Argon2 | Iterazioni | Parallelismo | Caso d'uso | |---------|--------------|------------|-------------|----------| | `standard` | 64 MB | 3 | 2 | La maggior parte delle macchine | | `hardened` | 256 MB | 5 | 4 | Workstation (≥8 GB RAM) | | `paranoid` | 512 MB | 6 | 4 | Server (≥16 GB RAM) | | `legacy` | PBKDF2 | 600,000 | 1 | Compatibilità con le versioni precedenti | APM rileva automaticamente i core della CPU e la RAM per consigliare il profilo ottimale durante `pm setup`. ### Stato dello sviluppo e cronologia (Questa nota è del proprietario) Al 30 marzo 2026, sto attualmente lavorando alla GUI di APM. All'inizio è nata come applicazione CLI. La issue #38 spiega tutto in dettaglio. Nel complesso, voglio che APM raggiunga una platea ancora più ampia. Terrò la GUI separata in un repo apm-gui oppure creerò una organization e sposterò lì entrambi i repo. Ho iniziato APM come un progetto davvero personale. È nato in una sera qualunque, quando volevo creare il mio password manager. Ero stufo di zoho password, dato che lo usavo per i TOTP. Era incredibilmente lento a funzionare, e usavo file di testo in chiaro per i miei token, il che non è sicuro. Al momento, NON ho intenzione di abbandonare/ritirare il progetto. Resterà funzionante a lungo. Cerco di migliorarlo ogni giorno e lo uso ogni giorno. A volte il repo può essere inattivo, ed è in quei momenti che testo e sperimento con l'applicazione. --- ### Struttura delle release | Livello | Stabile? | Vault sicuro? | Scopo | |------|---------|-------------|---------| | Canary | ❌ | ❌ | Anteprima più precoce delle funzionalità — può corrompere i vault | | Alpha | ❌ | ✅ | Funzionalità instabili, integrità del vault preservata | | Beta | ✅ | ✅ | Funzionalità completamente testate, rilascio graduale e attento | | Stable | ✅ | ✅ | Release pronte per la produzione | > Esegui sempre il backup del tuo vault prima di provare le release Canary. P.S. Per alcune release, alcuni livelli potrebbero non essere pubblicati a seconda di quanto sia veloce e semplice distribuirli senza creare più livelli del necessario. --- # Utilizzo dell'IA Sviluppare APM e mantenere l'intera suite non è facile da fare tutto in una volta. Pertanto, utilizziamo il **25%** di codice generato dall'IA (principalmente modifiche all'interfaccia utente e modifiche non critiche e non crittografiche). Tuttavia, in APM abbiamo alcune politiche per l'utilizzo dell'IA; elencate di seguito. - L'IA viene utilizzata solo per sviluppare piccole funzionalità e funzionalità che non interferiscono con il vault - Le modifiche apportate dall'IA devono essere trattate con cura e revisionate attentamente - Le modifiche apportate dall'IA devono essere testate accuratamente Queste politiche garantiscono che utilizziamo l'IA in modo responsabile e rendono APM migliore per tutti! ### Documentazione Documentazione completa su **[aaravmaloo.github.io/apm](https://aaravmaloo.github.io/apm)** - [Installazione](https://aaravmaloo.github.io/apm/getting-started/installation/) - [Primi passi](https://aaravmaloo.github.io/apm/getting-started/first-steps/) - [Riferimento CLI](https://aaravmaloo.github.io/apm/reference/cli/) - [Architettura](https://aaravmaloo.github.io/apm/concepts/architecture/) - [Crittografia](https://aaravmaloo.github.io/apm/concepts/encryption/) - [Team Edition](https://aaravmaloo.github.io/apm/guides/team-edition/) - [Integrazione MCP](https://aaravmaloo.github.io/apm/guides/mcp-integration/) - [Contribuire](https://aaravmaloo.github.io/apm/contributing/) --- ### Contribuire I contributi sono benvenuti. Consulta [CONTRIBUTING.md](https://aaravmaloo.github.io/apm/contributing/) per le linee guida. --- ### Licenza [Licenza GPL-3.0](https://github.com/aaravmaloo/apm/blob/master/LICENSE) © Aarav Maloo