La crittografia simmetrica è il metodo più diretto per proteggere i propri file: si utilizza una singola passphrase per cifrare e decifrare i dati. È l’approccio ideale nel self-hosting quando vogliamo proteggere file sensibili sul nostro server, come backup, configurazioni o credenziali. In questa guida utilizzeremo GPG (GNU Privacy Guard), lo strumento standard su Linux per la crittografia, per cifrare file singoli, directory e archivi.
Cos’è la Crittografia Simmetrica
La crittografia simmetrica funziona come un lucchetto con una sola chiave: chi cifra e chi decifra deve conoscere la stessa password. GPG prende il file originale, lo trasforma in un file illeggibile utilizzando un algoritmo di cifratura, e solo chi conosce la passphrase corretta può ripristinarlo.
Per impostazione predefinita, GPG utilizza l’algoritmo AES-256 (Advanced Encryption Standard con chiave a 256 bit), lo stesso standard adottato da governi e organizzazioni militari. La passphrase che inseriamo non viene usata direttamente come chiave di cifratura: GPG la passa attraverso una funzione di derivazione (key derivation function) che la trasforma in una chiave della lunghezza corretta, aggiungendo un valore casuale chiamato “sale” (salt) e iterazioni multiple per rendere più difficili gli attacchi a forza bruta (brute force).
Crittografia simmetrica vs asimmetrica
Questa guida tratta esclusivamente la crittografia simmetrica, pensata per proteggere i propri file personali. Se hai necessità di cifrare file destinati ad altre persone o automatizzare la cifratura senza inserire una password interattiva, consulta la nostra guida sulla crittografia asimmetrica con GPG .Verificare l’Installazione di GPG
GPG è preinstallato sulla maggior parte delle distribuzioni Linux. Possiamo verificare la sua presenza e la versione installata con il seguente comando.
gpg --versionL’output mostrerà la versione di GPG e gli algoritmi supportati. Assicuriamoci di avere la versione 2.x (GnuPG 2), che è quella moderna e attivamente mantenuta.
Se GPG non fosse installato, possiamo aggiungerlo con il gestore pacchetti della nostra distribuzione.
# Debian/Ubuntu
sudo apt install gnupg
# Fedora
sudo dnf install gnupg2
# Arch Linux
sudo pacman -S gnupgCifrare un File Singolo
Cifratura
Per cifrare un singolo file con crittografia simmetrica utilizziamo il flag --symmetric (abbreviabile in -c). GPG ci chiederà di inserire una passphrase e di confermarla.
gpg --symmetric documento.txtIl comando genera un file documento.txt.gpg nella stessa directory. Questo è il formato binario, più compatto e adatto alla maggior parte dei casi d’uso.
Se preferiamo un output in formato testo leggibile (ASCII-armored), utile quando dobbiamo trasmettere il file attraverso canali che gestiscono solo testo come email o messaggi, possiamo aggiungere il flag --armor (abbreviabile in -a).
gpg --symmetric --armor documento.txtIn questo caso il file generato sarà documento.txt.asc e il suo contenuto sarà codificato in Base64, leggibile con qualsiasi editor di testo.
Specificare l’Algoritmo
Possiamo specificare l’algoritmo di cifratura con il flag --cipher-algo. Come anticipato, AES-256 è il default nelle versioni recenti di GPG, ma possiamo indicarlo esplicitamente per chiarezza.
gpg --symmetric --cipher-algo AES256 documento.txtPer visualizzare tutti gli algoritmi supportati dalla nostra installazione utilizziamo il seguente comando.
gpg --versionGli algoritmi di cifratura disponibili sono elencati nella riga che inizia con “Cipher”. Non c’è motivo pratico di cambiare AES-256, a meno di requisiti specifici di compatibilità con sistemi molto datati.
Decifratura
Per decifrare un file utilizziamo il flag --decrypt (abbreviabile in -d). GPG ci chiederà la passphrase utilizzata in fase di cifratura.
gpg --decrypt documento.txt.gpg > documento.txtIl flag --decrypt scrive il contenuto decifrato sullo standard output (il terminale). Per salvarlo in un file utilizziamo la redirezione > come mostrato sopra, oppure il flag --output (abbreviabile in -o) per specificare direttamente il nome del file di destinazione.
gpg --output documento.txt --decrypt documento.txt.gpgAttenzione
Il file originale non viene cancellato automaticamente dopo la cifratura. Se il motivo per cui stiamo cifrando è proteggere dati sensibili, dobbiamo ricordarci di eliminare il file in chiaro in modo sicuro. Consultare la nostra guida sulla cancellazione sicura dei dati per approfondire questo aspetto.Cifrare una Directory
GPG lavora su singoli file e non può cifrare direttamente una directory. Per cifrare un’intera cartella dobbiamo prima “impacchettarla” in un unico file utilizzando tar, e poi cifrare l’archivio risultante. Questo segue la filosofia Unix: ogni strumento fa una cosa sola e bene, e si combinano insieme per ottenere il risultato desiderato.
Metodo in Due Passaggi
Il metodo più semplice e intuitivo prevede due comandi separati: prima creiamo l’archivio, poi lo cifriamo.
# Passo 1: creare l'archivio
tar -cf cartella_backup.tar cartella/
# Passo 2: cifrare l'archivio
gpg --symmetric cartella_backup.tarQuesto produce il file cartella_backup.tar.gpg. Al termine dobbiamo eliminare il file intermedio cartella_backup.tar che contiene i dati in chiaro.
Metodo con Pipe (Consigliato)
Il metodo migliore dal punto di vista della sicurezza utilizza le pipe di Linux per concatenare i due comandi. In questo modo l’archivio tar non viene mai scritto sul disco in chiaro: passa direttamente dalla memoria (RAM) a GPG.
# Cifratura
tar -cf - cartella/ | gpg --symmetric --output cartella_backup.tar.gpg
# Decifratura
gpg --decrypt cartella_backup.tar.gpg | tar -xf -Nel comando di cifratura, tar -cf - scrive l’archivio sullo standard output (indicato dal trattino -) invece che su un file. La pipe | passa questo flusso di dati direttamente a GPG, che lo cifra e scrive il risultato nel file specificato con --output.
Il comando di decifratura funziona al contrario: GPG decifra il contenuto e lo passa tramite pipe a tar -xf -, che legge l’archivio dallo standard input e lo estrae nella directory corrente.
Perché usare le pipe
Utilizzare le pipe non è solo una questione di eleganza. Se il file intermedio in chiaro tocca il disco, anche dopo averlo cancellato i dati potrebbero essere recuperabili, specialmente su filesystem con journaling (ext4, XFS) o su SSD. Con le pipe, i dati in chiaro transitano solo in memoria RAM e non vengono mai scritti sul disco.Cifrare Archivi Compressi
Possiamo combinare compressione e cifratura in un unico passaggio aggiungendo il flag di compressione a tar. Le opzioni più comuni sono -z per gzip e -j per bzip2.
# Cifratura con compressione gzip
tar -czf - cartella/ | gpg --symmetric --output cartella_backup.tar.gz.gpg
# Decifratura con decompressione gzip
gpg --decrypt cartella_backup.tar.gz.gpg | tar -xzf -# Cifratura con compressione bzip2
tar -cjf - cartella/ | gpg --symmetric --output cartella_backup.tar.bz2.gpg
# Decifratura con decompressione bzip2
gpg --decrypt cartella_backup.tar.bz2.gpg | tar -xjf -La compressione avviene prima della cifratura, il che è importante: i dati cifrati sono essenzialmente casuali e non comprimibili. Se cifrassimo prima e comprimessimo dopo, la compressione non avrebbe alcun effetto sulla dimensione del file.
Gestione della Passphrase
La sicurezza della crittografia simmetrica dipende interamente dalla qualità della passphrase scelta. Con AES-256, l’algoritmo è praticamente inviolabile — il punto debole è sempre la passphrase.
Nessun recupero possibile
Se dimentichiamo la passphrase, i dati cifrati sono irrecuperabili. Non esiste un meccanismo di recupero. GPG non ha una “password dimenticata”. È fondamentale conservare la passphrase in un luogo sicuro, come un password manager.Scenario Pratico: Cifrare un Backup
Riepilogo Comandi
| Operazione | Comando |
|---|---|
| Cifrare un file | gpg --symmetric file.txt |
| Cifrare un file (ASCII) | gpg --symmetric --armor file.txt |
| Decifrare un file | gpg --decrypt file.txt.gpg > file.txt |
| Cifrare una directory (pipe) | tar -czf - cartella/ | gpg --symmetric --output backup.tar.gz.gpg |
| Decifrare una directory (pipe) | gpg --decrypt backup.tar.gz.gpg | tar -xzf - |