Tutti i sistemi che ho usato fanno il seguente
- Calcola un hash del messaggio utilizzando un algoritmo di hashing.
- Crea una firma digitale del valore hash utilizzando la crittografia a chiave pubblica.
- essenzialmente questo è il valore crittografato dell'hash
- Aggiungi la firma al messaggio (o viceversa) in un contenitore.
Ciò fornisce la prova dell'identità del mittente e dell'integrità del messaggio senza fornire riservatezza.
Il destinatario quindi
- usa la chiave pubblica del mittente per decrittografare la firma e ottenere il valore hash,
- calcola in modo indipendente il valore hash dal testo del messaggio
- confronta i due valori di hash per verificare la paternità e l'integrità dei messaggi
Un esempio di questo è XML-DSIG
Un messaggio XML firmato potrebbe avere questo tipo di struttura.
<Envelope>
<Header>
<Signature>
...
</Signature>
</Header>
<Body>
<From>Sue</From>
<Text>Meet at Foo HQ at 12:30!</Text>
</Body>
</Envelope>
Il contenuto del messaggio non è riproducibile dalla firma. Le due cose sono separate.
Idee simili si applicano ad altri usi delle firme digitali.
Un motivo è che la crittografia a chiave pubblica è lenta, quindi la applichi alla più piccola quantità di dati necessaria per il tuo scopo.
Se hai bisogno di riservatezza, cripta il corpo del messaggio usando una crittografia simmetrica più veloce (a chiave condivisa). Il mittente può quindi includere la chiave simmetrica con l'hash del corpo e altra materia crittografata utilizzando la crittografia a chiave pubblica. L'hash è crittografato con la chiave privata del mittente, ma la chiave condivisa sarebbe crittografata utilizzando la chiave pubblica del destinatario. La chiave condivisa e l'hash del messaggio in genere saranno molto più brevi del contenuto medio del corpo del messaggio, pertanto questo approccio è più rapido e fa un uso migliore delle risorse di elaborazione.