Assinaturas digitais para ficheiros: provar autenticidade e origem
Saiba como as assinaturas digitais verificam a autenticidade dos ficheiros e impedem adulterações. Garanta que o destinatário sabe quem enviou o ficheiro e que não foi alterado.
Uma assinatura digital é uma prova criptográfica de que uma pessoa ou entidade específica criou um ficheiro e que o ficheiro não mudou desde então. Tecnicamente, faz-se o hash do ficheiro com SHA-256, depois "assina-se" o hash com a sua chave privada usando RSA-PSS, ECDSA, ou Ed25519. Qualquer pessoa com a sua chave pública consegue verificar a assinatura — se verificar, sabe que foi o autor do ficheiro e que é byte a byte idêntico ao que assinou. As assinaturas são o que o macOS usa para verificar atualizações de aplicações, o que o Git usa para autoria de commits (git commit -S), e o que o PGP usa para e-mails assinados. Resolvem um problema que a encriptação sozinha não consegue: provar quem enviou o quê.
Assinaturas vs. encriptação: funções diferentes
A encriptação mantém o conteúdo secreto. As assinaturas provam autoria e integridade. São complementares, não alternativas.
- Encriptar apenas: o destinatário conhece o conteúdo mas não sabe quem o enviou. Qualquer pessoa com a chave pública poderia ter encriptado.
- Assinar apenas: o destinatário sabe quem enviou e que não foi adulterado, mas o conteúdo é visível a qualquer pessoa que intercete.
- Assinar e encriptar: autenticidade, integridade, e confidencialidade completas. É o modo padrão do PGP.
Os serviços de transferência de ficheiros focam-se tipicamente na encriptação. As assinaturas entram em jogo em contextos de alta confiança: distribuição de software, documentos legais, contratos, cadeias de evidências forenses.
Como a assinatura funciona na prática
O fluxo canónico de assinatura Ed25519:
- Hash da mensagem:
h = SHA-512(mensagem). - Calcular um nonce determinístico:
r = SHA-512(prefixo_chave_privada || h). - Calcular o ponto de assinatura:
R = r·G(onde G é o ponto base da curva). - Calcular
s = r + SHA-512(R || chave_pública || h)·chave_privada mod ℓ. - A assinatura é
(R, s), 64 bytes no total.
A verificação usa apenas a chave pública, a mensagem, e a assinatura. Se a matemática funcionar, o verificador sabe que a assinatura foi produzida por alguém com a chave privada correspondente.
O RSA-PSS (PKCS#1 v2.2) e o ECDSA funcionam de forma semelhante mas com matemática subjacente diferente. O Ed25519 é preferido em sistemas novos porque é determinístico (sem nonce aleatório por assinatura que possa correr mal) e mais rápido.
Os três algoritmos de assinatura mais comuns
| Algoritmo | Tamanho da chave | Tamanho da assinatura | Velocidade | Notas | |-----------|-----------------|----------------------|------------|-------| | RSA-PSS-2048 | 256 bytes | 256 bytes | ~1000 assina/s | Amplamente suportado, geração de chaves lenta | | ECDSA P-256 | 32 bytes | 64 bytes | ~30 000 assina/s | Curva NIST, necessita RNG seguro por assinatura | | Ed25519 | 32 bytes | 64 bytes | ~50 000 assina/s | Determinístico, padrão moderno |
Os três são aprovados no FIPS 186-5 do NIST (2023). O Ed25519 é a escolha para novos protocolos: WireGuard, SSH (padrão desde o OpenSSH 8.0), Signal, assinatura de commits Git, e assinatura de pacotes Cargo do Rust.
Assinatura de código: um caso de uso de centenas de milhões
A distribuição de software depende de assinaturas. Sem elas, os utilizadores não conseguem distinguir o instalador real de malware:
- Apple Developer ID + Notarização. Todas as aplicações macOS têm de ser assinadas e notarizadas desde o Catalina (2019). Usa RSA-2048 ou ECDSA P-256.
- Microsoft Authenticode. Executáveis Windows assinados com certificados RSA-3072 ou ECDSA P-384.
- Android APK v2/v3. Assinaturas Ed25519 sobre o conteúdo do APK.
- Debian apt, Red Hat dnf, npm, PyPI, Homebrew. Todos usam assinaturas destacadas (tipicamente GPG Ed25519 ou RSA) sobre manifestos de pacotes.
Um incidente famoso: em 2020, a atualização Orion da SolarWinds foi assinada com o certificado legítimo da empresa depois de atacantes comprometerem o sistema de build. A assinatura era válida — apenas provava que o código vinha de uma fonte comprometida. As assinaturas garantem a identidade do signatário, não o julgamento do signatário.
PGP e assinaturas destacadas para ficheiros
O GnuPG (gpg) continua a ser o motor de trabalho para assinaturas de ficheiros fora do PKI corporativo. Uma assinatura destacada mantém o ficheiro inalterado e coloca a assinatura num ficheiro .sig separado:
gpg --detach-sign --armor documento.pdf
# Produz documento.pdf.sig
gpg --verify documento.pdf.sig documento.pdf
# gpg: Boa assinatura de "Alice <alice@exemplo.com>"
A fraqueza do PGP é a distribuição de chaves: como sabe o verificador que a chave de assinatura realmente pertence a Alice? As opções incluem servidores de chaves, teia de confiança, keybase.io, ou verificação fora de banda (impressão digital publicada num cartão de visita).
Alternativas modernas: o Sigstore (usado pelo Kubernetes, npm) faz assinatura sem chave usando tokens de identidade OIDC, com registos de transparência a substituir a teia de confiança. O minisign, de Frank Denis, oferece assinatura Ed25519 simples sem a complexidade do PGP.
Agregação de assinaturas baseada em hash
Para coleções de ficheiros, assinar cada um individualmente é ineficiente. Melhor: fazer hash de cada ficheiro, construir uma árvore de Merkle, assinar a raiz. Vantagens:
- Uma assinatura cobre muitos ficheiros.
- Ficheiros individuais podem ser verificados contra a raiz com hashes irmãos de log(n).
- Usado por registos de transparência de certificados, Git, e cada vez mais por ferramentas de cadeia de fornecimento de software como o in-toto.
Uma versão de 10 000 ficheiros assinada desta forma produz uma assinatura mais um hash raiz de 32 bytes, verificável contra qualquer subconjunto dos ficheiros.
Registo de tempo: provar quando
Uma assinatura prova quem, mas não quando. Um atacante que roube a sua chave privada pode antedatar assinaturas. As Autoridades de Registo de Tempo confiáveis (TSA) resolvem isto ao assinar um timestamp sobre a sua assinatura, ancorando-a a um momento específico.
Padrões:
- RFC 3161 registo de tempo — usado pelo Microsoft Authenticode, assinaturas de PDF do Adobe.
- RFC 5544 (CMS com timestamps).
- Roughtime — um protocolo mais recente da Google para tempo verificado de baixa latência.
A assinatura de documentos legais (DocuSign, Adobe Sign, assinaturas qualificadas eIDAS da UE) depende de timestamps RFC 3161 de autoridades confiáveis para estabelecer quando um contrato foi assinado.
Assinaturas na transferência de ficheiros
A maioria dos serviços de transferência de ficheiros orientados ao consumidor não expõe assinaturas diretamente — a tag de autenticação AES-GCM prova a integridade dentro da transferência, e o TLS prova a identidade do servidor, mas não existe forma integrada de provar a identidade do remetente.
Para transferências de alta confiança, a assinatura ocorre antes do carregamento:
- O remetente assina o ficheiro com Ed25519 ou PGP, produzindo
ficheiro.exteficheiro.ext.sig. - Ambos os ficheiros são carregados para qualquer serviço de transferência (HexaTransfer, SwissTransfer, WeTransfer).
- O destinatário descarrega ambos, verifica a assinatura com a chave pública do remetente.
Isto desacopla a autenticidade do mecanismo de transferência — o serviço de transferência poderia ser comprometido sem quebrar a validade da assinatura, desde que a chave privada do remetente permaneça secreta e o destinatário tenha a chave pública correta.
Assinaturas qualificadas eIDAS da UE
O Regulamento eIDAS da União Europeia (UE 910/2014, revisto em 2024 como eIDAS 2.0) define três níveis de assinatura:
- Assinatura eletrónica — básica, inclui assinaturas manuscritas digitalizadas.
- Assinatura eletrónica avançada (AES/AdES) — ligada ao signatário, deteta adulteração. As assinaturas PGP qualificam.
- Assinatura eletrónica qualificada (QES) — AdES mais um certificado qualificado de um Prestador de Serviços de Confiança, guardado num Dispositivo Qualificado de Criação de Assinaturas (cartão inteligente ou HSM).
A QES tem o mesmo peso legal que uma assinatura manuscrita em todos os Estados-Membros da UE. Os fornecedores incluem DocuSign EU, Adobe Sign EU, Namirial, e DTrust. Os equivalentes norte-americanos sob a Lei ESIGN e a UETA são menos formalmente estratificados mas funcionalmente comparáveis.
Quando as assinaturas são excessivas
Nem todos os ficheiros precisam de uma assinatura. Dispense-a quando:
- O destinatário confia no canal de transferência ponta a ponta (Signal, USB pessoal).
- O conteúdo não é crítico para a segurança (fotografias de reuniões, receitas, rascunhos).
- A integridade sozinha é suficiente e é fornecida pelo AES-GCM ou TLS.
Adicione assinaturas quando:
- O peso legal ou contratual é importante (contratos, provas forenses, registos médicos).
- A confiança na cadeia de fornecimento está em jogo (lançamentos de software, atualizações de firmware).
- O ficheiro será reencaminhado através de intermediários não confiáveis.
- Precisa de uma trilha de auditoria durável que sobreviva à transferência original.
Colocar em prática
Para um fluxo de trabalho simples: gere uma chave Ed25519 com ssh-keygen -t ed25519 -f ~/.ssh/chave_assinatura, assine um ficheiro com openssl pkeyutl -sign -inkey chave_assinatura -in ficheiro -out ficheiro.sig, partilhe a sua chave pública fora de banda, e envie o ficheiro via qualquer serviço de transferência seguro. Os destinatários verificam com openssl pkeyutl -verify.
Experimente em hexatransfer.com — gratuito, sem conta, até 10 GB.
Envie arquivos grandes com segurança e criptografia de ponta a ponta
Transfira arquivos de até 10 GB gratuitamente com criptografia de ponta a ponta. Sem necessidade de conta. Seus arquivos são criptografados no navegador antes do envio — ninguém mais pode lê-los.
Enviar um arquivo