Come una firma digitale prova chi ha firmato
Spec: RFC 5652RFC 5652Spec: RFC 5280, §6RFC 5280 §6Spec: RFC 3161, §1RFC 3161 §1
In breve
Sezione intitolata “In breve”Una firma digitale fa tre cose, e conviene tenerle distinte fin dall’inizio: prova che i byte non sono stati modificati, prova chi li ha firmati e — con un piccolo aiuto — prova quando. Questa pagina costruisce quell’idea da zero, così che la crittografia smetta di essere una scatola nera.
Perché è importante
Sezione intitolata “Perché è importante”«Firmato» è una parola su cui le persone fondano decisioni. Un contratto, una fattura, una nota di rilascio per un software che qualcuno eseguirà. Se sai soltanto che uno strumento ha stampato un segno di spunta verde, in realtà non sai cosa sia stato provato. Potresti avere la prova che i byte sono intatti ma nessuna idea di quale chiave li abbia firmati. Potresti avere un firmatario reale ma un certificato scaduto anni fa. Comprendere i pezzi è ciò che ti consente di dire, con precisione, cosa significhi una firma valida — e, altrettanto utilmente, cosa non significhi.
La versione breve
Sezione intitolata “La versione breve”Immagina una busta a prova di manomissione con un sigillo personale impresso sul lembo.
- Il sigillo è unico per una sola persona ed è di fatto impossibile da falsificare. Chiunque può riconoscerlo; solo il suo proprietario può crearlo. È la coppia di chiavi: una chiave privata che detieni solo tu, e una chiave pubblica che tutti possono vedere.
- Non imprimi il sigillo sull’intero documento. Lo imprimi su un minuscolo e non falsificabile riassunto di esso — un hash. Cambia un solo byte del documento e il riassunto cambia completamente, così che il sigillo non combaci più.
- Firmare è produrre una firma sul documento con la tua chiave privata — sull’hash per RSA ed ECDSA, oppure sul contenuto stesso per EdDSA, che esegue il proprio hashing all’interno. Verificare è eseguire il controllo dell’algoritmo con la tua chiave pubblica, la firma e lo stesso contenuto (come hash, o direttamente) — restituisce valido o non valido. È la matematica, non la fiducia, a collegare i due.
- Un certificato è la parte che dice di chi è questo sigillo. Senza di esso, hai provato che una chiave ha firmato i byte, ma non che la chiave appartenga a qualcuno in particolare.
- Una marca temporale è la parte che dice quando. L’orologio del firmatario è soltanto un’affermazione; il tempo attendibile proviene da un’autorità esterna.
Come NextPDF lo affronta
Sezione intitolata “Come NextPDF lo affronta”Parti dall’hash, perché tutto il resto vi si regge sopra. Una funzione di hash crittografica legge una quantità qualsiasi di dati e produce un’impronta breve e di lunghezza fissa — per una firma PDF, tipicamente un valore a 256 bit. Due proprietà la rendono utile: lo stesso input produce sempre la stessa impronta, ed è impraticabile trovare un input diverso con la stessa. Quindi un hash è un sostituto fedele del documento. Se due hash combaciano, i byte combaciano.
Ora la coppia di chiavi. Una chiave privata e una chiave pubblica sono collegate matematicamente, ma non puoi derivare l’una dall’altra in alcun tempo pratico. Solo la chiave privata può produrre una firma valida, e solo la corrispondente chiave pubblica può controllarla. La firma sfrutta quell’asimmetria: il firmatario applica un’operazione con chiave privata all’input definito dall’algoritmo scelto — l’hash del contenuto per RSA ed ECDSA, oppure il contenuto direttamente per EdDSA, che esegue l’hashing internamente. Il risultato è il valore della firma. Poiché solo il detentore della chiave privata avrebbe potuto produrlo, e poiché è legato a questo contenuto, prova due cose contemporaneamente — che il detentore ha firmato, e che i byte non si sono mossi da allora.
La verifica rispecchia quella logica. Il verificatore ricostruisce lo stesso input — calcolando l’hash del documento per RSA ed ECDSA, oppure prendendo il contenuto direttamente per EdDSA — quindi esegue l’operazione di verifica dell’algoritmo di firma sulla chiave pubblica, sul valore della firma e su quel input. L’operazione restituisce valido o non valido — ed è la stessa forma sia che l’algoritmo sia RSA, ECDSA o EdDSA, anche se solo RSA può essere immaginato come letteralmente «recuperare» l’hash. Valido significa intatto e autentico. Non valido significa che qualcosa è cambiato, o che è stata usata la chiave sbagliata, e la risposta onesta è non valido.
- Prepara l'inputRSA ed ECDSA calcolano l'hash del documento in un'impronta breve e di lunghezza fissa; EdDSA firma il contenuto direttamente e ne calcola l'hash internamente. In ogni caso, qualunque modifica ai byte cambia ciò che viene firmato.
- Firma con la chiave privataIl firmatario applica un'operazione con chiave privata a quell'input — l'hash per RSA ed ECDSA, il contenuto per EdDSA. L'output è il valore della firma; solo il detentore della chiave privata avrebbe potuto produrlo.
- Ricostruisci l'inputIl verificatore ricostruisce in modo indipendente lo stesso input dal contenuto — un hash ricalcolato per RSA ed ECDSA, il contenuto stesso per EdDSA. È ciò rispetto a cui l'operazione di verifica esegue il controllo.
- Verifica con la chiave pubblicaIl verificatore esegue l'operazione di verifica dell'algoritmo sulla chiave pubblica, sul valore della firma e su quel input. La stessa forma funziona per RSA, ECDSA ed EdDSA.
- Accetta o rifiutaL'operazione di verifica restituisce valido o non valido. Valido significa che i byte sono intatti e che il detentore della chiave privata li ha firmati. Altrimenti il risultato è non valido — niente ipotesi.
In un PDF reale, NextPDF non imprime il sigillo sulla pagina visibile — lo imprime su un intervallo di byte dichiarato, e impacchetta la firma come un oggetto CMS distaccato (Spec: RFC 5652RFC 5652) collocato dentro il file (Spec: ISO 32000-2, §12.8ISO 32000-2 §12.8). Una rifinitura conta: il firmatario non firma direttamente l’hash del contenuto grezzo. Firma un piccolo insieme di attributi firmati che includono l’hash del contenuto, così che l’ora, il tipo di contenuto e l’identificatore del certificato del firmatario siano tutti sigillati insieme. Dove vivono quei byte, e perché l’intervallo ha la forma che ha, è oggetto di Come le firme stanno in un PDF.
Fin qui, la matematica prova che una chiave ha firmato questi byte. Non dice nulla su di chi sia la chiave. È esattamente questa lacuna che un certificato colma. Un certificato è esso stesso una dichiarazione firmata — da un’autorità di certificazione — che questa chiave pubblica appartiene a questo soggetto nominato. Fidarsene significa seguire la catena dal certificato del firmatario fino a un’autorità che hai deciso di considerare attendibile, controllando la validità di ogni anello lungo il percorso (Spec: RFC 5280, §6RFC 5280 §6). Senza quella catena, «firmato» è anonimo. Con essa, «firmato» ha un nome.
L’ultimo pezzo è il quando. Una firma può incorporare l’ora dichiarata dal firmatario stesso, ma un orologio che non controlli è un’affermazione, non una prova. Una marca temporale da una Time-Stamp Authority lega un hash della firma a un istante, attestato da una parte che non ha alcun interesse nel documento (Spec: RFC 3161, §1RFC 3161 §1). È questo che consente a una firma di restare significativa dopo che il certificato del firmatario è scaduto: puoi dimostrare che la firma esisteva mentre il certificato era ancora valido. Il trattamento più approfondito è in Marche temporali e tempo attendibile.
Esempio pratico
Sezione intitolata “Esempio pratico”Le forme qui sotto sono le operazioni concettuali, scritte in modo semplice. Il punto non è una chiamata API — è vedere che firmare e verificare sono immagini speculari, e che un byte manomesso rompe la corrispondenza per costruzione.
<?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.Falsificare una modifica che superi comunque la verifica è computazionalmente impraticabile. L’hash trasporta fedelmente il contenuto, quindi alterare il contenuto altera l’hash, e l’operazione di verifica lo rifiuta — a meno di trovare una collisione di hash, che la funzione scelta è progettata per rendere impraticabile.
Equivoco frequente
Sezione intitolata “Equivoco frequente”L’errore frequente è leggere «firma valida» come «documento affidabile». Non sono la stessa frase. La crittografia prova che i byte sono intatti e che il detentore della chiave privata li ha firmati — niente di più. Un documento firmato con una chiave di cui non hai mai sentito parlare, attestata da nessuna autorità che riconosci, può essere impeccabilmente «valido» e non valere nulla. L’identità viene dal certificato e dalla sua catena; il tempo viene da una marca temporale attendibile. Un segno di spunta verde che, in sordina, comprime tutto questo in un unico booleano ha deciso, per tuo conto, quali domande contassero. Conoscere i pezzi è ciò che ti consente di porre le altre.
Limiti e confini
Sezione intitolata “Limiti e confini”Questa pagina spiega l’idea di una firma digitale, non l’intera procedura di convalida. La matematica qui prova integrità e autenticità. Non ti dice, da sola, se il certificato di firma sia stato emesso a chi pensi tu, se fosse valido al momento della firma o se sia stato revocato in seguito — quelle sono questioni di percorso di certificazione e di revoca, e una convalida corretta le esegue tutte. L’insieme completo dei controlli è in Convalidare correttamente una firma.
NextPDF costruisce la struttura della firma ed esegue i controlli crittografici. Non sceglie i tuoi trust anchor, non garantisce per alcuna autorità di certificazione, né decide l’effetto giuridico di una firma — quelli dipendono dal tuo deployment, dal certificato e dalla giurisdizione. Il motore prova il meccanismo; le decisioni di fiducia che vi si appoggiano sono tue.
Ciò che il motore fornisce, per livello, si sviluppa verso l’esterno a partire da questa fondazione:
| Edition | Availability |
|---|---|
| Core | PAdES B-B: il meccanismo hash-and-sign descritto qui, impacchettato come un oggetto CMS SignedData distaccato, più la convalida del percorso di certificazione rispetto a un trust anchor che fornisci tu. |
| Pro | Aggiunge PAdES B-T — una marca temporale attendibile RFC 3161 verificata sul valore della firma, così che il «quando» sia attestato anziché auto-dichiarato. |
| Enterprise | Aggiunge i profili a lungo termine (B-LT, B-LTA): materiale di convalida incorporato e marche temporali del documento che mantengono le prove di identità e tempo verificabili per anni. |
Documenti correlati
Sezione intitolata “Documenti correlati”- Come le firme stanno in un PDF — dove vivono realmente nel file il valore della firma e il suo intervallo di byte.
- Convalidare correttamente una firma — l’insieme completo dei controlli che un verificatore deve eseguire, oltre la matematica di questa pagina.
- Marche temporali e tempo attendibile — cosa prova una marca temporale RFC 3161, e perché l’orologio del firmatario stesso non è quello.
- Profili baseline PAdES — quale profilo sovrappone identità, tempo e materiale a lungo termine a questa fondazione.
Glossario
Sezione intitolata “Glossario”- Hash (digest) — un’impronta breve e di lunghezza fissa di dati, prodotta da una funzione di hash crittografica; qualunque modifica ai dati la cambia completamente.
- Coppia di chiavi — una chiave privata collegata (detenuta solo dal firmatario) e una chiave pubblica (condivisa liberamente); solo la chiave privata può firmare, e solo la corrispondente chiave pubblica può verificare.
- Firmare — applicare l’operazione con chiave privata all’input definito dall’algoritmo: un hash del contenuto per RSA ed ECDSA, oppure il contenuto direttamente per EdDSA (che esegue l’hashing internamente). In un PDF, quel contenuto è costituito dagli attributi firmati, che includono l’hash del documento. Il risultato è il valore della firma.
- Verificare — ricostruire lo stesso input (un hash ricalcolato, o il contenuto direttamente per EdDSA), quindi eseguire l’operazione di verifica dell’algoritmo sulla chiave pubblica, sul valore della firma e su quel input per ottenere una risposta valido-o-non-valido.
- Valore della firma — i byte che l’operazione con chiave privata produce; ciò che un verificatore controlla rispetto all’input dell’algoritmo appena ricostruito (un digest per RSA ed ECDSA, il contenuto stesso per EdDSA).
- Certificato — una dichiarazione firmata che lega una chiave pubblica a un’identità nominata; resa attendibile concatenandosi a un’autorità che accetti (RFC 5280 §6).
- Trust anchor — un’autorità di certificazione che hai deciso di considerare attendibile; la radice di una catena di certificati accettabile.
- Marca temporale (RFC 3161) — un token firmato da una Time-Stamp Authority che lega un hash a un valore di tempo, fornendo prova attendibile del quando.
- CMS SignedData — la struttura Cryptographic Message Syntax (RFC 5652) che trasporta il valore della firma e il certificato del firmatario.
- PAdES — PDF Advanced Electronic Signatures: la famiglia di profili ETSI per la firma PDF. Trattata in profondità nelle pagine sulla firma.