Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

04 - Assinatura Digital

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Assinatura Digital (Visão Técnica)

A assinatura digital é um método de autenticação de informação digital que atua como substituto eletrônico para a assinatura física em papel. No contexto da criptografia e chaves, sua função primordial é fornecer uma "fé pública" eletrônica, provando de forma inegável que uma mensagem ou documento realmente se originou do emissor declarado.

1. Propriedades Criptográficas

Para que uma assinatura digital cumpra seu papel, ela deve garantir:

  • Autenticidade: O receptor deve ter meios de confirmar que a assinatura foi realizada pelo emissor.
  • Integridade: Qualquer alteração no conteúdo da mensagem, por menor que seja, invalida a assinatura.
  • Irretratabilidade (Não-repúdio): O emissor não pode negar a autoria ou autenticidade da mensagem enviada.

Tecnicamente, o processo baseia-se na criptografia assimétrica e em funções de hash. O emissor usa sua chave privada para assinar, e o destinatário usa a chave pública correspondente para verificar. A assinatura digital não garante confidencialidade — para ocultar o conteúdo é necessário combinar com um esquema de cifragem (envelope digital híbrido).

2. Algoritmos de Assinatura Modernos

2.1 RSA-PSS (Probabilistic Signature Scheme)

O esquema RSA-PSS (RFC 8017, PKCS#1 v2.2) substituiu o legado PKCS#1 v1.5 em novas aplicações por sua prova de segurança formal no modelo ROM (Random Oracle Model). Utiliza padding probabilístico com sal aleatório, o que impede ataques de substituição.

Tamanho do digest EM = modBits - 1 bits
EM = 0x01 || PS || 0x01 || salt || H(M')
Assinatura S = RSA_encrypt(Kpriv, EM)

Tamanho mínimo recomendado pela NIST SP 800-131A: 2048 bits até 2030; 3072 bits para uso de longo prazo.

2.2 ECDSA (Elliptic Curve Digital Signature Algorithm)

Definido na FIPS 186-4/5, usa curvas elípticas NIST P-256, P-384, P-521 ou Brainpool. A assinatura é composta pelo par (r, s):

k  = nonce aleatório (crítico: deve ser único e secreto)
(x, y) = k * G    (G = ponto gerador da curva)
r  = x mod n
s  = k^(-1) * (H(m) + r * d) mod n    (d = chave privada)

ECDSA exige um nonce k perfeitamente aleatório. Se k for reutilizado ou previsível (como no caso da Sony PlayStation 3), a chave privada pode ser recuperada trivialmente. Por isso, RFC 6979 padroniza nonces determinísticos derivados da chave.

2.3 Ed25519 (EdDSA)

Definido na RFC 8032, baseia-se na curva de Edwards torcida Curve25519. É rápido, determinístico (imune a problemas de nonce) e resistente a canais laterais por construção. Tamanho da assinatura: 64 bytes; chave pública: 32 bytes. É o padrão default no OpenSSH 8.7+ e no Git 2.34+ para assinatura de commits.

Comparação de Algoritmos

Algoritmo Tamanho Chave Tamanho Assinatura Velocidade Pós-Quântico
RSA-2048 256 bytes 256 bytes Lento Não
RSA-PSS-3072 384 bytes 384 bytes Muito lento Não
ECDSA P-256 32 bytes 64 bytes Rápido Não
Ed25519 32 bytes 64 bytes Muito rápido Não
ML-DSA (Dilithium2) 1312 bytes 2420 bytes Rápido Sim
SLH-DSA (SPHINCS+) 32 bytes 7856 bytes Lento Sim

3. Formatos de Assinatura e Padrões

3.1 X.509

Padrão ITU-T para certificados de chave pública. Define a estrutura ASN.1 do certificado (chave pública + identidade do titular + assinatura da CA). Usado em TLS, IPsec, S/MIME. Versão 3 é a atual, com extensões para Key Usage, Subject Alternative Name (SAN) e CRL Distribution Points.

3.2 PKCS#7 / CMS

Padrão RSA Labs (RFC 5652) para mensagens criptográficas. Permite envolver múltiplas assinaturas, certificados e listas CRLs em uma única estrutura. Base para PAdES, CAdES e S/MIME.

3.3 PGP / OpenPGP

Formato descentralizado definido na RFC 4880 (e rascunhos posteriores). Em vez de uma CA central, usa uma Web of Trust (rede de confiança), na qual cada usuário assina a chave de outros. Implementações: GnuPG, Sequoia, RNP. Formato de pacote binário autossuficiente com chaves públicas e privadas, assinaturas e mensagens.

4. Aplicações Práticas

4.1 Certificados Digitais (TLS/X.509)

Cada site HTTPS possui um certificado X.509 assinado por uma CA (Let's Encrypt, DigiCert, Sectigo). O navegador valida a assinatura da CA, garantindo que a chave pública do site pertence ao titular declarado. Em TLS 1.3, assinaturas são usadas no handshake (CertificateVerify) com algoritmos como ecdsa_secp256r1_sha256, rsa_pss_rsae_sha256 e ed25519.

4.2 Code Signing

Binários de software são assinados com certificados EV (Extended Validation) ou OV (Organization Validation) emitidos por CAs como DigiCert, Sectigo, Microsoft. Mecanismos:

  • Authenticode (Windows): assinaturas em PE/MSI via signtool.exe.
  • macOS Code Signing: via codesign com certificado Apple Developer ID.
  • Android APK Signature: esquema v2/v3 (APK Signature Scheme).
  • Reproducible Builds: assinaturas detached em binários reproduzíveis (Debian, F-Droid).

4.3 Email Seguro

  • S/MIME (Secure/MIME, RFC 8551): usa certificados X.509 emitidos por CAs. Cada destinatário deve ter um certificado válido. Implementado no Outlook, Thunderbird, Apple Mail.
  • PGP/MIME (RFC 3156): baseado em OpenPGP. Mais flexível, não requer CA. Cliente típico: Thunderbird + Enigmail, GPGMail, Mailvelope.

5. Exemplo Prático: Assinatura Ed25519 com Python

from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives import serialization

# Gerar chave privada
priv = Ed25519PrivateKey.generate()
pub  = priv.public_key()

# Serializar (PEM)
priv_pem = priv.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

# Assinar mensagem
mensagem = b"Contrato de prestacao de servicos v1.0"
assinatura = priv.sign(mensagem)   # 64 bytes

# Verificar
try:
    pub.verify(assinatura, mensagem)
    print("Assinatura valida")
except Exception:
    print("Assinatura invalida")

6. Exemplo: Verificação de Certificado X.509

# Decodificar certificado
openssl x509 -in cert.pem -text -noout

# Verificar cadeia até a CA raiz
openssl verify -CAfile ca-bundle.crt cert.pem
# cert.pem: OK

# Extrair chave pública
openssl x509 -in cert.pem -pubkey -noout > pub.pem

7. HSM e Proteção de Chaves

A segurança da assinatura depende fundamentalmente do sigilo da chave privada. Em ambientes corporativos e governamentais, essa chave nunca sai de um HSM (Hardware Security Module) certificado FIPS 140-2/3 Level 3 ou superior. A assinatura é executada dentro do HSM via API PKCS#11 ou interface vendor-specific. Exemplos comerciais: Thales Luna, Utimaco SecurityServer, AWS CloudHSM, YubiHSM2.

8. Ataques e Considerações

  • Comprometimento de CA: Em 2011, DigiNotar foi comprometida e emitiu certificados fraudulentos para Gmail. Resultado: bancarrota e expurgo da CA dos navegadores.
  • Hash Fraco (SHA-1): Em 2017, Google e CWI demonstraram colisão prática (SHAttered). Certificados SHA-1 foram descontinuados em 2017.
  • Reuso de Nonce em ECDSA: Caso Sony PS3 (2010) — nonce fixo permitiu extrair a chave privada da Sony.
  • Avanço Quântico: NIST padronizou ML-DSA (FIPS 204) em 2024 como substituto pós-quântico. Migração híbrida (clássico + PQ) já é recomendada para documentos com vida útil > 10 anos.

9. Resumo Técnico

Atributo Detalhe
Algoritmos clássicos RSA-PSS, ECDSA, Ed25519
Algoritmos pós-quânticos ML-DSA (Dilithium), SLH-DSA (SPHINCS+), Falcon
Padrões de formato X.509, PKCS#7/CMS, OpenPGP, CAdES, PAdES, XAdES
Aplicações TLS, code signing, S/MIME, PGP, e-CPF, e-CNPJ
Proteção de chave privada HSM FIPS 140-2 L3+
Tamanho típico de assinatura 64 bytes (Ed25519) a 384 bytes (RSA-3072)

10. Conclusão

A assinatura digital é uma tecnologia madura e fundamental para a segurança digital moderna. Sua correta implementação exige escolher algoritmos adequados (preferencialmente Ed25519 ou RSA-PSS para novos projetos), proteger a chave privada em HSMs e adotar padrões como X.509 e OpenPGP para interoperabilidade. Com a chegada da computação quântica, arquiteturas híbridas que combinam algoritmos clássicos e pós-quânticos são o caminho para sistemas com vida útil longa.