{"id":2565,"date":"2026-03-23T16:16:20","date_gmt":"2026-03-23T16:16:20","guid":{"rendered":"https:\/\/paoloronco.it\/?p=2565"},"modified":"2026-03-23T16:16:21","modified_gmt":"2026-03-23T16:16:21","slug":"enclave-offline-password-manager","status":"publish","type":"post","link":"https:\/\/paoloronco.it\/en\/enclave-offline-password-manager\/","title":{"rendered":"Enclave \u2014 Offline Password Manager"},"content":{"rendered":"<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Un password manager per Android costruito con privacy e sicurezza come vincoli non negoziabili. Sviluppato da Paolo Ronco in collaborazione con Claude AI (Anthropic).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Link<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th><\/th><\/tr><\/thead><tbody><tr><td><strong>GitHub<\/strong><\/td><td><a href=\"https:\/\/github.com\/paoloronco\/enclave\">https:\/\/github.com\/paoloronco\/enclave<\/a><\/td><\/tr><tr><td><strong>Google Play<\/strong><\/td><td><em>(link disponibile una volta pubblicato e approvato)<\/em><\/td><\/tr><tr><td><strong>Privacy Policy<\/strong><\/td><td><a href=\"https:\/\/sites.google.com\/view\/enclave-pp\">https:\/\/sites.google.com\/view\/enclave-pp<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Perch\u00e9 Esiste Quest&#8217;App<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La maggior parte dei password manager condivide un assunto implicito: i tuoi dati vivono nel cloud, sincronizzati tra dispositivi, accessibili ovunque. Quell&#8217;assunto richiede fiducia \u2014 nell&#8217;azienda, nei loro server, nella loro implementazione crittografica, nella loro risposta in caso di violazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enclave nasce per eliminare quell&#8217;assunto alla radice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;obiettivo era semplice: un password manager dove l&#8217;unica persona in grado di accedere al vault sei tu, dove i dati non lasciano mai il dispositivo, e dove il modello di sicurezza \u00e8 trasparente e verificabile. Nessun account, nessuna sincronizzazione, nessuna telemetria, nessun accesso a internet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il contesto non \u00e8 teorico: la violazione di LastPass nel 2022 ha esposto vault cifrati di milioni di utenti. Quando succede a un servizio cloud, gli utenti pagano il prezzo di una fiducia che non avrebbero dovuto dover riporre.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Come \u00c8 Stato Sviluppato<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enclave \u00e8 stato sviluppato interamente attraverso un workflow AI-assisted, usando <strong>Claude<\/strong> (Anthropic) come partner di sviluppo principale. L&#8217;intero codebase \u2014 decisioni architetturali, implementazione della sicurezza, interfaccia utente e documentazione \u2014 \u00e8 stato progettato e raffinato attraverso conversazioni iterative con Claude.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo approccio ha permesso di:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Iterare rapidamente sull&#8217;architettura<\/strong> \u2014 modelli di sicurezza, flussi di dati e confini tra componenti esplorati e messi alla prova prima di scrivere una riga di codice<\/li>\n\n\n\n<li><strong>Pensiero security-first<\/strong> \u2014 ogni decisione progettuale valutata rispetto a scenari di minaccia in tempo reale<\/li>\n\n\n\n<li><strong>Documentazione completa<\/strong> \u2014 README, privacy policy e commenti sono emersi insieme al codice, non come afterthought<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Il progetto dimostra che uno sviluppatore singolo, lavorando con un collaboratore AI, pu\u00f2 produrre un&#8217;applicazione Android di qualit\u00e0 production con un modello di sicurezza paragonabile a strumenti commerciali affermati.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Panoramica Tecnica<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Stack<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Layer<\/th><th>Tecnologia<\/th><\/tr><\/thead><tbody><tr><td>Linguaggio<\/td><td>Kotlin 2.0.21<\/td><\/tr><tr><td>UI<\/td><td>Jetpack Compose + Material 3<\/td><\/tr><tr><td>Database<\/td><td>Room 2.6.1 (SQLite, cifratura a livello di campo)<\/td><\/tr><tr><td>Navigazione<\/td><td>Navigation Compose 2.8.5<\/td><\/tr><tr><td>Safety<\/td><td>Android Keystore (AES-256-GCM, hardware-backed)<\/td><\/tr><tr><td>Autenticazione<\/td><td>AndroidX Biometric 1.1.0 (BiometricPrompt)<\/td><\/tr><tr><td>Preferenze<\/td><td>EncryptedSharedPreferences (AES-256-SIV \/ AES-256-GCM)<\/td><\/tr><tr><td>Build<\/td><td>Gradle KTS + KSP 2.0.21-1.0.27<\/td><\/tr><tr><td>Min SDK<\/td><td>Android 9 (API 28)<\/td><\/tr><tr><td>Target SDK<\/td><td>Android 15 (API 35)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Architettura<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Architettura MVVM a modulo singolo con separazione netta delle responsabilit\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">android\/app\/src\/main\/java\/com\/paoloronco\/codevault\/<br>\u251c\u2500\u2500 data\/<br>\u2502 &nbsp; \u251c\u2500\u2500 AccountEntity.kt &nbsp; &nbsp; &nbsp; # Entit\u00e0 Room \u2014 enum EntryType, Categorie<br>\u2502 &nbsp; \u251c\u2500\u2500 AccountDao.kt &nbsp; &nbsp; &nbsp; &nbsp;  # DAO con query Flow-based<br>\u2502 &nbsp; \u2514\u2500\u2500 AppDatabase.kt &nbsp; &nbsp; &nbsp; &nbsp; # Database Room (v3, migrazioni manuali)<br>\u251c\u2500\u2500 security\/<br>\u2502 &nbsp; \u2514\u2500\u2500 SecurityManager.kt &nbsp; &nbsp; # Hashing passcode, cifratura campi,<br>\u2502 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # gestione chiavi Keystore, flag biometrico<br>\u251c\u2500\u2500 backup\/<br>\u2502 &nbsp; \u2514\u2500\u2500 BackupManager.kt &nbsp; &nbsp; &nbsp; # Export \/ import AES-256-GCM via SAF<br>\u2514\u2500\u2500 ui\/<br> &nbsp;  \u251c\u2500\u2500 MainViewModel.kt &nbsp; &nbsp; &nbsp;  # ViewModel unico: stato auth, CRUD,<br> &nbsp;  \u2502 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # gestione clipboard, operazioni backup<br> &nbsp;  \u251c\u2500\u2500 Navigation.kt &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Route come Sealed class<br> &nbsp;  \u2514\u2500\u2500 screens\/<br> &nbsp; &nbsp; &nbsp;  \u251c\u2500\u2500 SetupScreen.kt &nbsp; &nbsp;  # Setup passcode al primo avvio<br> &nbsp; &nbsp; &nbsp;  \u251c\u2500\u2500 LockScreen.kt &nbsp; &nbsp; &nbsp; # Sblocco PIN \/ password + biometrico<br> &nbsp; &nbsp; &nbsp;  \u251c\u2500\u2500 PinEntry.kt &nbsp; &nbsp; &nbsp; &nbsp; # Composable riutilizzabili PinDots + PinNumPad<br> &nbsp; &nbsp; &nbsp;  \u251c\u2500\u2500 HomeScreen.kt &nbsp; &nbsp; &nbsp; # Lista, ricerca, swipe-to-delete<br> &nbsp; &nbsp; &nbsp;  \u251c\u2500\u2500 AddEditScreen.kt &nbsp;  # Form inserimento\/modifica + generatore password<br> &nbsp; &nbsp; &nbsp;  \u251c\u2500\u2500 AccountDetailScreen.kt  # Vista dettaglio, campi mascherati, copia<br> &nbsp; &nbsp; &nbsp;  \u2514\u2500\u2500 SettingsScreen.kt &nbsp; # Auto-lock, biometrico, lingua, backup<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Modello di Sicurezza<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La sicurezza \u00e8 il prodotto principale, non una funzionalit\u00e0 aggiuntiva. Ogni decisione progettuale \u00e8 stata presa con un threat model esplicito.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Asset<\/th><th>Meccanismo di protezione<\/th><\/tr><\/thead><tbody><tr><td>Passcode master<\/td><td>PBKDF2WithHmacSHA256, 65 536 iterazioni, chiave derivata a 256 bit, salt random da 16 byte \u2014 mai memorizzato in chiaro<\/td><\/tr><tr><td>Chiave di cifratura DB<\/td><td>Chiave AES-256-GCM nell&#8217;Android Keystore (<code>codevault_field_key<\/code>), hardware-backed sui dispositivi supportati<\/td><\/tr><tr><td>Campi sensibili nel DB<\/td><td>Cifrati singolarmente a livello di campo prima della scrittura \u2014 username, password, note<\/td><\/tr><tr><td>Preferenze app<\/td><td>EncryptedSharedPreferences (AES-256-GCM \/ AES-256-SIV)<\/td><\/tr><tr><td>File di backup<\/td><td>AES-256-GCM + derivazione chiave PBKDF2 dalla password di backup scelta dall&#8217;utente, salt random da 16 byte + IV da 12 byte<\/td><\/tr><tr><td>Appunti<\/td><td>Flag <code>IS_SENSITIVE<\/code> + cancellazione automatica dopo 30 secondi<\/td><\/tr><tr><td>Screenshot<\/td><td><code>FLAG_SECURE<\/code> \u2014 blocca screenshot e nasconde il contenuto nel task switcher<\/td><\/tr><tr><td>Backup cloud<\/td><td>Esplicitamente disabilitato (<code>allowBackup=\"false\"<\/code>, <code>backup_rules.xml<\/code> personalizzato)<\/td><\/tr><tr><td>Brute-force<\/td><td>5 tentativi falliti attivano un lockout di 30 secondi con countdown visivo<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il database \u00e8 memorizzato in <code>\/data\/data\/com.paoloronco.codevault\/databases\/codevault_secure.db<\/code> \u2014 sandbox Android, inaccessibile ad altre app o a terze parti senza accesso root.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Funzionalit\u00e0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Tipi di Voce nel Vault<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Campi<\/th><\/tr><\/thead><tbody><tr><td><strong>Account<\/strong><\/td><td>Titolo, Username \/ Email, Password, Note, Categoria<\/td><\/tr><tr><td><strong>PIN \/ Carta<\/strong><\/td><td>Titolo, PIN (mascherato), Intestatario \/ Info extra, Note, Categoria<\/td><\/tr><tr><td><strong>Nota Sicura<\/strong><\/td><td>Titolo, Testo nota<\/td><\/tr><tr><td><strong>Wi-Fi<\/strong><\/td><td>Titolo, SSID, Password, Note, Categoria<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Generatore di Password<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Generatore integrato basato su <code>SecureRandom<\/code> (nessuna fonte pseudo-casuale):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lunghezza configurabile (8\u201332 caratteri)<\/li>\n\n\n\n<li>Toggle indipendenti per maiuscole, cifre e simboli<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Organizzazione<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Categorie<\/strong> \u2014 Generale, Social, Banca, Email, Lavoro, Shopping<\/li>\n\n\n\n<li><strong>Preferiti<\/strong> \u2014 aggiungi alle stelle qualsiasi voce; i preferiti appaiono sempre in cima<\/li>\n\n\n\n<li><strong>Ricerca in tempo reale<\/strong> per titolo<\/li>\n\n\n\n<li><strong>Swipe per eliminare<\/strong> con dialogo di conferma<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Backup e Ripristino<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Esporta l&#8217;intero vault in un file <code>.cvbak<\/code> cifrato tramite Android Storage Access Framework. Il file di backup \u00e8 cifrato in modo indipendente con una password scelta dall&#8217;utente \u2014 leggibile solo con il passcode corretto, anche se il file venisse acquisito da terze parti.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Autenticazione<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PIN numerico o passcode alfanumerico<\/li>\n\n\n\n<li>Sblocco biometrico tramite <code>BiometricPrompt<\/code> (BIOMETRIC_STRONG \u2014 impronta \/ viso)<\/li>\n\n\n\n<li>Timeout auto-lock configurabile (30s \/ 1m \/ 2m \/ 5m \/ 10m \/ mai)<\/li>\n\n\n\n<li>Blocco immediato quando l&#8217;app va in background<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Supporto Linguistico<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Selettore lingua integrato nell&#8217;app, senza necessit\u00e0 di riavvio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Italiano, Inglese, Tedesco, Spagnolo<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa Lo Distingue<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La maggior parte dei password manager open source sono port di strumenti web-first o wrapper sottili attorno a database cifrati. Enclave \u00e8 stato progettato da zero per Android, usando le primitive di sicurezza native della piattaforma (Android Keystore, BiometricPrompt, EncryptedSharedPreferences) invece di implementare crittografia custom.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Differenziatori chiave:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cifratura a livello di campo<\/strong> \u2014 non solo a livello di database. Ogni campo sensibile \u00e8 cifrato individualmente, quindi anche l&#8217;accesso diretto al database non espone nulla di utile.<\/li>\n\n\n\n<li><strong>Chiavi hardware-backed<\/strong> \u2014 sui dispositivi supportati, la chiave AES-256-GCM non lascia mai il secure element hardware.<\/li>\n\n\n\n<li><strong>Zero dipendenze da servizi esterni<\/strong> \u2014 niente Firebase, niente analytics, niente crash reporting. L&#8217;app non dichiara il permesso <code>INTERNET<\/code>.<\/li>\n\n\n\n<li><strong>Completamente open source<\/strong> sotto AGPL v3 \u2014 il modello di sicurezza \u00e8 pubblicamente verificabile.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Open Source e Licenza<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enclave \u00e8 rilasciato sotto <strong>GNU Affero General Public License v3.0<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questa licenza \u00e8 stata scelta deliberatamente: qualsiasi fork o opera derivata \u2014 inclusa una offerta come servizio \u2014 deve essere rilasciata sotto gli stessi termini. Questo impedisce fork proprietari con modifiche non divulgate (come backdoor), garantendo che qualsiasi versione di questo codice che raggiunga gli utenti rimanga verificabile.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Sviluppatore<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Paolo Ronco<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Email: info@paoloronco.it<\/li>\n\n\n\n<li>GitHub: <a href=\"https:\/\/github.com\/paoloronco\">https:\/\/github.com\/paoloronco<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Sviluppato con Claude \u2014 Anthropic (2026)<\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>Un password manager per Android costruito con privacy e sicurezza come vincoli non negoziabili. Sviluppato da Paolo Ronco in collaborazione con Claude AI (Anthropic). Link GitHub https:\/\/github.com\/paoloronco\/enclave Google Play (link disponibile una volta pubblicato e approvato) Privacy Policy https:\/\/sites.google.com\/view\/enclave-pp Perch\u00e9 Esiste Quest&#8217;App La maggior parte dei password manager condivide un assunto implicito: i tuoi dati &hellip; <a href=\"https:\/\/paoloronco.it\/en\/enclave-offline-password-manager\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Enclave \u2014 Offline Password Manager&#8221;<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2565","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/comments?post=2565"}],"version-history":[{"count":1,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2565\/revisions"}],"predecessor-version":[{"id":2566,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2565\/revisions\/2566"}],"wp:attachment":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/media?parent=2565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/categories?post=2565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/tags?post=2565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}