Como uma assinatura digital prova quem assinou
Spec: RFC 5652RFC 5652Spec: RFC 5280, §6RFC 5280 §6Spec: RFC 3161, §1RFC 3161 §1
Visão geral
Seção intitulada “Visão geral”Uma assinatura digital faz três coisas, e vale a pena mantê-las separadas desde o início: ela prova que os bytes não foram alterados, prova quem os assinou e — com um pouco de ajuda — prova quando. Esta página constrói essa ideia do nada, para que a criptografia deixe de ser uma caixa-preta.
Por que isso importa
Seção intitulada “Por que isso importa”“Assinado” é uma palavra sobre a qual as pessoas apoiam decisões. Um contrato, uma fatura, uma nota de versão para um software que alguém vai executar. Se você só sabe que uma ferramenta exibiu uma marca de seleção verde, você na verdade não sabe o que foi provado. Você pode ter prova de que os bytes estão íntegros, mas nenhuma ideia de qual chave os assinou. Você pode ter um signatário real, mas um certificado que expirou anos atrás. Entender as peças é o que permite dizer, com precisão, o que uma assinatura válida significa — e, tão útil quanto, o que ela não significa.
A versão resumida
Seção intitulada “A versão resumida”Imagine um envelope à prova de violação com um selo pessoal pressionado na aba.
- O selo é único de uma pessoa e efetivamente impossível de falsificar. Qualquer um pode reconhecê-lo; só seu dono pode fazê-lo. Esse é o par de chaves: uma chave privada que só você detém e uma chave pública que todos podem ver.
- Você não pressiona o selo sobre o documento inteiro. Você o pressiona sobre um resumo minúsculo e infalsificável dele — um hash. Mude um byte do documento e o resumo muda completamente, de modo que o selo não encaixa mais.
- Assinar é produzir uma assinatura sobre o documento com sua chave privada — sobre o hash para RSA e ECDSA, ou sobre o próprio conteúdo para EdDSA, que faz seu próprio hashing internamente. Verificar é executar a conferência do algoritmo com sua chave pública, a assinatura e o mesmo conteúdo (como um hash ou diretamente) — ela retorna válido ou inválido. É a matemática, não a confiança, que vincula os dois.
- Um certificado é a parte que diz de quem é este selo. Sem ele, você provou que uma chave assinou os bytes, mas não que a chave pertence a alguém em particular.
- Um carimbo de tempo é a parte que diz quando. O próprio relógio de um signatário é apenas uma alegação; o tempo confiável vem de uma autoridade externa.
Como o NextPDF aborda isso
Seção intitulada “Como o NextPDF aborda isso”Comece pelo hash, porque tudo o mais se apoia nele. Uma função de hash criptográfico lê qualquer quantidade de dados e produz uma impressão digital curta e de tamanho fixo — para uma assinatura de PDF, tipicamente um valor de 256 bits. Duas propriedades a tornam útil: a mesma entrada sempre produz a mesma impressão digital, e é inviável encontrar uma entrada diferente com a mesma. Então um hash é um substituto fiel do documento. Se dois hashes coincidem, os bytes coincidem.
Agora o par de chaves. Uma chave privada e uma chave pública estão matematicamente ligadas, mas você não pode derivar uma da outra em qualquer quantidade prática de tempo. Só a chave privada pode produzir uma assinatura válida, e só a chave pública correspondente pode conferi-la. A assinatura usa essa assimetria: o signatário aplica uma operação de chave privada à entrada que o algoritmo escolhido define — o hash do conteúdo para RSA e ECDSA, ou o conteúdo diretamente para EdDSA, que faz o hash internamente. O resultado é o valor da assinatura. Como só o detentor da chave privada poderia tê-lo produzido, e como ele está vinculado a este conteúdo, ele prova duas coisas de uma vez — o detentor assinou, e os bytes não se moveram desde então.
A verificação espelha essa lógica. O verificador reconstrói a mesma entrada — fazendo o hash do documento para RSA e ECDSA, ou tomando o conteúdo diretamente para EdDSA — e então executa a operação de verificação do algoritmo de assinatura sobre a chave pública, o valor da assinatura e essa entrada. A operação retorna válido ou inválido — e este é o mesmo formato quer o algoritmo seja RSA, ECDSA ou EdDSA, embora apenas o RSA possa ser retratado como literalmente “recuperando” o hash. Válido significa íntegro e autêntico. Inválido significa que algo mudou, ou que a chave errada foi usada, e a resposta honesta é inválido.
- Prepare the inputRSA and ECDSA hash the document to a short, fixed-length fingerprint; EdDSA signs the content directly and hashes it internally. Either way, any change to the bytes changes what is signed.
- Sign with the private keyThe signer applies a private-key operation to that input — the hash for RSA and ECDSA, the content for EdDSA. The output is the signature value; only the private-key holder could have produced it.
- Reconstruct the inputThe verifier independently rebuilds the same input from the content — a recomputed hash for RSA and ECDSA, the content itself for EdDSA. This is what the verify operation checks against.
- Verify with the public keyThe verifier runs the algorithm's verify operation on the public key, the signature value, and that input. The same shape works for RSA, ECDSA, and EdDSA.
- Accept or rejectThe verify operation returns valid or invalid. Valid means the bytes are intact and the private-key holder signed them. Otherwise the result is invalid — no guessing.
Em um PDF real, o NextPDF não pressiona o selo sobre a página visível — ele o pressiona sobre um intervalo declarado de bytes, e empacota a assinatura como um objeto CMS destacado (Spec: RFC 5652RFC 5652) colocado dentro do arquivo (Spec: ISO 32000-2, §12.8ISO 32000-2 §12.8). Um refinamento importa: o signatário não assina o hash do conteúdo bruto diretamente. Ele assina um pequeno conjunto de atributos assinados que incluem o hash do conteúdo, de modo que o horário, o tipo de conteúdo e o identificador do certificado do signatário são todos selados juntos. Onde esses bytes ficam, e por que o intervalo tem a forma que tem, é o tema de Como as assinaturas ficam em um PDF.
Até aqui, a matemática prova que uma chave assinou estes bytes. Ela não diz nada sobre de quem é a chave. É exatamente essa lacuna que um certificado preenche. Um certificado é, ele próprio, uma declaração assinada — de uma autoridade certificadora — de que esta chave pública pertence a este sujeito nomeado. Confiar nele significa seguir a cadeia do certificado do signatário até uma autoridade em que você decidiu confiar, conferindo a validade de cada elo ao longo do caminho (Spec: RFC 5280, §6RFC 5280 §6). Sem essa cadeia, “assinado” é anônimo. Com ela, “assinado” tem um nome.
A última peça é quando. Uma assinatura pode incorporar o próprio horário alegado pelo signatário, mas um relógio que você não controla é uma alegação, não uma prova. Um carimbo de tempo de uma Autoridade de Carimbo de Tempo vincula um hash da assinatura a um instante, atestado por uma parte sem interesse no documento (Spec: RFC 3161, §1RFC 3161 §1). É isso que permite que uma assinatura permaneça significativa depois que o certificado do signatário expira: você pode mostrar que a assinatura existia enquanto o certificado ainda era válido. O tratamento mais aprofundado está em Carimbos de tempo e tempo confiável.
Exemplo prático
Seção intitulada “Exemplo prático”Os formatos abaixo são as operações conceituais, escritas com clareza. O ponto não é uma chamada de API — é ver que assinar e verificar são imagens espelhadas, e que um byte adulterado quebra a correspondência por construção.
<?php
declare(strict_types=1);
// SIGN — the holder of the private key seals the content.// RSA and ECDSA sign a hash; EdDSA signs the content directly (hashing inside).$signingInput = sign_input($content); // a digest for RSA/ECDSA, the content for EdDSA$signatureValue = private_key_transform( // only the key holder can do this privateKey: $signerPrivateKey, input: $signingInput,);
// VERIFY — anyone with the public key runs the algorithm's check.$recomputedInput = sign_input($content); // verifier rebuilds the same input$intactAndAuthentic = signature_verify( // RSA, ECDSA, EdDSA — same shape publicKey: $signerPublicKey, // taken from the certificate signatureValue: $signatureValue, input: $recomputedInput, // the freshly reconstructed input);// true -> bytes unchanged AND signed by the private-key holder// false -> a byte changed, or the wrong key — the honest answer is "invalid"
// The certificate answers a SEPARATE question: whose public key is this?// The timestamp answers ANOTHER: when did this signature exist?// "intact + authentic" alone proves neither identity nor time.Forjar uma mudança que ainda assim verifique é computacionalmente inviável. O hash carrega o conteúdo fielmente, então alterar o conteúdo altera o hash, e a operação de verificação o rejeita — exceto por encontrar uma colisão de hash, que a função escolhida é projetada para tornar impraticável.
Equívoco comum
Seção intitulada “Equívoco comum”O erro frequente é ler “assinatura válida” como “documento confiável”. Não são a mesma frase. A criptografia prova que os bytes estão íntegros e que o detentor da chave privada os assinou — nada mais. Um documento assinado com uma chave da qual você nunca ouviu falar, atestada por nenhuma autoridade que você reconhece, pode ser impecavelmente “válido” e não valer nada. A identidade vem do certificado e de sua cadeia; o tempo vem de um carimbo de tempo confiável. Uma marca de seleção verde que silenciosamente dobra tudo isso em um único booleano decidiu, em seu nome, quais perguntas importavam. Conhecer as peças é o que permite fazer as demais.
Limites e fronteiras
Seção intitulada “Limites e fronteiras”Esta página explica a ideia de uma assinatura digital, não o procedimento de validação completo. A matemática aqui prova integridade e autenticidade. Ela não, por si só, diz a você se o certificado de assinatura foi emitido para quem você pensa, se ele era válido no momento da assinatura, ou se foi posteriormente revogado — essas são questões de caminho de certificação e de revogação, e uma validação correta executa todas elas. O conjunto completo de verificações está em Validando uma assinatura corretamente.
O NextPDF constrói a estrutura da assinatura e executa as verificações criptográficas. Ele não escolhe suas âncoras de confiança, não responde por nenhuma autoridade certificadora, nem decide o efeito jurídico de uma assinatura — esses dependem da sua implantação, do certificado e da jurisdição. O motor prova o mecanismo; as decisões de confiança sobre ele são suas.
O que o motor entrega, por nível, se constrói para fora a partir desta fundação:
| Edition | Availability |
|---|---|
| Core | PAdES B-B: o mecanismo de hash-e-assina descrito aqui, empacotado como um objeto CMS SignedData destacado, mais a validação de caminho de certificação contra uma âncora de confiança que você fornece. |
| Pro | Acrescenta PAdES B-T — um carimbo de tempo confiável RFC 3161 verificado sobre o valor da assinatura, de modo que o “quando” seja atestado em vez de autoalegado. |
| Enterprise | Acrescenta os perfis de longo prazo (B-LT, B-LTA): material de validação incorporado e carimbos de tempo de documento que mantêm as provas de identidade e tempo respondíveis por anos. |
Documentos relacionados
Seção intitulada “Documentos relacionados”- Como as assinaturas ficam em um PDF — onde o valor da assinatura e seu intervalo de bytes realmente ficam no arquivo.
- Validando uma assinatura corretamente — o conjunto completo de verificações que um verificador deve executar, além da matemática desta página.
- Carimbos de tempo e tempo confiável — o que um carimbo de tempo RFC 3161 prova, e por que o próprio relógio de um signatário não é isso.
- Perfis baseline do PAdES — qual perfil sobrepõe identidade, tempo e material de longo prazo a esta fundação.
Glossário
Seção intitulada “Glossário”- Hash (digest) — uma impressão digital curta e de tamanho fixo dos dados, produzida por uma função de hash criptográfico; qualquer mudança nos dados a muda completamente.
- Par de chaves — uma chave privada ligada (detida apenas pelo signatário) e uma chave pública (compartilhada livremente); só a chave privada pode assinar, e só a chave pública correspondente pode verificar.
- Assinar — aplicar a operação de chave privada à entrada que o algoritmo define: um hash do conteúdo para RSA e ECDSA, ou o conteúdo diretamente para EdDSA (que faz o hash internamente). Em um PDF, esse conteúdo são os atributos assinados, que incluem o hash do documento. O resultado é o valor da assinatura.
- Verificar — reconstruir a mesma entrada (um hash recomputado, ou o conteúdo diretamente para EdDSA), e então executar a operação de verificação do algoritmo sobre a chave pública, o valor da assinatura e essa entrada para obter uma resposta válido-ou-inválido.
- Valor da assinatura — os bytes que a operação de chave privada produz; o que um verificador confere contra a entrada do algoritmo recém-reconstruída (um digest para RSA e ECDSA, o próprio conteúdo para EdDSA).
- Certificado — uma declaração assinada que vincula uma chave pública a uma identidade nomeada; confiável ao encadear até uma autoridade que você aceita (RFC 5280 §6).
- Âncora de confiança — uma autoridade certificadora em que você decidiu confiar; a raiz de uma cadeia de certificados aceitável.
- Carimbo de tempo (RFC 3161) — um token assinado de uma Autoridade de Carimbo de Tempo que vincula um hash a um valor de tempo, fornecendo prova confiável de quando.
- CMS SignedData — a estrutura Cryptographic Message Syntax (RFC 5652) que carrega o valor da assinatura e o certificado do signatário.
- PAdES — PDF Advanced Electronic Signatures: a família de perfis da ETSI para assinatura de PDF. Abordada em profundidade nas páginas de assinatura.