
Crittografia trasparente dei file in git
git-crypt abilita la crittografia e decrittografia trasparente dei file in un repository git. I file che scegli di proteggere vengono crittografati quando vengono committati e decrittografati quando vengono estratti. git-crypt ti permette di condividere liberamente un repository contenente una miscela di contenuti pubblici e privati. git-crypt degrada in modo elegante, quindi gli sviluppatori senza la chiave segreta possono comunque clonare e committare in un repository con file crittografati. Questo ti permette di archiviare il tuo materiale segreto (come chiavi o password) nello stesso repository del tuo codice, senza dover bloccare l'intero repository.
git-crypt è stato scritto da Andrew Ayer ([email protected]). Per maggiori informazioni, visita https://www.agwa.name/projects/git-crypt.
Vedi il file INSTALL.md.
Configurare un repository per usare git-crypt:
cd repo
git-crypt init
Specifica i file da crittografare creando un file .gitattributes:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
Come un file .gitignore, può corrispondere a wildcard e dovrebbe essere committato nel repository. Vedi sotto per maggiori informazioni su .gitattributes. Assicurati di non crittografare accidentalmente il file .gitattributes stesso (o altri file git come .gitignore o .gitmodules). Assicurati che le tue regole .gitattributes siano in atto prima di aggiungere file sensibili, altrimenti quei file non verranno crittografati!
Condividi il repository con altri (o con te stesso) usando GPG:
git-crypt add-gpg-user USER_ID
USER_ID può essere un ID chiave, un'impronta completa, un indirizzo email o
qualsiasi altra cosa che identifichi univocamente una chiave pubblica per GPG (vedi "HOW TO
SPECIFY A USER ID" nella pagina man di gpg). Nota: git-crypt add-gpg-user
aggiungerà e committerà un file di chiave crittografato con GPG nella directory .git-crypt
della radice del tuo repository.
In alternativa, puoi esportare una chiave segreta simmetrica, che devi trasmettere in modo sicuro ai collaboratori (GPG non è richiesto e nessun file viene aggiunto al tuo repository):
git-crypt export-key /path/to/key
Dopo aver clonato un repository con file crittografati, sblocca con GPG:
git-crypt unlock
O con una chiave simmetrica:
git-crypt unlock /path/to/key
Questo è tutto ciò che devi fare: dopo che git-crypt è configurato (con
git-crypt init o git-crypt unlock), puoi usare git normalmente: la
crittografia e la decrittografia avvengono in modo trasparente.
L'ultima versione di git-crypt è 0.8.0, rilasciata il 2025-09-23. git-crypt mira a essere privo di bug e affidabile, nel senso che non dovrebbe crashare, malfunzionare o esporre i tuoi dati riservati. Tuttavia, non ha ancora raggiunto la maturità, il che significa che non è così documentato, ricco di funzionalità o facile da usare come dovrebbe essere. Inoltre, potrebbero esserci modifiche retroincompatibili introdotte prima della versione 1.0.
git-crypt è più sicuro di altri sistemi di crittografia trasparente di git. git-crypt crittografa i file usando AES-256 in modalità CTR con un IV sintetico derivato dall'HMAC SHA-1 del file. Questa modalità di funzionamento è dimostrabilmente semanticamente sicura contro attacchi a testo in chiaro scelto deterministico. Ciò significa che, sebbene la crittografia sia deterministica (il che è richiesto affinché git possa distinguere quando un file è cambiato o no), non perde alcuna informazione oltre al fatto che due file siano identici o meno. Altre proposte per la crittografia trasparente di git usano ECB o CBC con un IV fisso. Questi sistemi non sono semanticamente sicuri e perdono informazioni.
git-crypt si basa sui filtri di git, che non sono stati progettati pensando alla crittografia. Pertanto, git-crypt non è lo strumento migliore per crittografare la maggior parte o tutti i file in un repository. Dove git-crypt brilla davvero è quando la maggior parte del tuo repository è pubblica, ma hai alcuni file (forse chiavi private chiamate *.key, o un file con credenziali API) che devi crittografare. Per crittografare un intero repository, considera l'uso di un sistema come git-remote-gcrypt invece. (Nota: non si intende alcuna approvazione della sicurezza di git-remote-gcrypt.)
git-crypt non crittografa i nomi dei file, i messaggi di commit, i target dei symlink, i gitlinks o altri metadati.
git-crypt non nasconde quando un file cambia o non cambia, la lunghezza di un file o il fatto che due file siano identici (vedi la sezione "Sicurezza" sopra).
git-crypt non supporta la revoca dell'accesso a un repository crittografato che era stato precedentemente concesso. Questo vale sia per la modalità multi-utente GPG (non esiste un comando del-gpg-user per complementare add-gpg-user) sia per la modalità a chiave simmetrica (non è supportata la rotazione della chiave). Questo perché è un problema intrinsecamente complesso nel contesto dei dati storici. Ad esempio, anche se una chiave è stata ruotata a un certo punto nella storia, un utente che possiede la chiave precedente può ancora accedere alla cronologia precedente del repository. Questo problema è discusso più in dettaglio in https://github.com/AGWA/git-crypt/issues/47.
I file crittografati con git-crypt non sono comprimibili. Anche il più piccolo cambiamento a un file crittografato richiede che git memorizzi l'intero file cambiato, invece di un semplice delta.
Sebbene git-crypt protegga i singoli contenuti dei file con un HMAC SHA-1, git-crypt non può essere usato in modo sicuro a meno che l'intero repository non sia protetto da manomissioni (un aggressore che può mutare il tuo repository può alterare il tuo file .gitattributes per disabilitare la crittografia). Se necessario, usa funzionalità di git come i tag firmati invece di fare affidamento solo su git-crypt per l'integrità.
I file crittografati con git-crypt non possono essere applicati con git-apply, a meno che
la patch stessa non sia crittografata. Per generare una patch crittografata, usa git diff --no-textconv --binary. In alternativa, puoi applicare una patch in chiaro
al di fuori di git usando il comando patch.
git-crypt non funziona in modo affidabile con alcune GUI di terze parti di git, come Atlassian SourceTree e GitHub per Mac. I file potrebbero rimanere in uno stato non crittografato.
Il file .gitattributes è documentato nella pagina man gitattributes(5).
Il formato del pattern dei file è lo stesso usato da .gitignore,
come documentato nella pagina man gitignore(5), con l'eccezione che
specificare semplicemente una directory (ad es. /dir/) non è
sufficiente per crittografare tutti i file al suo interno.
Nota anche che il pattern dir/* non corrisponde ai file nelle
sottodirectory di dir/. Per crittografare un intero sottoalbero dir/, usa dir/**:
dir/** filter=git-crypt diff=git-crypt
Il file .gitattributes non deve essere crittografato, quindi assicurati che i wildcard non lo corrispondano accidentalmente. Se necessario, puoi escludere .gitattributes dalla crittografia in questo modo:
.gitattributes !filter !diff