Criptografando para uma lista de email

Para podermos manter criptografas as conversas que realizamos nas listas de email, tem um jeito bem simples que é o seguinte:

1) Todas as pessoas da lista criam as chaves pgp para seus emails.

2) Essas chaves são trocadas preferencialmente ao vivo entre as pessoas que compõem a lista.

3) (Estou assumindo que você não abre seus emails no webmail!) Abra seu cliente de email que está integrado ao enigmail [1, 2] (por exemplo, o Thunderbird), clique naquele botão de menu, que está escondido no lado direito parte de cima, vá na opção “Enigmail” e depois clique em “Editar Regras por Destinatários” (ou em inglês, como mostra a imagem)

4) Adicione uma nova regra.

5) Coloque o endereço da lista no campo mais acima e depois selecione as chaves públicas das pessoas que compõem a lista (inclusive a sua própria).

 

Pronto! Agora todo mundo da lista receberá mensagens criptografadas que só poderão ser lidas por quem estiver contido naquela “regra”. Lembre-se que todo mundo da lista deverá utilizar a mesma configuração de “regra para destinatário”.

turboCrypto, 24/8 19h30 no tarrafa

Quinta-feira, dia 24, às 19h30 no tarrafa teremos a
Oficina Prática turboCrypto: gpg + otr!

Serão duas horas sobre o melhor da criptografia, jamais superada pela humanidade e além-mundos. Veremos primeiramente como funciona a criptografia assimétrica, para logo em seguida instalar um cliente de email e a extensão Enigmail, que lida com o protocolo GPG [1]. Descobriremos onde está nossa chave privada (ela deve ser protegida e é de nossa e somente nossa responsabilidade cuidar dela) e como gerenciar as chaves públicas de nossos pares. Na sequência, entraremos no protocolo de bate-papo XMPP e aprenderemos a usar a camada de criptografia OTR (off-the-record) [2], que serviu de base para o Signal Protocol, hoje rodado por mais de 1 bilhão de pessoas pelo mundo afora. Ambas criptografia, GPG e OTR, são protocolos de código aberto e federados, ou seja, desde a primeira linha de código eles promovem a comunicação entre diferentes servidores (descentralização) além da própria liberdade na internet.

[1] https://gnupg.org/
[2] https://otr.cypherpunks.ca/

Verificando a integridade de arquivos

Caso você baixe algum arquivo da internet ou receba-o diretamente de alguém, é possível verificar sua integridade para saber se ele é o mesmo que o original ou foi modificado. Se você é quem está enviando o arquivo, então isso irá garantir que o que você mandou é o que foi recebido. Mostraremos duas formas de fazer isso.

Arquivos assinados

Usaremos o GnuPrivacyGuard para assinar arquivos. É preciso ter previamente um par de chaves GPG. Seu par de chaves mais recente será usado por padrão para criar uma assinatura. Caso deseje assinar com outro usuário, utilize o marcado -u. Todos os comandos de assinatura requerem a senha de acesso à chave privada do usuário assinante.

Assinando

Digite o seguinte comando para criar uma assinatura separada do arquivo:

$ gpg -b arquivo

O resultado será a assinatura chamada:

arquivo.sig

Também é possível criar um novo arquivo assinado, dois em um:

$ gpg -s arquivo

O resultado será o seguinte:

arquivo.gpg

Para criar uma assinatura separada em texto claro, execute:

$ gpg --clearsign arquivo

O resultado será um arquivo de mesmo nome com a extensão .asc. O uso desse tipo de assinatura, entretanto, é limitado pois você pode apenas conferir se a assinatura é válida e não o arquivo em si. Utilize as duas primeiras opções.

Verificando

Para verificar um arquivo corretamente, é preciso ter a chave pública do remetente no seu conjunto de chaves públicas.

Se você recebeu o arquivo e sua assinatura separados, execute:

gpg --verify arquivo.sig arquivo

O resultado positivo será algo assim:

gpg: Signature made Sex 19 Mai 2017 14:52:06 -03 using RSA key ID ####
gpg: Good signature from "usuario <usuario@email.org>"
gpg: AVISO: Esta chave não está certificada com uma assinatura confiável!
gpg:        Não há indicação de que a assinatura pertence ao dono.
Impressão da chave primária: #### #### #### ####

Caso você receba algo assim:

gpg: Signature made Fri 09 Oct 2015 05:41:55 PM CEST using RSA key ID 4F25E3B6
gpg: Can't check signature: No public key

Isso significa que ou você não possui a chave pública da pessoa ou a assinatura foi gerada por outra pessoa e o arquivo deve ser tratado como suspeito.

Se você recebeu um único arquivo com a terminação .gpg, então execute apenas:

$ gpg --verify arquivo.gpg

Comparando os CHECKSUMs

Outra forma de verificar a integridade de um arquivo é comparar o checksum ou hash (resumo) de SHA1 do arquivo recebido com o do original. A função SHA1 é uma função de dispersão criptográfica que gera um código de 160 bits que resume o arquivo.

Se você baixar o arquivo de instalação do GnuPG do site do GnuPG, execute:

$ sha1sum gnupg-2.0.30.tar.bz2

e compare o resultado com o hash anunciado no site. A cara do hash do SHA1 é a seguinte:

a9f024588c356a55e2fd413574bfb55b2e18794a  gnupg-2.0.30.tar.bz2

Esse não é tido como um método tão seguro quanto a assinatura, dado que se alguém consegue alterar um arquivo em trânsito, é possível que também consiga alterar o hash anunciado no site. Mas mesmo assim, comparar os valores de checksum é muito mais confiável do que nada.

Exercícios:

Aqui vão dois exemplos para você exercitar o que aprendeu. Lembre-se de baixar as chaves públicas de quem estiver assinando o arquivo que você deseja baixar.

  1. Baixe a instalação do GnuPG. Verifique a assinatura e compare o checksum.
  2. Baixe a última versão do TailsOS. Verifique o arquivo .ISO com a assinatura disponibilizada no site.

Como usar GPG para criptografar e assinar mensagens via terminal

Introdução

GPG, ou GNU Privacy Guard, é uma implementação criptográfica de chave pública. Ela permite a transmissão segura de informação entre partes e pode ser usada para verificar se a origem de uma mensagem é genuína.

Neste guia, discutiremos como a GPG funciona e como implementá-la. Usaremos comando para Ubuntu 12.04 neste demonstração, mas essas ferramentas estão disponíveis em qualquer distribuição moderna de Linux.

Como a criptografia de Chave Pública funciona

Um problema que muitas pessoas enfrentam é como se comunicar de forma segura e validar a identidade de parte com quem estão falando. Vários esquemas que tentam responder a esta questão requerem, pelo menos em algum ponto, a transferência de uma senha ou outras credenciais de identificação através de um meio inseguro.

Garanta que apenas as pessoas que você quer leiam a mensagem

Para resolver esse problema, GPG conta com um conceito de segurança chamado criptografia de chave pública. A ideia é que você pode dividir os estágios de criptografar e descriptografar da transmissão em duas coisas separadas. Dessa forma, você pode distribuir livremente a parte para criptografar, desde que guarde segura a parte para descriptografar.

Isso permitiria que uma mensagem de transferência de via única fosse criada e criptografada por qualquer pessoa, mas que somente pudesse ser descriptografada pela usuária designada (a única com a chave privada para descriptografar) Se ambas as partes criam os pares de chaves pública/privada e dá uma à outra sua chave pública, ambas podem criptografar mensagens entre si.

Então, neste cenário, cada parte possui sua própria chave privada e a chave pública da outra.

Validar a identidade da remetente

Outra vantagem desse sistema é que a remetente de uma mensagem por “assiná-la” com sua chave privada. A chave pública que a destinatária possui pode ser usada para verificar que a assinatura é de fato enviada pela usuária indicada.

Isto pode impedir uma terceira parte de se fazer passar por outra pessoa (“spoofing”). Também ajuda a assegurar que a mensagem foi transmitida por completo, sem danos ou corrupção de arquivos.

Configurando as chaves GPG

GPG deve vir instalada por padrão no Ubuntu 12.04. Se não for o caso, você pode instalá-la com:

sudo apt-get install gnupg

Para começar a usar GPG para criptografar suas comunicações, você precisa criar um par de chaves. Isso pode ser feito pelo seguinte comando:

gpg --gen-key

Você passará por algumas questões que irão configurar suas chaves.

  • Por favor, selecione o tipo de chave que você quer: (1) RSA e RSA (padrão)
  • Qual o tamanho de chave que você quer? 4096
  • A chave é válida por? 0
  • Isto está correto? y
  • Nome real: your real name here (coloque o nome que desejar)
  • Endereço de Email: seu_email@endereço.net
  • Comentário: Comentário opcional que estará visível na sua assinatura
  • Modificar (N)ome, ©comentário, (E)mail or (O)kay/(Q)uit? O
  • Coloque sua senha: Coloque sua senha de segurança aqui (maiúsculas, minúsculas, dígitos, símbolos)

A esta altura, será preciso entropia para gerar as chaves. Este é basicamente um termo que descreve a quantidade de imprevisibilidade que existe num sistema. GPG usa esta entropia para gerar um conjunto de chaves aleatórias.

O melhor é abrir uma nova janela de terminal e SSH na VPS enquanto o programa roda. Instale algum software, trabalhe, e use seu computador o máximo que puder para que seja gerada a entropia necessária.

Este processo pode levar bastante tempo, dependendo de quanta atividade você consegue gerar no sistema.
Para aumentar a entropia automaticamente dá para usar o seguinte comando:

cat /dev/urandom

Criando um certificado de revogação

Você precisa ter uma forma de invalidar seu par de chaves no caso de acontecer uma falha de segurança, ou no caso de você perder sua chave secreta. Existe um jeito fácil de fazer isso usando o software GPG.

Crie seu certificado assim que fizer seu par de chaves, não quando precisar dele. Essa chave de revogação deve ser gerada com antecedência e mantida em um local separado e seguro, para o caso em que seu computador esteja comprometido ou inoperante. Escreva:

gpg --gen-revoke your_email@address.com

Será pedido uma razão para a revogação. Você pode escolher qualquer uma das opções disponíveis, mas já que isso é feito com antecedência, não é preciso ser específica.

Será oferecida a chance de adicionar um comentário e finalmente confirmar suas escolhas.

Por fim, um certificado de revogação será gerado na tela. Copie-o e cole-o num local seguro, ou imprima-o para uso posterior:

Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: A revocation certificate should follow

iQIfBCABAgAJBQJSTxNSAh0AAAoJEIKHahUxGx+E15EP/1BL2pCTqSG9IYbz4CMN
bCW9HgeNpb24BK9u6fAuyH8aieLVD7It80LnSg/+PgG9t4KlzUky5sOoo54Qc3rD
H+JClu4oaRpq25vWd7+Vb2oOwwd/27Y1KRt6TODwK61z20XkGPU2NJ/ATPn9yIR9
4B10QxqqQSpQeB7rr2+Ahsyl5jefswwXmduDziZlZqf+g4lv8lZlJ8C3+GKv06fB
FJwE6XO4Y69LNAeL+tzSE9y5lARKVMfqor/wS7lNBdFzo3BE0w68HN6iD+nDbo8r
xCdQ9E2ui9os/5yf9Y3Uzky1GTLmBhTqPnl8AOyHHLTqqOT47arpwRXXDeNd4B7C
DiE0p1yevG6uZGfhVAkisNfi4VrprTx73NGwyahCc3gO/5e2GnKokCde/NhOknci
Wl4oSL/7a3Wx8h/XKeNvkiurInuZugFnZVKbW5kvIbHDWJOanEQnLJp3Q2tvebrr
BBHyiVeQiEwOpFRvBuZW3znifoGrIc7KMmuEUPvA243xFcRTO3G1D1X9B3TTSlc/
o8jOlv6y2pcdBfp4aUkFtunE4GfXmIfCF5Vn3TkCyBV/Y2aW/fpA3Y+nUy5hPhSt
tprTYmxyjzSvaIw5tjsgylMZ48+qp/Awe34UWL9AWk3DvmydAerAxLdiK/80KJp0
88qdrRRgEuw3qfBJbNZ7oM/o
=isbs
-----END PGP PUBLIC KEY BLOCK-----

Como importar as chaves públicas de outras pessoas

GPG seria bem inútil se não fosse possível aceitar chaves públicas das pessoas com quem você quer se comunicar.

Você pode importar a chave pública de alguém de várias formas. Se você conseguiu uma chave pública em formato texto, GPG pode importá-la com o seguinte comando:

gpg --import name_of_pub_key_file

Também existe a possibilidade de que a pessoa com quem você quer se comunicar tenha subido a chave num servidor de chaves públicas. Estes servidores são usados para armazenar chaves públicas do mundo todo.

Um servidor de chaves popular que sincroniza suas informações com uma série de outros servidores é o servidor de chaves do MIT. Você pode procurar pelas pessoas pelos seus nomes ou endereços de email acessando o seguinte site no navegador:

http://pgp.mit.edu/

Você também pode procurar no servidor de chaves a partir do GPG usando o seguinte comando:

gpg --keyserver pgp.mit.edu  --search-keys search_parameters

Como verificas e assinar chaves

Embora você possa distribuir livremente a chave pública que você gerou e as pessoas usem isso para entrar em contato contigo de maneira criptografada, existe ainda uma questão de confiança na transmissão inicial da chave pública.

Verificar a identidade da outra pessoa

Como saber se a pessoa que lhe dá sua chave pública é quem ela diz que é? Em alguns casos, isso pode ser simples. Você pode estar sentado justo ao lado dela, com ambos laptops abertos trocando chaves. Este parece ser um jeito bem seguro de saber que você está recebendo a chave certa.

Mas existem várias outras circunstâncias onde esse contato pessoal não é possível. Pode ser que você não conheça a outra parte pessoalmente, ou que vocês estejam separadas fisicamente pela distância. Se você não quer jamais se comunicar por canais inseguros, verificar a chave pública de alguém pode ser problemático.

Por sorte, ao invés de verificar to uma chave pública de ambas as partes, você pode simplesmente compara a “impressão digital” derivada dessas chaves. Isso lhe assegurará razoavelmente bem que ambas estão usando a mesma informação da chave pública.

Você pode conseguir a impressão digital de uma chave pública digitando:

gpg --fingerprint seu_email@endereco.net
pub   4096R/311B1F84 2013-10-04
      Key fingerprint = CB9E C70F 2421 AF06 7D72  F980 8287 6A15 311B 1F84
uid                  Test User <test.user@address.com>
sub   4096R/8822A56A 2013-10-04

Isso lhe dará uma sequência de caracteres (string ) muito mais manuseável para comparar. Você pode comparar esta sequência (string ) com a própria pessoa, ou com uma pessoa que tenha acesso à dona da chave.

Assinando a chave alheia

Assinar uma chave é dizer ao seu software que você confia na chave que lhe foi dada e que você verificou que aquela chave está associada à pessoa certa.

Para assinar uma chave que você já importou, simplesmente digite:

gpg --sign-key email@exemplo.org

Ter assinado a chave significa que você verificou-a, que você confia que a pessoa que lhe deu a chave é quem ela diz que é. Isso pode ajudar outras pessoas a decidirem se confiam ou não nessa pessoa também. Se alguém confia em você, e ela vê que você assinou a chave daquela pessoa, isso torna mais provável que ela venha a confiar também.

Você deveria conceder à pessoa que você assinou a chave as vantagens da vossa relação de confiança enviando à ela a chave assinada. Você pode fazer isso digitando:

gpg --export --armor email@exemplo.org

Será preciso digitar sua senha novamente. Em seguida, a chave pública dela, assinada por você, aparecerá na tela. Envie para ela para que ela possa se beneficiar do seu “selo de aprovação” quando interagir com outras pessoas.

Quando ela receber essa nova chave assinada, poderá importá-la, adicionando na própria base de dados da GPG a informação de assinatura que você gerou. Ela pode fazer isso digitando?

gpg --import file_name

Como tornar sua chave pública altamente disponível

Nada de ruim pode acontecer se pessoas desconhecidas possuírem sua chave pública.

Por causa disso, pode ser benéfico que você disponibilize sua chave pública. Assim, as pessoas poderão facilmente encontrar sua informação e lhe enviar mensagens seguras, desde a primeira comunicação.

Você pode enviar a qualquer pessoa sua chave pública requisitando-a ao sistema GPG:

gpg --armor --export seu_email@endereco.net
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

Você pode, então, copiá-la e colá-la ou enviá-la por um meio apropriado.

Se você quer publicar sua chave num servidor de chaves, é possível fazer isso manualmente através de formulários disponíveis na maioria dos sites dos servidores.

Outra opção seria fazer isso através da interface GPG?

Encontre sua identificação (ID) de chave digitando:

gpg --list-keys seu_email@endereco.net

A parte destacada é a sua ID de chave. Essa é uma forma curta de fazer referência à chave dentro do software.

pub   4096R/311B1F84 2013-10-04
uid                  Test User <test.user@address.com>
sub   4096R/8822A56A 2013-10-04

Para subir sua chave em determinado servidor de chaves. você pode usar essa sintaxe:

gpg --send-keys --keyserver pgp.mit.edu id_da_chave

Criptografar e descriptografar mensagens com GPG

Você pode facilmente criptografar e descriptografar mensagens após ter configurado suas chaves com uma outra parte.

Criptografar mensagens

Você pode criptografar mensagens usando a flag “—encrypt” na GPG. A sintaxe básica seria:

gpg --encrypt --sign --armor -r outra_pessoa@email.org name_of_file

Os parâmetros basicamente criptografam o email, assinam-no com sua chave privada para garantir que ele vem de você, e gera a mensagem em formato de texto ao invés de bytes puros.

Você deve incluir um segundo “-r” destinatário com o seu próprio endereço de email se você quiser poder ler a mensagem em algum outro momento. Isso acontece porque a mensagem será criptografada para cada chave pública pessoal, e somente será possível descriptografá-la com as chaves privadas correspondentes.

Assim, se ela for criptografada apenas com a chave pública de outras partes, você não conseguirá ver a mensagem novamente, a não ser que de alguma forma você consiga a chave privada delas. Colocar a si mesma como uma segunda destinatária faz com que a mensagem seja criptografada duas vezes separadamente, uma para cada destinatária.

Descriptografar mensagens

Quando você recebe uma mensagem, é só rodar a GPG sobre o arquivo da mensagem:

gpg nome_do_arquivo

O software irá lhe pedir o que for necessário.

Se você está com a mensagem como fluxo de texto, você pode copiá-lo e colá-lo após digitar simplesmente “gpg” sem mais nenhum argumento. Pressione “CTRL-D” para dizer que a mensagem chegou ao fim e a GPG vai descriptografá-la para você.

Manutenção de chaves

Existe vários procedimentos que você precisa realizar para gerenciar sua base de dados de chaves.

Para listar as chaves GPG de outras pessoas na sua base de dados, digite o seguinte comando:

gpg --list-keys

Suas informações sobre chaves podem ficar obsoletas se você depende de informações retiradas de servidores de chaves. Não é desejável que se use chaves revogadas porque isso significaria que você está confiando em chaves potencialmente comprometidas.

Você pode atualizar as informações de chaves digitando:

gpg --refresh-keys

Isso irá buscar novas informações dos servidores de chaves.

Você pode puxar informações de um servidor de chaves específico usando:

gpg --keyserver key_server --refresh-keys

Conclusão

Usar GPG corretamente pode lhe ajudar a tornar seguras suas comunicações com diferentes pessoas. Isso é extremamente útil, especialmente com informações sensíveis, mas também no envio de mensagens comuns e cotidianas.

Devido ao fato de que certas comunicações criptografadas podem ser marcadas por programas de monitoramento, é recomendável que se use criptografia para tudo, não apenas para dados “secretos”. Isso tornará mais difícil para se descobrir quando você está enviando dados importante ou apenas dando um oi.

A criptografia GPG só é útil quando as duas parte usam boas práticas de segurança e estão atentas sobre outras práticas seguras. Ensine regularmente as pessoas com quem você se comunica sobre a importância dessas práticas se você quer ter a possibilidade de uma comunicação segura criptografada.

Original em inglês por Justin Ellingwood