Usando GPG para assinar, verificar, criptografar e descriptografar

Última atualização: 15/11/2022

O que é GPG? ​

"O GnuPG é uma implementação completa e gratuita do padrão OpenPGP, conforme definido pela RFC4880 (também conhecido como PGP). O GnuPG permite criptografar e assinar dados e comunicações; ele oferece um sistema versátil de gerenciamento de chaves, com módulos de acesso a vários diretórios de chaves públicas [...]"

Site do GPG

GPG (GnuPG, de código aberto) é diferente de PGP (proprietário). Ele usa principalmente chaves privadas e públicas para criptografar, descriptografar, assinar e verificar dados (também é possível usar criptografia simétrica, mas não é tão interessante).

Gerando sua chave GPG ​

bash
gpg --full-gen-key

# For older versions (including Windows and MacOS) you can use --gen-key if the parameter above fails
  1. Selecione o algoritmo (use o padrão RSA e RSA);
  2. Especifique o tamanho (quanto maior, melhor; atualmente, 4096 bits é uma opção comum);
  3. Na maioria dos casos, não é necessário definir um período de validade (um período menor reduz o impacto de vazamentos, mas pode ser inconveniente);
  4. Quando solicitado, informe seu nome completo e e-mail;
  5. Se quiser, adicione um comentário (normalmente exibido junto ao seu nome/e-mail);
  6. Defina uma senha forte quando solicitado.

Liste as chaves GPG geradas e salvas no seu perfil:

bash
gpg --list-secret-keys --keyid-format LONG <EMAIL USED TO GENERATE THE KEY>

# The output will look like this (this example shows two keys):
#
# gpg: checking the trustdb
# gpg: marginals needed: 3  completes needed: 1  trust model: pgp
# gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
# gpg: next trustdb check due at 2024-11-15
# /home/user/.gnupg/pubring.kbx
# ------------------------------
# sec   rsa3072/CXXXXXXXXC540 2022-01-01 [SC] [expires: 2024-01-01]
#       4285ECCCCCCCCCCCCCCCCCB4C48AFCXXXXXXXXC540
# uid                 [ultimate] Your name <email@example.com>
# ssb   rsa3072/F3DC33A661677229 2022-01-01 [E] [expires: 2024-01-01]
#
# sec   rsa4096/84YYYYYYYYYYE 2022-01-01 [SC]
#       78C4E82E42C7AA5535B1233320ED984YYYYYYYYYYE
# uid                 [ultimate] Your name <email@example.com>
# ssb   rsa4096/A7CCCCCCCCCC5214 2022-01-01 [E]

O ID usado nos próximos comandos é a sequência depois da / (por exemplo, CXXXXXXXXC540).

Exportando a chave pública GPG ​

Provavelmente você precisará enviar sua chave pública a alguém ou armazená-la em algum serviço para os usos descritos adiante. Para exportá-la como texto, use o parâmetro --export:

bash
gpg --armor --export <ID>

# The output looks like this (always copy the key including the BEGIN and END lines):
#
# -----BEGIN PGP PUBLIC KEY BLOCK-----
#
# mQINBGN0XVIBEACgiLew1ciXwpKyLZqVMGJ/c70y7RyyrloQswm9rPdrJTIprDpk
# [a bunch of characters here]
# =R8RB
# -----END PGP PUBLIC KEY BLOCK-----

A chave pública pode ser compartilhada com qualquer pessoa. A chave privada nunca deve sair do seu computador; mantenha-a em segredo.

Também é possível exportá-la para um arquivo .gpg, evitando copiar e colar:

bash
gpg --armor --output <FILENAME>.gpg --export <ID>

Assinando commits com GPG ​

Você pode assinar apenas alguns commits com a opção -S:

bash
git commit -S -m "Your regular commit message"

Ou assinar todos os commits usando a configuração global:

bash
git config --global commit.gpgsign true

# Now all following commits will include the signature

Se houver problemas com a assinatura, tente usar gpg2. Para definir o programa em todos os repositórios: git config --global gpg.program gpg2.

Usando GPG com o GitLab ​

O GitLab exibe um selo de verificação ao lado dos commits assinados. Consulte a documentação do GitLab.

Você pode encontrar a chave pública GPG de um usuário em https://gitlab.com/<username>.gpg.

Usando GPG com o GitHub ​

O GitHub exibe um selo de verificação ao lado dos commits assinados. Consulte a documentação do GitHub.

Importando chaves públicas de outras pessoas ​

Para criptografar um arquivo para alguém ou verificar a assinatura de um arquivo, solicite a chave pública da pessoa e importe-a:

bash
# Import the received key from a file, such as the generated `.gpg` file
gpg --import recipient-pubkey.gpg

Criptografando e descriptografando arquivos com GPG ​

A criptografia usa a chave pública do destinatário. Somente ele poderá descriptografar o arquivo com sua chave privada. É possível criptografar um arquivo por vez, seja um arquivo de texto ou outro formato, como .tar.gz.

Importe a chave pública do destinatário antes de executar o comando.

bash
gpg --output encrypted-file.txt.gpg --encrypt --recipient recipient@example.com file.txt

Para descriptografar, o destinatário deve executar:

bash
gpg --output file.txt --decrypt encrypted-file.txt.gpg

O comando usará a chave privada para descriptografar o arquivo.

Assinando e verificando arquivos com GPG ​

Gerar um arquivo assinado é parecido com criptografá-lo, mas usa o comando --sign. O GPG usa sua chave privada para assinar o arquivo.

bash
gpg --sign somefile.txt

Será gerado um arquivo com extensão .gpg, contendo o arquivo e a assinatura.

Para verificar a integridade, use --verify. Esse comando usa sua chave pública:

bash
gpg --verify somefile.txt.sig

Também é possível ver o conteúdo do arquivo com --decrypt:

bash
gpg --output file.txt --decrypt signed-file.txt.gpg

A descriptografia usa a chave pública do remetente; portanto, o conteúdo não fica oculto de quem tiver essa chave. Chaves públicas devem ser compartilhadas.

Assinando ou criptografando e-mails com GPG ​

Também é possível assinar ou criptografar e-mails com GPG. O Thunderbird é uma opção adequada. Consulte a documentação do Thunderbird para configurar o cliente.

A maioria dos webmails (inclusive o Gmail) não oferece um cliente compatível com GPG. Sua chave privada nunca deve sair de um local seguro (seu computador). Para provedores compatíveis, você pode usar o Thunderbird para enviar e receber e-mails com criptografia ponta a ponta por IMAP/SMTP/POP.

Definindo a chave GPG padrão no Debian/Ubuntu ​

Se você tiver várias chaves, pode definir a chave padrão criando ou atualizando ~/.gnupg/gpg.conf:

bash
# First list all keys
gpg --list-signatures

# Create file using vim/nano/anyother editor
# ~/.gnupg/gpg.conf
# and include the contents
# default-key YOURIDHERE

Se não definir uma chave padrão, normalmente a primeira gerada será usada.