Gostaria de descriptografar um arquivo e editá-lo sem gravar seu conteúdo claro em um arquivo temporário, para evitar vazamentos de dados confidenciais.
Já criei o arquivo original com este comando:
echo -n "hello world" | gpg --encrypt --symmetric --output sensitive.gpg
Posso descriptografar este arquivo e exibi-lo:
$ gpg --decrypt sensitive.gpg
gpg: AES256.OCB encrypted session key
gpg: encrypted with 1 passphrase
gpg: encrypted with cv25519 key, ID <blablabla>
hello world
Entretanto, quando tento canalizar a saída para gpg --encrypt
, parece que os dois processos estão sendo executados simultaneamente e tentam consumir stdin ao mesmo tempo:
gpg --no-symkey-cache --pinentry-mode loopback --decrypt sensitive.gpg | gpg --encrypt --symmetric --pinentry-mode loopback --output sensitive.gpg
Antes de digitar qualquer senha, aqui está a saída:
gpg: AES256.OCB encrypted session key
Enter passphrase: Enter passphrase:
Você pode ver que ele está me pedindo a senha duas vezes.
E aqui estão os processos em execução:
$ ps | grep gpg
49716 ttys002 0:00.02 gpg --no-symkey-cache --pinentry-mode loopback --decrypt sensitive.gpg
49717 ttys002 0:00.01 gpg --encrypt --symmetric --pinentry-mode loopback --output sensitive.gpg
Existe alguma solução para gpg --encrypt
esperar que o programa gpg --decrypt
faça seu trabalho?
Gostaria de adicionar um editor vipe
entre esses dois comandos.
Essa parte do plano não é compatível com o plano de uso
vipe
, o que cria um arquivo temporário. Se você olhar na barra de status, verá que está editando/tmp/sZDlroW8Q3
ou algo parecido.Mas dependendo do seu SO, pode haver uma maneira de criar arquivos temporários na memória. Por exemplo, o Linux frequentemente torna /tmp na memória (embora ainda seja trocável para o disco, mas isso já é verdade para a memória de processo do seu editor de texto). Outros sistemas podem ter um recurso "ramdisk" de algum tipo.
Sim, é assim que os canos são projetados para funcionar.
Esse não é o problema, pois o stdin deles está conectado a fontes diferentes: o segundo processo não está lendo o stdin do terminal, mas da outra extremidade do
|
pipe correspondente.O problema vem dos dois programas abrindo manualmente o dispositivo de terminal (/dev/tty) – o que de fato é feito para que eles possam ler a senha sem perturbar seu stdin.
Os processos em um pipeline são sempre iniciados simultaneamente. A solução, portanto, depende se o prompt da 2ª frase-senha é exibido assim que o gpg inicia, ou somente assim que ele recebe dados – para descriptografia, pode ser o último, mas para criptografia, é mais provável que seja o primeiro.
Então você precisa substituir o segundo gpg por um wrapper que primeiro armazene seu stdin em um arquivo temporário e só então execute o gpg real. (Na verdade, o script é semelhante para ambos os casos.)
Com início atrasado (deixando o script iniciar o comando):
Sem (provavelmente será completamente redundante quando você adicionar o vipe):
Novamente, o
vipe
editor já funciona exatamente dessa forma – ele salva sua entrada em um arquivo temporário antes de invocar uma instância regular do Vim – então você não está realmente perdendo nenhuma segurança ao fazer isso. Na verdade, você poderia muito bem integrar isso ao script.Com início atrasado:
Sem início retardado: seria idêntico a
vipe
si mesmo.