
Criptografia transparente de arquivos no git
git-crypt permite a criptografia e descriptografia transparente de arquivos em um repositório git. Arquivos que você escolhe proteger são criptografados ao serem commitados, e descriptografados ao serem verificados. git-crypt permite que você compartilhe livremente um repositório contendo uma mistura de conteúdo público e privado. git-crypt degrada-se suavemente, então desenvolvedores sem a chave secreta ainda podem clonar e commitar em um repositório com arquivos criptografados. Isso permite que você armazene seu material secreto (como chaves ou senhas) no mesmo repositório que seu código, sem exigir que você bloqueie todo o seu repositório.
git-crypt foi escrito por Andrew Ayer ([email protected]). Para mais informações, veja https://www.agwa.name/projects/git-crypt.
Veja o arquivo INSTALL.md.
Configure um repositório para usar o git-crypt:
cd repo
git-crypt init
Especifique arquivos para criptografar criando um arquivo .gitattributes:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
Como um arquivo .gitignore, ele pode corresponder a curingas e deve ser commitado no repositório. Veja abaixo para mais informações sobre .gitattributes. Certifique-se de não criptografar acidentalmente o próprio arquivo .gitattributes (ou outros arquivos git como .gitignore ou .gitmodules). Certifique-se de que suas regras .gitattributes estejam em vigor antes de adicionar arquivos sensíveis, ou esses arquivos não serão criptografados!
Compartilhe o repositório com outros (ou consigo mesmo) usando GPG:
git-crypt add-gpg-user USER_ID
USER_ID pode ser um ID de chave, uma impressão digital completa, um endereço de e-mail, ou
qualquer outra coisa que identifique exclusivamente uma chave pública para o GPG (veja "HOW TO
SPECIFY A USER ID" na página man do gpg). Nota: git-crypt add-gpg-user
adicionará e commitará um arquivo de chave criptografado com GPG no diretório .git-crypt
na raiz do seu repositório.
Alternativamente, você pode exportar uma chave secreta simétrica, que você deve transmitir de forma segura aos colaboradores (GPG não é necessário, e nenhum arquivo é adicionado ao seu repositório):
git-crypt export-key /path/to/key
Após clonar um repositório com arquivos criptografados, desbloqueie com GPG:
git-crypt unlock
Ou com uma chave simétrica:
git-crypt unlock /path/to/key
Isso é tudo que você precisa fazer - após configurar o git-crypt (com
git-crypt init ou git-crypt unlock), você pode usar o git normalmente -
criptografia e descriptografia acontecem de forma transparente.
A versão mais recente do git-crypt é a 0.8.0, lançada em 2025-09-23. O git-crypt tem como objetivo ser livre de bugs e confiável, ou seja, não deve travar, funcionar mal ou expor seus dados confidenciais. No entanto, ainda não atingiu a maturidade, o que significa que não é tão documentado, rico em recursos ou fácil de usar quanto deveria. Além disso, podem haver mudanças incompatíveis com versões anteriores introduzidas antes da versão 1.0.
O git-crypt é mais seguro do que outros sistemas de criptografia transparente para git. O git-crypt criptografa arquivos usando AES-256 no modo CTR com um IV sintético derivado do SHA-1 HMAC do arquivo. Este modo de operação é comprovadamente semanticamente seguro sob ataque de texto claro escolhido determinístico. Isso significa que, embora a criptografia seja determinística (o que é necessário para que o git possa distinguir quando um arquivo mudou ou não), não vaza nenhuma informação além de saber se dois arquivos são idênticos ou não. Outras propostas para criptografia transparente para git usam ECB ou CBC com um IV fixo. Esses sistemas não são semanticamente seguros e vazam informações.
O git-crypt depende de filtros git, que não foram projetados com criptografia em mente. Como tal, o git-crypt não é a melhor ferramenta para criptografar a maioria ou todos os arquivos de um repositório. Onde o git-crypt realmente brilha é quando a maior parte do seu repositório é pública, mas você tem alguns arquivos (talvez chaves privadas chamadas *.key, ou um arquivo com credenciais de API) que você precisa criptografar. Para criptografar um repositório inteiro, considere usar um sistema como git-remote-gcrypt em vez disso. (Nota: nenhum endosso é feito à segurança do git-remote-gcrypt.)
O git-crypt não criptografa nomes de arquivos, mensagens de commit, alvos de links simbólicos, gitlinks ou outros metadados.
O git-crypt não oculta quando um arquivo muda ou não, o comprimento de um arquivo, ou o fato de dois arquivos serem idênticos (veja a seção "Segurança" acima).
O git-crypt não suporta revogação de acesso a um repositório criptografado que foi previamente concedido. Isso se aplica tanto ao modo multi-usuário GPG (não há comando del-gpg-user para complementar add-gpg-user) quanto ao modo de chave simétrica (não há suporte para rotacionar a chave). Isso ocorre porque é um problema intrinsecamente complexo no contexto de dados históricos. Por exemplo, mesmo que uma chave tenha sido rotacionada em algum ponto da história, um usuário com a chave anterior ainda pode acessar o histórico anterior do repositório. Este problema é discutido em mais detalhes em https://github.com/AGWA/git-crypt/issues/47.
Arquivos criptografados com git-crypt não são compressíveis. Mesmo a menor alteração em um arquivo criptografado exige que o git armazene o arquivo inteiro alterado, em vez de apenas um delta.
Embora o git-crypt proteja o conteúdo de arquivos individuais com um SHA-1 HMAC, o git-crypt não pode ser usado com segurança a menos que todo o repositório seja protegido contra adulteração (um atacante que pode modificar seu repositório pode alterar seu arquivo .gitattributes para desabilitar a criptografia). Se necessário, use recursos do git como tags assinadas em vez de confiar apenas no git-crypt para integridade.
Arquivos criptografados com git-crypt não podem ser corrigidos com git-apply, a menos
que o patch em si seja criptografado. Para gerar um patch criptografado, use git diff --no-textconv --binary. Alternativamente, você pode aplicar um patch de texto
simples fora do git usando o comando patch.
O git-crypt não funciona de forma confiável com alguns GUIs git de terceiros, como Atlassian SourceTree e GitHub for Mac. Arquivos podem ficar em um estado não criptografado.
O arquivo .gitattributes é documentado na página man gitattributes(5).
O formato do padrão de arquivo é o mesmo usado pelo .gitignore,
conforme documentado na página man gitignore(5), com a exceção de que
especificar apenas um diretório (ex.: /dir/) não é suficiente para
criptografar todos os arquivos abaixo dele.
Observe também que o padrão dir/* não corresponde a arquivos em
subdiretórios de dir/. Para criptografar uma subárvore inteira dir/, use dir/**:
dir/** filter=git-crypt diff=git-crypt
O arquivo .gitattributes não deve ser criptografado, portanto certifique-se de que curingas não o correspondam acidentalmente. Se necessário, você pode excluir .gitattributes da criptografia assim:
.gitattributes !filter !diff