Verificação de assinaturas digitais

9 minutos de leitura

Nunca instale ou use aplicativos sem verificar assinaturas digitais.

1. Introdução

A verificação de assinaturas digitais serve para garantir que uma mensagem não foi alterada e que seu autor é realmente quem ‘assinou’ a mensagem, ou seja, o dono do par de chaves criptográficas.

A assinatura digital se baseia na criptografia assimétrica: a assinatura é feita com a chave privada e a verificação com a chave pública do mesmo par de chaves.

Assim, caso a mensagem (ou um arquivo em qualquer formato) tenha sido modificado na origem ou em trânsito, os hashes não serão iguais, e se forem (caso o hacker tenha publicado novos hashes), os hashes não terão uma assinatura digital válida.

Traduzindo: Caso o hacker altere o executável, seu hash será diferente do manifest; se for igual (caso o hacker também tenha alterado o manifest, pois os dois estão no Github), a assinatura do manifest será inválida porque o manifest foi assinado com a chave da equipe de desenvolvedores e o hacker não possui acesso à chave privada para poder refazer a assinatura. O hacker precisaria então alterar a chave pública no servidor do MIT, no caso do Decred, e também a página que orienta a importação da chave pública no Github (devido à mudança no ID da chave). E ainda assim, só funcionaria para aqueles que importarem a chave pública depois de ser alterada pelo hacker.

Assim como a seed da carteira (mnemônico para a chave privada) deve ser mantida em segredo, a chave privada do par também deve ser bem guardada. Já a chave pública (assim como os endereços de pagamento do Decred, que são derivados da chave pública mestra) pode ser divulgada sem comprometer a segurança da chave privada.

Figura 1 — O processo — Rebuilt from Microsoft Windows Dev Center, Digital Signatures
Figura 1 — O processo — Rebuilt from Microsoft Windows Dev Center, Digital Signatures

2. Como funciona a assinatura digital

2.1. Hash

É o resultado de uma função matemática que retorna sempre uma sequência de tamanho fixo independentemente do tamanho da entrada.

Figura 2 - Cryptographic hash functions - Rebuilt from Wikipedia
Figura 2 - Cryptographic hash functions - Rebuilt from Wikipedia

Qualquer modificação na entrada, seja no texto, na quantidade ou na ordem dos caracteres, altera completamente o resultado final (digest).

2.2. Assinatura

a) É gerado um hash da mensagem ou arquivo (no nosso caso armazenado em manifest-decrediton-$VERSION.txt)

b) O hash (nesse caso, o manifest) é assinado (criptografado) com a chave privada (no nosso caso o hash assinado é armazenado em manifest-decrediton-$VERSION.txt.asc)

Schematics do processo de assinatura e verificação do Decrediton

Figura 3 - Assinatura (setas pretas), verificação (setas brancas)
Figura 3 - Assinatura (setas pretas), verificação (setas brancas)

2.3. Verificação

a) É gerado um hash da mensagem ou arquivo que foi copiado da Internet.

b) O hash assinado (criptografado) é descriptografado usando a chave pública do remetente e obtém-se o hash original. Se os hashes são iguais, a mensagem não foi alterada e o remetente é quem realmente achamos que é, pois a chave pública usada não poderia descriptografar algo criptografado com uma chave privada de outro par. Na criptografia assimétrica o que é feito com uma chave só pode ser desfeito ou verificado com a outra chave do mesmo par.

3. Quais são os riscos?

Os riscos mudam de acordo com o aplicativo que pode ter sido violado. No caso de carteiras de moedas digitais é possível que o atacante copie a seed ou a chave privada e transfira todas as moedas para outros endereços. No caso de outros aplicativos é possível que ocorra vazamento de informações, acesso não autorizado a outras informações armazenadas pelo usuário e até mesmo acesso remoto ou escalação de privilégios dependendo do código malicioso que foi inserido no aplicativo original.

4. Verificação de arquivos

Nunca instale ou use aplicativos sem verificar assinaturas digitais.

A recomendação acima se refere a aplicativos de uma forma geral. Mesmo aplicativos simples como uma calculadora ou um editor de texto, que não precisam de credenciais administrativas para instalação ou execução, podem conter código malicioso que explora uma vulnerabilidade do sistema operacional ou do kernel. Assim, a recomendação mais ampla seria: não instale qualquer porcaria no seu dispositivo, e o que for instalar, baixe de fonte oficial e verifique a assinatura digital, se possível.

Abaixo estão descritos os passos necessários para verificar a autenticidade do Decrediton. Essas etapas podem ser usadas para verificar outros aplicativos copiados da Internet. Basta apenas importar a chave pública dos desenvolvedores (essa informação constará do site). A importação da chave pública é uma etapa que raramente ocorre, somente no caso de um par de chaves ser revogado ou substituido.

Saiba mais sobre essa verificação em:

4.1. No Mac

a) Acesse https://github.com/decred/decred-binaries/releases/

b) Baixe para a mesma pasta os arquivos decrediton-$VERSION.dmg, manifest-decrediton-$VERSION.txt e manifest-decrediton-$VERSION.txt.asc

c) Caso a chave ainda não tenha sido importada (erro: ‘gpg: Can’t check signature: No public key’): importe a chave pública dos desenvolvedores (o GPG tentará sair pela porta TCP/11371):

$ gpg --keyserver pgp.mit.edu --recv-keys 0x518A031D

d) Certifique-se de que a chave correta foi importada:

gpg: key 6DF634AA7608AF04: public key "Decred Release <release@decred.org>" imported

e) Verifique a assinatura digital:

$ gpg --verify manifest-decrediton-$VERSION.txt.asc

gpg: assuming signed data in 'manifest-decrediton-v1.1.3.txt'
gpg: Signature made Thu Dec 21 17:15:58 2017 WET
gpg:                using RSA key 6D897EDF518A031D
gpg: Good signature from "Decred Release <release@decred.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: FD13 B683 5E24 8FAF 4BD1  838D 6DF6 34AA 7608 AF04
     Subkey fingerprint: F516 ADB7 A069 852C 7C28  A02D 6D89 7EDF 518A 031D

f) Procure no retorno do gpg por: “using RSA key 6D897EDF518A031D” (apenas na primeira verificação após importar a chave). Repare que a segunda metade do ID da RSA key está na etapa c) e no texto ‘Good signature from “Decred Release ”’

g) Para verificar o hash e comparar manualmente com o conteúdo de manifest-decrediton-$VERSION.txt:

$ shasum -a 256 decrediton-$VERSION.dmg
$ cat manifest-decrediton-$VERSION.txt

h) Monte o arquivo DMG e copie o novo Decrediton para Applications.

Referência: https://docs.decred.org/advanced/verifying-binaries/

Obs.: Se você não tem o gpg, acesse: https://gpgtools.org/

Web of Trust

O warning na etapa e) com a mensagem sobre a chave não ser certificada com uma assinatura confiável está relacionado ao PGP Web of Trust. Num modelo descentralizado não existe uma autoridade central como a Autoridade Certificadora na ICP que possa dizer se a chave realmente pertence a um usuário (validação da identidade). Então o modelo web of trust se baseia em uma chave ser ‘assinada’ pela chave de um usuário que já é confiável do sistema, criando assim uma ‘teia de confiança’ (web of trust). Esse warning é normal considerando que eu não tenho no sistema alguém que já confie na chave dos devs do Decred.

4.2. No Debian

a) Acesse https://github.com/decred/decred-binaries/releases/

b) Baixe para a mesma pasta os arquivos decrediton-$VERSION.deb, manifest-decrediton-$VERSION.txt e manifest-decrediton-$VERSION.txt.asc

c) Caso a chave ainda não tenha sido importada (erro: ‘gpg: Can’t check signature: No public key’): importe a chave pública dos desenvolvedores (o GPG tentará sair pela porta TCP/11371):

$ gpg --keyserver pgp.mit.edu --recv-keys 0x518A031D

Em caso de erro ‘gpg: keyserver receive failed: No dirmngr’:

$ sudo apt-get install dirmngr

d) Certifique-se de que a chave correta foi importada:

gpg: key 6DF634AA7608AF04: public key "Decred Release <release@decred.org>" imported

e) Verifique a assinatura digital:

$ gpg --verify manifest-decrediton-$VERSION.txt.asc

gpg: assuming signed data in 'manifest-decrediton-v1.1.3.txt'
gpg: Signature made Thu Dec 21 17:15:58 2017 WET
gpg:                using RSA key 6D897EDF518A031D
gpg: Good signature from "Decred Release <release@decred.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: FD13 B683 5E24 8FAF 4BD1  838D 6DF6 34AA 7608 AF04
     Subkey fingerprint: F516 ADB7 A069 852C 7C28  A02D 6D89 7EDF 518A 031D

f) Procure no retorno do gpg por: “using RSA key 6D897EDF518A031D” (apenas na primeira verificação após importar a chave). Repare que a segunda metade do ID da RSA key está na etapa c) e no texto ‘Good signature from “Decred Release ”’

g) Para verificar o hash e comparar manualmente com o conteúdo de manifest-decrediton-$VERSION.txt:

$ sha256sum decrediton-$VERSION.deb

h) Para instalar use:

$ dpkg -i decrediton-$VERSION.deb

Sobre o warning no output do GPG: Veja sobre o Web of Trust na seção 4.1.

Referência: https://docs.decred.org/advanced/verifying-binaries/

Obs.: Se você não tem o gpg, acesse: https://gpgtools.org/

4.3. Em outro Linux (e também no Debian)

a) Acesse https://github.com/decred/decred-binaries/releases/

b) Baixe para a mesma pasta os arquivos decrediton-$VERSION.tar.gz, manifest-decrediton-$VERSION.txt e manifest-decrediton-$VERSION.txt.asc

c) Caso a chave ainda não tenha sido importada (erro: ‘gpg: Can’t check signature: No public key’): importe a chave pública dos desenvolvedores (o GPG tentará sair pela porta TCP/11371):

$ gpg --keyserver pgp.mit.edu --recv-keys 0x518A031D

Em caso de erro ‘gpg: keyserver receive failed: No dirmngr’:

$ sudo apt-get install dirmngr

d) Certifique-se de que a chave correta foi importada:

gpg: key 6DF634AA7608AF04: public key "Decred Release <release@decred.org>" imported

e) Verifique a assinatura digital:

$ gpg --verify manifest-decrediton-$VERSION.txt.asc

gpg: assuming signed data in 'manifest-decrediton-v1.1.3.txt'
gpg: Signature made Thu Dec 21 17:15:58 2017 WET
gpg:                using RSA key 6D897EDF518A031D
gpg: Good signature from "Decred Release <release@decred.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: FD13 B683 5E24 8FAF 4BD1  838D 6DF6 34AA 7608 AF04
     Subkey fingerprint: F516 ADB7 A069 852C 7C28  A02D 6D89 7EDF 518A 031D

f) Procure no retorno do gpg por: “using RSA key 6D897EDF518A031D” (apenas na primeira verificação após importar a chave). Repare que a segunda metade do ID da RSA key está na etapa c) e no texto ‘Good signature from “Decred Release ”’

g) Para verificar o hash e comparar manualmente com o conteúdo de manifest-decrediton-$VERSION.txt:

$ sha256sum decrediton-$VERSION.tar.gz

h) Não é necessário instalar. Descompacte; entre no diretório; execute:

$ tar -xvzf decrediton-$VERSION.tar.gz
$ cd decrediton-$VERSION
$ ./decrediton

Sobre o warning no output do GPG: Veja sobre o Web of Trust na seção 4.1.

Referência: https://docs.decred.org/advanced/verifying-binaries/

Obs.: Se você não tem o gpg, acesse: https://gpgtools.org/

4.4. No Windows

a) Acesse https://github.com/decred/decred-binaries/releases/

b) Baixe para a mesma pasta os arquivos decrediton-$VERSION.exe, manifest-decrediton-$VERSION.txt e manifest-decrediton-$VERSION.txt.asc

c) Caso a chave ainda não tenha sido importada (erro: ‘gpg: Can’t check signature: No public key’): importe a chave pública dos desenvolvedores (o GPG tentará sair pela porta TCP/11371):

> gpg --keyserver pgp.mit.edu --recv-keys 0x518A031D

d) Certifique-se de que a chave correta foi importada:

gpg: key 6DF634AA7608AF04: public key "Decred Release <release@decred.org>" imported

e) Verifique a assinatura digital:

> gpg --verify manifest-decrediton-$VERSION.txt.asc

gpg: assuming signed data in 'manifest-decrediton-v1.1.3.txt'
gpg: Signature made Thu Dec 21 17:15:58 2017 WET
gpg:                using RSA key 6D897EDF518A031D
gpg: Good signature from "Decred Release <release@decred.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: FD13 B683 5E24 8FAF 4BD1  838D 6DF6 34AA 7608 AF04
     Subkey fingerprint: F516 ADB7 A069 852C 7C28  A02D 6D89 7EDF 518A 031D

f) Procure no retorno do gpg por: “using RSA key 6D897EDF518A031D” (apenas na primeira verificação após importar a chave). Repare que a segunda metade do ID da RSA key está na etapa c) e no texto ‘Good signature from “Decred Release ”’

g) O Windows não possui uma ferramenta nativa para verificação de hash SHA256. Usuários de Windows podem tentar a ferramenta PowerShell File Checksum Integrity Verifier (PsFCIV) disponível na Microsoft Technet.

Sobre o warning no output do GPG: Veja sobre o Web of Trust na seção 4.1.

Referência: https://docs.decred.org/advanced/verifying-binaries/

Obs.: Se você não tem o gpg, acesse: https://gpgtools.org/