Você está certo em criptografar seu arquivo de configurações confidenciais enquanto ainda mantém o arquivo no controle de versão. Como você mencionou, a melhor solução seria aquela em que o Git criptografaria transparentemente certos arquivos confidenciais quando você os enviar para que localmente (ou seja, em qualquer máquina que possua seu certificado) você possa usar o arquivo de configurações, mas Git ou Dropbox ou quem quer que seja armazenar seus arquivos no VC não tem a capacidade de ler as informações em texto sem formatação.
Tutorial sobre criptografia / descriptografia transparente durante push / pull
Esta lista https://gist.github.com/873637 mostra um tutorial sobre como usar o driver de filtro de manchas / limpeza do Git com o openssl para criptografar transparentemente os arquivos enviados. Você só precisa fazer algumas configurações iniciais.
Resumo de como funciona
Basicamente, você criará uma .gitencrypt
pasta contendo 3 scripts bash,
clean_filter_openssl
smudge_filter_openssl
diff_filter_openssl
que são usados pelo Git para descriptografia, criptografia e suporte ao Git diff. Uma senha mestre e salt (fixos!) São definidos dentro desses scripts e você DEVE garantir que o .gitencrypt nunca seja realmente enviado. clean_filter_openssl
Script de exemplo :
#!/bin/bash
SALT_FIXED=<your-salt> # 24 or less hex characters
PASS_FIXED=<your-passphrase>
openssl enc -base64 -aes-256-ecb -S $SALT_FIXED -k $PASS_FIXED
Semelhante para smudge_filter_open_ssl
e diff_filter_oepnssl
. Veja Gist.
Seu repositório com informações confidenciais deve ter um arquivo .gitattribute (não criptografado e incluído no repositório) que faça referência ao diretório .gitencrypt (que contém tudo o que o Git precisa para criptografar / descriptografar o projeto de forma transparente) e que esteja presente na sua máquina local.
.gitattribute
conteúdo:
* filter=openssl diff=openssl
[merge]
renormalize = true
Por fim, você também precisará adicionar o seguinte conteúdo ao seu .git/config
arquivo
[filter "openssl"]
smudge = ~/.gitencrypt/smudge_filter_openssl
clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
textconv = ~/.gitencrypt/diff_filter_openssl
Agora, quando você envia o repositório que contém suas informações confidenciais para um repositório remoto, os arquivos serão criptografados de forma transparente. Quando você puxa de uma máquina local que possui o diretório .gitencrypt (que contém sua senha), os arquivos são descriptografados de forma transparente.
Notas
Devo observar que este tutorial não descreve uma maneira de criptografar apenas seu arquivo de configurações confidenciais. Isso criptografa de forma transparente todo o repositório enviado ao host remoto do VC e descriptografa o repositório inteiro para que seja totalmente descriptografado localmente. Para alcançar o comportamento desejado, você pode colocar arquivos confidenciais para um ou vários projetos em um sensitive_settings_repo. Você pode investigar como essa técnica de criptografia transparente funciona com os submódulos Git http://git-scm.com/book/en/Git-Tools-Submodules se você realmente precisa que os arquivos confidenciais estejam no mesmo repositório.
O uso de uma senha fixa pode teoricamente levar a vulnerabilidades de força bruta se os invasores tiverem acesso a muitos repositórios / arquivos criptografados. IMO, a probabilidade disso é muito baixa. Como menciona uma observação na parte inferior deste tutorial, o não uso de uma senha fixa resultará em versões locais de um repositório em máquinas diferentes, sempre mostrando que ocorreram alterações com o 'status git'.