Offro una visione diversa che mi ha aiutato a capire le cose nel corso della giornata.
La crittografia asimmetrica funziona utilizzando come base un paio di due grandi numeri che sono calcolati in qualche modo, quindi sono correlati. Li chiamiamo chiavi o
2 parti di una chiave.
Tuttavia, la seguente proprietà contiene:
- se ne hai solo, non puoi calcolarne uno solo dall'altro
- gli algoritmi in atto ti danno il fatto che qualsiasi cosa criptata da uno di questi numeri può essere decifrata solo dall'altro numero (e nemmeno usando il primo numero, questa è una proprietà chiave).
Ora, in aggiunta, decidiamo che uno dei due è pubblico e lo distribuiremo globalmente (in certificati X.509, su server di chiavi OpenPGP pubblici, ecc.) mentre l'altro è privato e tutto dovrebbe essere reso sicuro in modo che solo l'entità (può essere un individuo, un'organizzazione, un host, un indirizzo email, ecc.) coperto da esso è l'unico a conoscere questa parte "privata".
Quindi, se immagini che tutti hanno queste 2 parti e tutte le parti pubbliche sono conosciute, fidate e sicure (vedremo che ci sono dei problemi qui) puoi prendere le seguenti cose, se prendiamo Alice e Bob:
- tutto ciò che Alice crittografa con la chiave Bob pubblica può essere decifrato solo da Bob (perché dovrebbe essere l'unico a disporre della chiave privata corrispondente)
- tutto ciò che Alice crittografa con la sua chiave privata può essere decodificato da chiunque usi la sua chiave pubblica (che è per definizione pubblica e disponibile per tutti).
Potresti trovare inutile il secondo punto. Non lo è, è la base dell'autenticazione in effetti. Perché normalmente solo Alice ha la sua chiave privata, quindi se sei in grado di decifrare qualcosa con la sua chiave pubblica, allora sai che è stata crittografata con la chiave privata Alice, quindi significa che è stata eseguita da Alice, hai dimostrato l'autenticazione.
Ora ovviamente il problema è come pubblichi tutte le chiavi pubbliche, perché chiunque può pubblicare una chiave dicendo che è per "[email protected]".
Come è risolto?
- nel mondo PKI X.509, le chiavi pubbliche non sono gestite in questo modo ma attraverso un certificato X.509 (spesso chiamato "certificato SSL" che è doppiamente sbagliato perché TLS ha sostituito SSL 20 anni fa e perché puoi fare TLS senza certificati), che è fondamentalmente una chiave pubblica più un inizio e una data di fine e una firma. Qual è la firma? Si tratta di un calcolo trasferito su tutto il contenuto del certificato (da qui la chiave pubblica) fatto dalla chiave privata legata ad un altro certificato, tipicamente una "autorità di certificazione" (normalmente esiste una catena di essi ma che non modifica l'idea generica ). E alla fine ti fidi di alcune CA, così hai la loro chiave pubblica e convalidi qualsiasi certificato che sia validamente firmato da chiavi private di queste CA.
- nella rete di fiducia di OpenPGP, infatti chiunque come una decisione locale / individuale può dire quanto si fidi di una determinata chiave; l'idea è che normalmente i due individui si incontrano nella vita reale, addirittura mostrano documenti di identità ufficiali, e solo dopo ciò si può dire "sì, la chiave X è davvero appartenente a tale individuo".
So my question is, what stops an attacker listening in from just grabbing the key which you send alongside the data? If it's not actually being sent alongside the encrypted data, then at what point does the server receive the key that it needs to decrypt?
Prendiamo un tipico handshake HTTPS che utilizza HTTP su TLS
(vedi link per una spiegazione completa)
Puoi guardare questo diagramma per TLS 1.3: link ; vedrai che ogni messaggio Certificate
è di fatto crittografato con chiavi derivate da scambi precedenti (i messaggi ClientHello
e ServerHello
che includono ciascuno un segreto casuale).
Ricorda anche che se ti fidi di una determinata CA (che è la sua chiave privata) ti fidi di qualsiasi cosa firmata da essa, cioè qualsiasi certificato del client finale che abbia una firma fatta dalla sua chiave privata (che quindi chiunque potrebbe verificare usando la sua chiave pubblica). / p>
Chiunque intercetta ServerHello
e rispondendo non sarà in grado di dimostrare successivamente che ha la chiave corrispondente associata al certificato inviato con il messaggio Certificate
. Questo è anche il motivo per cui l'autenticazione è così importante: senza di essa puoi avere una sicurezza come nel flusso crittografato ma senza alcuna idea su chi stai parlando, che potrebbe essere un uomo nel mezzo che trasmette il traffico.
Vedere il messaggio ClientKeyExchange
: " che può contenere un PreMasterSecret, chiave pubblica o nulla. (Anche in questo caso dipende dalla cifra selezionata). PreMasterSecret viene crittografato utilizzando la chiave pubblica del certificato del server. "e quindi solo il server (con la chiave privata corrispondente) sarà in grado di decrittografarlo e andare avanti. Lo stesso vale per l'altra direzione.