Identità digitali
Analizza le basi della crittografia e scopri come la blockchain rivoluziona l’identità digitale
12min
Analizza le basi della crittografia e scopri come la blockchain rivoluziona l’identità digitale
12min
Episodi di Blockchain Revolution
Benvenuti alla seconda lezione di questo corso in formato podcast dedicato alla tecnologia blockchain e al web3. Nello scorso episodio abbiamo visto come, grazie a queste tecnologie, sia possibile utilizzare identità digitali per detenere e scambiare valore digitale in modo certificato. Oggi proveremo a vedere insieme cosa vuol dire tutto ciò e come funziona la tecnologia sottostante.
Partiamo quindi dal concetto di identità, che dovrebbe esserci piuttosto familiare. Siamo abituati infatti tutti i giorni a collegarci ai sistemi informatici utilizzando la nostra identità, che spesso e volentieri è costituita da una coppia username e password. Ma cosa vuol dire esattamente che un determinato username e una determinata password costituiscono la mia identità digitale? Beh, fondamentalmente vuol dire che esiste un sistema informatico che mi ha fatto scegliere un certo username e mi ha fatto associare a quello username la mia password.
Il sistema ovviamente non memorizza la mia password in chiaro, cioè visibile, ma ne memorizza una codifica. In particolare memorizza l'hash della mia password, una sorta di impronta digitale della mia password. Ecco che diventa possibile per il sistema informatico verificare che dall'altra parte dello schermo ci sia proprio io.
Come funziona tutto ciò? Beh, mi viene chiesto il mio username, io lo comunico, poi mi viene chiesta la mia password, io comunico anch'essa, della password viene calcolato l'hash e viene confrontato questo hash con quello memorizzato. Se i due hash sono uguali, beh, vuol dire che ho comunicato la password corretta, cioè quella associata allo username, e quindi mi sono identificato e il sistema mi riconosce. Questo è un sistema al quale siamo estremamente abituati, lo utilizziamo tutti i giorni quando ci colleghiamo a un'applicazione, a un sito, al nostro social network e così via.
Non è però una soluzione perfetta, anzi porta con sé un sacco di problemi. Il primo è che queste identità non sono tra loro interoperabili, quindi quando io creo un'identità all'interno di un sistema, quella identità vale solo all'interno di quel sistema, non posso quindi portarla e utilizzarla per altri servizi e applicazioni. Questo vuol dire che io devo creare un numero di entità pari al numero di servizi che vado a utilizzare.
Ed ecco perché ciascuno di noi si trova a dover memorizzare da qualche parte una serie lunghissima di password che servono per accedere a tutti i servizi che utilizza quotidianamente. Ma questo non è l'unico problema, in realtà per creare questo tipo di entità io ho bisogno di un provider, di un fornitore di servizi, che generi per me questa identità, che la memorizza da qualche parte, che salvi l'hash della mia password e che lo conservi e lo protegga. Nel fare questo il fornitore del servizio ha un potere enorme, per esempio può cancellare la mia identità, semplicemente cancellando la riga che contiene il username e la mia password al database, oppure può cambiare la mia password semplicemente cambiando l'hash che è stato memorizzato all'interno del suo database.
Ma esistono soluzioni a questi problemi? Beh, ad esempio da un lato si è provato a porre rimedio al dilagare di account, identità, che ogni persona utilizza sfruttando dei meccanismi centralizzati di autenticazione, per esempio i cosiddetti social login, ovvero io posso collegarmi a un'applicazione senza creare una nuova identità ma sfruttando una che è già in mio possesso, per esempio la mia identità su Facebook, LinkedIn o Google. Se questo però risolve da una parte il problema dell'interoperabilità, perché mi consente di utilizzare l'identità creata all'interno di un sistema, anche all'interno di sistemi terzi, dall'altro però crea o peggiora altri problemi. Pensate ad esempio al fatto che se il provider dell'identità mi nega l'accesso a quell'identità per un disservizio, perché ha cancellato la mia identità o per qualunque altro motivo, beh, non soltanto io non potrò accedere al servizio fornito dal provider dell'identità, ma anche a tutti quei servizi a cui io accedevo con quella stessa identità, quindi centralizzando più servizi sulla stessa identità io in qualche modo conferisco un potere molto forte a chi quella identità la detiene e la gestisce.
Pensate inoltre che il provider dell'identità è colui che certifica che sia io di fronte allo schermo, che sono io che mi sto collegando a quel sistema e quindi ecco che potrebbe in qualche modo mentire far collegare qualcun altro a mio nome e al mio servizio. Pensate inoltre a cosa succederebbe se mi venisse chiesto un pagamento, una tantum o addirittura l'iscrizione a un servizio in abbonamento per mantenere valida la mia identità e per poterla utilizzare in tutti i servizi che utilizzo quotidianamente. Ma anche se tutto ciò non accadesse ci sarebbero comunque altri problemi molto importanti da considerare.
Per esempio il fatto che il fornitore di un servizio di social login anche se mi concedesse di utilizzare questo servizio per collegarmi ad altre applicazioni e lo concedessi in modo gratuito e in modo perfettamente corretto verrebbe a contatto con delle informazioni molto importanti, per esempio quando mi collego a quel determinato servizio e quindi saprebbe che giorno, a che ora, con che frequenza. E queste sono tutte informazioni che invece io potrei voler mantenere riservate, quindi vorrei non comunicare a nessuno, vorrei che non fosse possibile per un attore terzo venirne a conoscenza. Ma allora ci possiamo chiedere se esiste un modello d'identità migliore di quello che stiamo usando, che abbiamo usato negli ultimi decenni? La risposta è sì, esiste.
Esiste grazie a una tecnologia che ha ormai più di 50 anni e che adesso proverò a spiegarvi in parole semplici. Stiamo parlando della crittografia simmetrica e possiamo provare ad approcciare questo interessantissimo tema con un semplice esempio. Immaginate di voler creare una nuova identità digitale nella forma di un username testuale o numerico.
Per quello che abbiamo visto finora sarà necessario individuare un attore che crei la mia identità, che memorizzi l'hash della password associata con l'identità e che poi faccia tutte quelle funzioni che sono necessarie per identificarmi quando mi voglio collegare a quel sistema o a un sistema terzo. Ma non è proprio possibile fare in modo che quell'identità valga per tutti i sistemi del mondo, non per uno in particolare? Beh, in realtà la crittografia simmetrica ci dice che è possibile fare una cosa del genere. Io scelgo un numero, immaginiamoci 10, e poi da questo numero posso generarne un secondo grazie a un particolare algoritmo in modo tale che la coppia di numeri, questa coppia di numeri che ho formato, abbia delle caratteristiche molto interessanti.
In primo luogo, anche se io posso sempre generare a partire dal primo numero, che abbiamo detto essere 10, il secondo numero, mettiamo che sia 23, ecco non posso da 23 tornare indietro al mio numero 10. Questo significa che la funzione che mi permette di generare 23 a partire da 10 è una funzione che può essere eseguita soltanto in una direzione. In particolare il primo numero, cioè 10, viene chiamato chiave privata, cioè il numero che io devo conservare, mantenere privato e non diffondere, mentre il secondo numero, 23, è chiamato chiave pubblica, perché in realtà è il numero che in qualche modo mi rappresenta, è il numero che io posso comunicare al mondo intero, tanto nessuno potrà da 23 risalire al numero segreto, quindi la mia chiave privata, cioè 10.
Ok, ora che siamo in possesso di questa coppia di numeri, chiave pubblica e chiave privata, cosa ce ne facciamo? In qualche modo 23, la chiave pubblica è quella che ci rappresenta, 10, la chiave privata, è quella che soltanto noi conosciamo, ma come utilizziamo questi due numeri? Beh, l'applicazione principale è quella che riguarda proprio la cifratura dei dati. Cifrare un dato vuol dire codificarlo in modo tale che non sia facilmente intellegibile, cioè scriverlo in modo tale per cui non sia comprensibile se non a chi è in grado appunto di decifrarlo. E la cosa interessante è che se io prendo un qualunque dato e lo cifro con il primo numero, cioè 10, ecco che lo posso decifrare successivamente con 23, cioè con l'altro numero, e viceversa se lo cifro con 23, poi lo posso decifrare con 10.
Cioè la chiave pubblica e la chiave privata possono essere utilizzate una per cifrare e l'altra per decifrare, ma come posso sfruttare questa caratteristica per l'autenticazione all'interno di un sistema informatico? Beh, la mia identità a questo punto è 23, la mia chiave pubblica, come faccio a dimostrare che io sono in possesso della chiave privata corrispondente, che io so essere appunto 10? Beh, il metodo più banale sarebbe ovviamente quello di comunicare la chiave privata al sistema e dire guarda io conosco la chiave privata corrispondente a 23 ed è 10. Ovviamente se io facessi così starei in qualche modo rivelando la chiave privata, che non sarebbe più appunto privata, la stare comunicando e avrei in qualche modo compromesso la mia identità digitale, perché a quel punto chi viene a conoscenza di 10 ha tutte le informazioni che io ho della mia identità. Come faccio allora a dimostrare di essere in possesso della chiave privata senza comunicarla? Beh, in realtà è molto semplice.
Io mi collego a un sistema e dichiaro di essere 23, il sistema per verificare se io sono veramente 23 fa questa cosa, prende un numero, una parola segreta, immaginatevi la parola tavolino, la cifra con 23, quindi utilizza la chiave pubblica che ho comunicato per cifrare la parola segreta e poi la comunica all'interlocutore. Questa è una sorta di sfida o challenge, cioè il sistema mi sta sfidando a dimostrare che io conosco la chiave privata senza però richiedermi di comunicarla. A questo punto io ricevo il dato cifrato e siccome è stato cifrato con la chiave pubblica 23 può essere decifrato soltanto da chi conosce la chiave privata corrispondente a 23.
Io per fortuna la conosco perché è la mia identità, so che è 10, quindi la utilizzo, decifro il dato, vengo a conoscenza della parola segreta e la comunico al sistema. Ovviamente questo è vero soltanto se io conosco la chiave privata, se qualcun altro invece millanta di essere lui 23 senza però conoscere la chiave privata ecco che quando riceverà la challenge, la sfida, non sarà in grado di decifrare quel dato e quindi non sarà in grado di scovare la parola tavolino, che era la parola che il sistema mi ha comunicato per verificare che io fossi veramente 23. Cos'è questo? Più in generale questo è un sistema di comunicazione riservata su un canale pubblico, cioè chiunque al mondo conoscendo la mia identità e quindi la mia chiave pubblica 23 può prendere un qualunque informazione, un qualunque dato, cifrarlo con 23, inviarlo sulla rete, anche su un canale pubblico, potrebbe scriverlo su un forum, potrebbe pubblicarlo su una pagina web, ma soltanto chi è in possesso della chiave privata corrispondente saprebbe leggere quel messaggio perché sarebbe l'unico in grado di decifrarlo.
Questo è un vero e proprio sistema di comunicazione riservata su un canale pubblico ed è reso possibile grazie alla crittografia simmetrica. Uno dei possibili utilizzi di questo sistema è appunto, come abbiamo visto, la possibilità di identificare l'utente dall'altra parte, quindi verificare che sia veramente a conoscenza della chiave privata corrispondente alla chiave pubblica che ha comunicato e quindi in qualche modo identificare, autenticare l'utente, ma vedremo nella prossima lezione che ci sono caratteristiche forse ancora più interessanti.