giancarlomangiagli.it

CryptPass gestore di password

Sommario

Cos'è CryptPass

CryptPass è un sistema per crittografare, archiviare e gestire credenziali di accesso, principalmente password, all'interno di un file di testo.

Tale sistema è composto da due parti principali: una libreria (il nucleo centrale di CryptPass) e una "app" (un'interfaccia grafica per la libreria). Sono consapevole che esistono molti altri sistemi simili, per di più da molto tempo, e che sono anche molto stabili e ampiamente utilizzati. Ciononostante, ho voluto crearne uno mio, progettato con alcune particolarità e lievi differenze rispetto ai prodotti analoghi, al fine di rispecchiare la mia filosofia, che può essere riassunta dai seguenti requisiti:

REQUISITIDETTAGLI
Semplice L'architettura e le funzionalità devono essere semplici: questo permette di espandere, correggere bug e gestire l'intero codice in modo rapido ed agevole.
Robusto* Le funzioni crittografiche utilizzate e la loro combinazione devono essere abbastanza robusti
Dedicato Deve svolgere bene solo il suo compito peculiare: organizzare e crittografare segreti in un file. Qualsiasi funzionalità aggiuntiva deve essere implementata esternamente.
Protetto a due vie Le chiavi crittografiche sono derivate sia da una password creata dall'utente che da un "token" pseudo-casuale generato dal sistema
Locale Il sistema deve memorizzare i dati localmente (cioè offline)
Flessibile Gli utenti non dovrebbero avere vincoli aggiuntivi rispetto a quelli richiesti dal sistema per motivi di sicurezza.
Aperto Il codice sorgente deve essere aperto (open source)
Gratuito Il sistema deve avere licenza d'uso gratuita (free software)
Riusabile Il sistema deve essere principalmente una libreria riutilizzabile, pronta per qualsiasi contesto
Multi piattaforma* Il sistema deve essere multi piattaforma

* Per il momento questi aspetti non sono del tutto soddisfatti. Robustezza, perché il sistema non è ancora maturo e non è stato sufficientemente analizzato o testato dalla comunità di utilizzatori; multi piattaforma, perché solo la libreria, compatibile con node.js oppure javascript, è davvero multi piattaforma mentre l'“app”, per il momento, supporta solo i sistemi operativi Android, Linux e Windows.

↑ Torna al sommario

Funzionalità dell'app

Al momento CryptPass ha le seguenti funzionalità:

FUNZIONALITÀDETTAGLI
Supporto multi-sistema operativo CryptPass funziona su Android, Linux e Windows (vedi la sezione download)
Protezione a due vie CryptPass protegge i tuoi segreti in due modi contemporaneamente:
  • Con la password principale (devi scegliere una password complessa e non dimenticarla mai perché, invece, non potrai recuperare il tuo portafoglio di credenziali)
  • Con una sequenza di 26 numeri, da 0 a 25, generati casualmente dall'app (devi trascriverlo su un foglio di carta o altro supporto simile e non perderlo mai perché, altrimenti, non potrai recuperare il tuo portafoglio di credenziali). Questa sequenza è memorizzata localmente e non è necessario digitarla ogni volta che si apre l'app bensì è necessaria solo nel caso si debba recuperare il file di archiviazione delle password. Questa sequenza può anche essere visualizzata in qualsiasi momento all'interno dell'app.
Descrizione Puoi impostare una descrizione per il portafoglio di credenziali (che però non viene crittografata)
Memorizzazione di credenziali Puoi memorizzare le tue credenziali in una raccolta di singole "voci", ognuna delle quali ha:
  • Un campo obbligatorio (“name”), che deve essere univoco (ovvero ogni voce deve avere un nome diverso)
  • Cinque campi predefiniti opzionali (“description”, “tags”, “username”, “password”, “PIN”)
  • Un numero illimitato di campi personalizzati opzionali (un elenco di coppie “label / content”, dove label, ossia l'etichetta, deve avere un nome unico per ciascuna voce)
Motore di ricerca delle credenziali Per impostazione predefinita, le voci sono elencate in ordine alfabetico. Quando si memorizza un'enorme quantità di voci, è possibile recuperarle anche più comodamente attraverso uno dei seguenti metodi:
  • Tramite campo name (puoi cercare, senza distinzione tra maiuscole e minuscole, il nome completo di una voce o un contenuto parziale della stessa)
  • Tramite campo tags (è possibile selezionare uno o più tag per filtrare l'elenco delle voci)
Gestione Puoi inoltre: visualizzare la sequenza segreta, modificare la password principale e ripristinare o resettare il portafoglio di credenziali

↑ Torna al sommario

Come funziona, in breve

L'app CryptPass memorizza in modo sicuro le tue credenziali segrete all'interno di un file, in una posizione del filesystem a tua scelta. Le tue credenziali sono crittografate tramite una password che hai scelto (password principale) prima di salvarle nel file. Per leggere le tue credenziali devi solo digitare la tua password principale.

Se vuoi evitare di perdere i tuoi segreti (ad esempio nel caso in cui il tuo dispositivo smetta di funzionare o venga ripristinato) puoi utilizzare, esternamente all'app, il tuo servizio di archiviazione dati cloud preferito (come Dropbox e molti altri) per mantenere una replica sempre aggiornata del tuo file CryptPass. Ricorda però che, solo in caso di ripristino di quel file, oltre alla tua password principale, dovrai digitare anche il numero di sequenza segreto, fornito da CryptPass in fase di avvio e visualizzabile in qualsiasi momento dall'apposita voce di menu dell'app (altre opzioni → visualizza sequenza).

↑ Torna al sommario

Architettura di CryptPass

Come detto sopra, CryptPass è principalmente una libreria, scritta in Typescript e che usa a sua volta le librerie di NodeJS. CryptPass App è un'applicazione i cui obiettivi sono: fornire un'interfaccia grafica alla libreria CryptPass, implementare le funzioni di lettura/scrittura per la memorizzazione di segreti crittografati ed essere multipiattaforma. Maggiori dettagli tecnici e architetturali a seguire.

La libreria

Il cuore di CryptPass è la libreria. Questa libreria è nativa NodeJS (con il massimo delle prestazioni) ma, per essere utilizzata anche in javascript puro, anche se con decremento delle prestazioni, sono state aggiunte alcune librerie di bundling specifiche ("browser-resolve", "buffer", "crypto-browserify", "randombytes-pure", "scrypt-js", "stream-browserify").

La libreria astrae completamente il livello di archiviazione in memoria permanente delle due principali strutture di dati, che sono: KeyPass (contenente i segreti crittografati) e Sequence (contenente il numero di sequenza del segreto). Infatti, per istanziare la libreria, è necessario passare in input i seguenti 4 parametri: 1) il KeyPass (ovvero la struttura dei dati delle informazioni crittografate); 2) la Sequence (ovvero il numero di sequenza del segreto); 3) KeyPassWriter e 4) SequenceWriter, entrambe funzioni che prendono come argomento di input il contenuto delle rispettive strutture di dati e forniscono un meccanismo di archiviazione (ad esempio potrebbero scrivere dati come file su filesystem).

Possiamo distinguere due componenti principali della libreria: API crittografiche e API di gestione delle voci. Poiché quest'ultima è solo un insieme di metodi simile a un database e si limita ad aggiungere/modificare/eliminare voci in una struttura dati JSON (descritta implicitamente nella sezione precedente "funzionalità dell'app" all'interno dell'elemento "archiviazione dei segreti"), ci concentreremo solo sulle API crittografiche.

Lo schema crittografico è il seguente:

Schema crittografico di CryptPass
Schema crittografico di CryptPass

Nel diagramma sopra, in arancione abbiamo gli elementi conosciuti solo dall'utente: la password principale e la sequenza numerica (sequenza d'ordine). In blu abbiamo gli elementi memorizzati insieme all'interno della stessa struttura dati (denominata KeyPass all'interno del codice sorgente). Infine in verde abbiamo gli elementi derivati dall'operazione crittografica tra questi elementi e in grigio abbiamo le voci in chiaro (memorizzate nella RAM) che potrebbero essere crittografate. Sia quando si tratta di criptare che di decriptare, vengono sempre eseguiti i primi due livelli del diagramma perché necessari per calcolare la coppia denominata “MasterKey2 + InitVector2” con cui la libreria cripta e decripta le voci del portafoglio (nello specifico con l'algoritmo aes-256).

Buona parte di questa sequenza crittografica è abbastanza comune nei software di questo genere: una coppia "chiave / vettore iniziale" viene derivata da una password con una funzione hash molto robusta (scrypt in questo caso) e viene utilizzata per criptare/decriptare del testo in chiaro/del crittotesto. D'altra parte, vale la pena spiegare l'unica parte non comune: la sequenza di orinamento. Cominciamo con l'obiettivo. Se un criminale ha ottenuto la tua struttura dati KeyPass e, con tecniche di ingegneria sociale, scopre la password principale, può facilmente decifrare tutte le credenziali. Ma può non trattarsi necessariamente di un criminale. Supponiamo che la struttura dei dati di KeyPass sia archiviata in un servizio di archiviazione cloud e che l'utente utilizzi la stessa password principale sia per il servizio cloud che per KeyPass; in questo caso, il servizio di cloud storage potrebbe potenzialmente utilizzare quella password per decrittare l'intero dato KeyPass. Quindi il "numero di sequenza" è utile per mitigare questa vulnerabilità. Prima CryptPass genera una sequenza pseudo-casuale di numeri (da 0 a 25), quindi suddivide la master key in 26 segmenti ordinati secondo la sequenza e questa master key così mescolata viene memorizzata all'interno della struttura dati di KeyPass. Solo l'utente conosce l'esatto ordine (cioè il numero di sequenza) che ricostruisce correttamente la master key e, grazie a questo, è ancora più protetto (trovare con algoritmi di forza bruta una sequenza di 26 numeri è combinatoriamente difficile).

Per applicare facilmente il meccanismo del "numero di sequenza" e programmare con facilità l'operazione di modifica della password principale, è stata introdotta una master key secondaria. Quindi prima la master key principale è derivata con scrypt dalla concatenazione della password principale dell'utente e del salt principale. Quindi i blocchi della master key secondaria crittografata vengono riordinati. Fatto ciò, la master key secondaria viene decifrata dalla master key principale e viene utilizzata a sua volta per criptare/decriptare le voci del portafoglio.

L'app

L'app CryptPass è scritta in Typescript con Apache Cordova e ottimizzata per Android (tramite la piattaforma Cordova Android), Linux e Windows (questi ultimi due tramite piattaforma Cordova Electron). L'interfaccia utente e le funzionalità dell'app sono esattamente le stesse su tutti i sistemi operativi supportati, ad eccezione della gestione dello storage, come illustrato di seguito:

Differenze tra piattaforme sulla gestione dello storage
FUNZIONE DI STORAGE ANDROID LINUX / WINDOWS
Inizializzazione del file KeyPass Il file KeyPass viene creato dall'app dopo aver selezionato la posizione desiderata Il file KeyPass deve già esistere (come file di testo vuoto) e dopo deve essere selezionato dall'app
Memorizzazione del numero di sequenza Il numero di sequenza è crittografato con il sistema Android Keystore Il numero di sequenza non è crittografato (ma non è comunque facilmente trafugabile)

L'app utilizza la libreria CryptPass in versione bundle (ovvero compatibile con browser) e la arricchisce con la grafica e tutte le funzionalità di gestione e configurazione necessarie per essere efficacemente interattiva con l'utente. La grafica (in realtà un sito Web incorporato) è piuttosto essenziale e utilizza le funzionalità di base di Bootstrap. Le parti di back-end del codice hanno anche un livello specifico per astrarre la diversa gestione dello storage tra le varie piattaforme supportate.

La versione Android utilizza anche una due plugin per leggere e scrivere file sul filesystem del dispositivo che ho personalizzato. I plugin originali, infatti, non permettevano tutte le operazioni necessarie, soprattutto per concedere autorizzazioni permanenti alla lettura e scrittura dei file, anche dopo il riavvio del dispositivo. Il codice sorgente di entrambe le personalizzazioni si trova nei link seguenti:

Ecco uno screenshot della vista iniziale:

Vista iniziale di CryptPass
Vista iniziale di CriptPass

↑ Torna al sommario

Bug e debiti tecnici dell'app

Per il momento l'app CryptPass è sufficientemente usabile ma con diversi compromessi (o talvolta addirittura bug) che chiunque può aiutarmi a risolvere (e grazie in anticipo!). Gli unici a me noti sono riassunti a seguire, e nessuno di questi riguarda vulnerabilità o debolezze di sicurezza:

Elenco dei bug e dei debiti tecnici dell'app
Titolo Categoria Piattaforma Descrizione
Multi-piattaforma parziale Debito tecnico TUTTE Dato che ho solo PC con Linux e solo uno smartphone con Android, posso programmare l'app per un numero limitato di OS. Cordova permette di estendere il supporto ad iOS e MacOS e anche di avere un programma di installazione nativo per Windows (al momento è prevista solo una versione portable zippata).
Creazione di file su Electron Debito tecnico Linux and Windows Non ho implementato il metodo nativo Electron showOpenDialog() quindi, per il primo utilizzo, il file delle password deve essere creato manualmente dall'utente come file di testo vuoto
Antivirus su Windows BUG Windows Ho provato CryptPass solo una volta su un PC desktop Windows e sembra che l'antivirus Avast lo considerasse dannoso a causa delle capacità di leggere e scrivere file (anche se è solo il file delle password). Non ho ancora studiato alcuna soluzione ma ho aggirato l'ostacolo aggiungendo un'eccezione per la cartella di installazione di CryptPass (https://support.avast.com/en-ww/article/Antivirus-scan-exclusions).
Permessi su Android BUG Android Se un servizio di archiviazione in cloud aggiorna il file KeyPass, CryptPass perde le autorizzazioni di lettura (e scrittura?) su quel file. Per indagare sulle cause, guarda i plugin personalizzati che ho usato:
Gestione multi portafoglio Debito tecnico TUTTE Per il momento l'app può gestire solo un portafoglio per volta (rappresentato dalla coppia “file KeyPass” e “sequence number”)
Lingue supportate Debito tecnico TUTTE Per il momento è supportato solo il mio (mediocre) inglese. Ogni eventuale correzione di errori o refusi è ben accetta e sentitevi liberi di suggerire eventuali formulazioni linguistiche migliori. Inoltre l'app non è stata configurata nativamente per il supporto multilingue, ma con alcune modifiche può esserlo.

↑ Torna al sommario

Contribisci

Questo è un software gratuito e qualsiasi contributo è il benvenuto!

Puoi collaborare con me sul codice sorgente (guarda il prossimo capitolo per i collegamenti) e puoi anche segnalarmi qualsiasi problema sempre tramite github o mandandomi un'e-mail (guarda in fondo a questa pagina per trovare il mio indirizzo).

Link per segnalare i problemi

Per CryptPass library https://github.com/ossacolsale/CryptPass/issues

Per CryprPass app https://github.com/ossacolsale/CryptPassApp/issues

↑ Torna al sommario

Download e codici sorgente

Installa su Android

L'app CryptPass è su Google Play Store: https://play.google.com/store/apps/details?id=com.cryptpass.app

Get it on Google Play

Installa su Linux

Qui le versioni compilate per Linux:

Ubuntu / Ubuntu-derived / Debian (.deb package)

Portable ZIP per Linux

Installa su Windows

Portable ZIP per Windows

Codici sorgente

Per ciascuna piattaforma supportata, puoi anche compilare manualmente la libreria CryptPass e l'app CryptPass scaricando il codice sorgente da Github:

Codice sorgente di CryptPass library

Codice sorgente di CryptPass app

_

↑ Torna al sommario