Verificação de assinaturas digitais

5 minutos de leitura

Não 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.

Veja aqui uma breve noção de criptografia com os diagramas que exemplificam o processo.

Traduzindo: Caso o hacker altere o arquivo, seu hash será diferente do hash original; se for igual (caso o hacker também tenha alterado o hash, pois os dois podem estar armazenados no mesmo local), a assinatura do hash será inválida porque este foi digitalmente assinado com uma chave privada que o hacker não possui. O hacker precisaria então alterar a chave pública no servidor de chaves PGP. E ainda assim, só funcionaria para aqueles que importarem a chave pública depois de ser alterada pelo hacker.

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. Processo de assinatura

O processo de assinatura pode ser feito com o intermédio ou não de um manifest. O manifest é um arquivo que registra os hashes de vários arquivos para os quais se deseja garantir integridade e autenticidade. Com o uso do manifest não é necessário ‘assinar’ cada arquivo. Armazena-se os hashes dos arquivos no manifest e o manifest será o único arquivo digitalmente assinado. A assinatura do manifest fica guardada em outro arquivo, que geralmente possui a extensão .asc ou .sign.

Exemplo de manifest.txt:

f19efd3bc998ad847e206e3eaf393182d2edc458a7329fafb3cd8d9b2cd7ab56  package-linux-386-v1.0.tar.gz
36375985df1ba9a45bc11b4f6cdaed4f14ff6e5e9c46e17ef6e4f70a3349aba2  package-linux-amd64-v1.0.tar.gz
683b80286f50bb2fb77d4d10ac43c736435264958f02f8ae3cbf1fdae31279ba  package-windows-386-v1.0.tar.gz
964db2509dd9bb570f6e7b5e99dc81a7680fc98e1a9fcda8c17b63147648ca88  package-windows-amd64-v1.0.tar.gz

Exemplo de manifest.txt.asc:

-----BEGIN PGP SIGNATURE-----

iQIcBAABAgAGBQJcWcxoAAoJEG2Jft9RigMd7MQP/Atp002t+5iwtDVtC0rcO7Qc
elgFzpl/Jkjj/I0RTXDrubUEbFuyyvKXWoGYwqF2LBXqJimBjVPXqpm2p2cOMcWr
wVPtgGLt6cMOD8hP1FHGdj9jSFbqR1fWUR/tQPHZhMuBWh6ic6gndJVsWOkWf2rY
yYv2SbE3JMOT98aNBJKI8m+mYBzPtUednJG0MEt0MeWO33rIMyhjhhQHc5v8N2YL
4WsLM5MwjDiGrEtSrD2raVvcKh0VHDsMKJSaOLV+GESpZHewx91qCJe+VlRBLnyj
SJ5MusUJyEKjjVv9vre1g8ESMjnRV6sV8cQqjWKenpso69ZYSoewuEiiRgos9oFn
xtVGCEqDx/nZPwa4XKaJQWE7aVLeK+bklvFfmAcNkV3/Gs9+6jAvJUtX1IvmFBpH
jLIAAysrhECylyXBURPblL+IZkg2E3eM5wnWUhkNKw+D34ICBN90Lo7g/nEpJnHZ
bBNcIzxYeCJB2bLKXmSTrgUaNrEK+YSBSEg+t0NyuFlKsnKgY/1ZEdxFe2cF/uGs
yI0zhvSuSfhuzz4MJLV9f+qjlCOhiWgknN1C9gDixaKJHScspP4D/6LjNlIjw1zF
YYOtxBM5TK3N5wu+5OJjcxAEnlskxMlQnqhB+8RnLW25NIwVimgWXEqvqojVaOht
2Rlp+5ToMS7wAT4PE3/w
=P8Iv
-----END PGP SIGNATURE-----

2.2.1. Com manifest (indireto)

a) É gerado um hash (digest) do arquivo (GZIP, no diagrama)

b) O hash é armazenado em um arquivo de texto manifest.txt, que contém o nome de cada arquivo e o hash correspondente

c) O manifest manifest.txt é assinado com a chave privada de quem está publicando o arquivo. Isso significa que o processo gera um hash para o arquivo do manifest, e esse hash será criptografado com a chave privada do publicador e armazenado em outro arquivo, manifest.txt.asc. No final do processo temos o arquivo package.tar.gz, o manifest manifest.txt e a assinatura do manifest manifest.txt.asc.

Figura 3 - Processo de assinatura digital com manifest
Figura 3 - Processo de assinatura digital com manifest

2.2.2. Sem manifest (direto)

a) O arquivo package.tar.gz (GZIP, no diagrama) é assinado (criptografado) com a chave privada de quem está publicando o arquivo. Isso significa que o processo gera um hash para o arquivo a ser assinado, e esse hash será criptografado com a chave privada do publicador e armazenado em outro arquivo package.tar.gz.asc.

b) O arquivo e a assinatura correspondente (geralmente um arquivo com o mesmo nome que tem uma extensão a mais, como package.tar.gz e package.tar.gz.asc ou package.dmg e package.dmg.sign) estão prontos para uso

Figura 4 - Processo de assinatura digital sem manifest
Figura 4 - Processo de assinatura digital sem manifest

2.3. Verificação da assinatura

2.3.1. Com manifest (indireto)

a) O processo de verificação gera um hash do manifest manifest.txt.

b) O hash assinado (criptografado) do manifest manifest.txt.asc é 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.

c) O usuário gera um hash do arquivo package.tar.gz (GZIP, no diagrama) e compara com o hash armazenado dentro do manifest manifest.txt. Se os hashes são iguais, o arquivo não foi modificado de forma não autorizada.

Figura 5 - Processo de verificação de assinatura digital com manifest
Figura 5 - Processo de verificação de assinatura digital com manifest

2.3.2. Sem manifest (direto)

a) O processo de verificação gera um hash do arquivo package.tar.gz (GZIP, no diagrama) 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.

Figura 6 - Processo de verificação de assinatura digital sem manifest
Figura 6 - Processo de verificação de assinatura digital sem manifest

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

Não 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.

Saiba mais sobre as etapas do processo de verificação de assinaturas para:

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.

Veja aqui os scripts Decred Verifier, Electrum Verifier e Debian Verifier. São scripts escritos em shell e Python que automatizam o processo de verificação de assinatura digital.

Saiba mais sobre essa verificação nas atualizações do macOS ou Linux: