La costante evoluzione dei servizi digitali e lo spostamento sempre maggiore di risorse e dati su infrastrutture ICT, pone al giorno d'oggi un grande problema relativo alla sicurezza di come i dati vengono mantenuti, utilizzati e, al contempo, protetti. In materia di sicurezza delle informazioni sono tanti gli aspetti che devono essere considerati per garantire la sicurezza dei servizi e prodotti ICT. Di fondamentale importanza per la sicurezza delle informazioni è garantire le principali proprietà di sicurezza di un dato: confidenzialità, disponibilità e integrità.
A queste si aggiungono poi anche l'autenticità dei dati, che mira a garantire che il dato sia originale e proveniente da una sorgente verificata, e che si lega a braccetto con la proprietà di non ripudio, per la quale il proprietario di un dato non potrà negare in futuro di averlo prodotto.
Tutte queste proprietà dei dati vengono al giorno d'oggi garantite tramite l'utilizzo di protocolli crittografici nelle comunicazioni e nella memorizzazione dei dati stessi. Tali algoritmi si suddividono in due macro categorie: algoritmi simmetrici e algoritmi asimmetrici o a chiave pubblica.
Gli algoritmi a chiave simmetrica
Gli algoritmi a chiave simmetrica si basano sull'utilizzo di un'unica chiave segreta e condivisa dalle due parti comunicanti. Questi algoritmi permetto di garantire le proprietà di confidenzialità e integrità dei dati. La prima è garantita tramite l'operazione di cifratura dei dati, che li rende illeggibili a chiunque non sia in possesso della chiave simmetrica dell'algoritmo utilizzato. Esempi di questo tipo di algoritmi sono i cifrari DES e AES.
La proprietà di integrità viene invece garantita tramite altri tipi di algoritmi a chiave simmetrica che permettono di derivare un digest o integrity value a partire dai dati originari e, eventualmente, da una chiave simmetrica pre-condivisa. La verifica di questo digest da parte del ricevitore da garanzia che i dati non siano stati modificati in transito. Due esempi di questo tipo di algoritmi sono SHA e HMAC.
Le proprietà di autenticità e non ripudio sono invece solitamente garantite tramite l'utilizzo degli algoritmi a chiave asimmetrica. Tali algoritmi prevedono l'utilizzo di una coppia di chiavi matematicamente correlate tra loro per ogni interlocutore della comunicazione. La chiave privata rimane segreta e conosciuta solo al proprietario, mentre la chiave pubblica viene condivisa dal proprietario stesso tramite quella che in gergo si chiama un'infrastruttura a chiave pubblica, che prevede l'intervento di una o più autorità che garantiscono l'autenticità delle chiavi pubbliche e il loro legame con i rispettivi proprietari.
Questo tipo di algoritmi permette di implementare i meccanismi di firma digitale, tramite i quali l'origine dei dati può essere verificata e non disconosciuta. Il proprietario dei dati infatti utilizza la sua chiave privata per firmare i dati in suo possesso. Questa firma potrà essere verificata solo utilizzando la chiave pubblica corrispondente e questo fornisce la garanzia che il mittente di quei dati sia verificato e che i dati siano autentici.
Alcuni esempi di algoritmi a chiave asimmetrica utilizzato molto di frequente per questi scopi sono i cifrari RSA ed ECDSA.
Il ruolo dell'entropia
La combinazione quindi di cifrari a chiave simmetrica e asimmetrica permette di garantire tutte le proprietà fondamentali della sicurezza delle informazioni. Ma su cosa si basa la sicurezza di questi cifrari?
La sicurezza dei cifrari non si basa sulla segretezza dell'algoritmo che utilizzano. Come si è visto in passato, la segretezza dell'algoritmo utilizzato non è sufficiente a garantire che questo non venga mai scoperto. Un esempio classico di questa affermazione è il cifrario Enigma utilizzato dai nazisti per cifrare le proprie comunicazioni durante la seconda guerra mondiale. L'algoritmo utilizzato da questo cifrario era tenuto segreto dai tedeschi. Gli alleati, tuttavia, tramite un gran numero di intercettazioni e tramite attività di reverse engineering dei messaggi cifrati, sono riusciti a risalire all'algoritmo utilizzato dai nazisti. Questo ha permesso loro di intercettare e decifrare le comunicazioni tedesche portando ad una svolta cruciale nella risoluzione del conflitto.
Diversamente da quanto si pensi quindi l'algoritmo utilizzato in un sistema crittografico è sempre pubblico e conosciuto. La sicurezza dei cifrari si basa invece sulla segretezza e sicurezza delle loro chiavi e, congiuntamente, sulla difficoltà di risoluzione dei problemi matematici sui quali gli algoritmi si basano. Per i cifrari a chiave simmetrica la sicurezza si basa sulla segretezza della chiave simmetrica stessa. Mentre per quelli a chiave asimmetrica si basa sulla segretezza della chiave privata, sull'integrità della relativa chiave pubblica e sul problema matematico sul quale si basano (la fattorizzazione di numeri primi nel caso di RSA, per esempio).
La sicurezza delle chiavi è garantita dal metodo con il quale queste sono generate. I metodi sono naturalmente diversi in base al tipo di algoritmo per il quale questa chiave verrà poi utilizzata, ma tutti hanno una base comune e imprescindibile: l'utilizzo di una sorgente di entropia. Questa, infatti, è la base per generare i valori randomici utilizzati per derivare le chiavi.
La forza di una chiave segreta si basa naturalmente sulla sua lunghezza, ma anche sulla sua imprevedibilità. La lunghezza è un fattore fondamentale perché una chiave troppo corta potrà essere facilmente indovinata da un potenziale attaccante tramite un attacco di forza bruta, sfruttando le elevate capacità computazionali dei calcolatori odierni. Una chiave, quindi, deve essere lunga abbastanza da poter evitare un attacco di forza bruta anche tramite l'utilizzo di computer con una potenza di calcolo notevole.
L'imprevedibilità, tuttavia, gioca un ruolo altrettanto fondamentale. Infatti, anche se una chiave e teoricamente lunga abbastanza per evitare un attacco a forza bruta, la conoscenza di pattern di costruzione di questa chiave permette ad un attaccante di effettuare delle deduzioni che diminuiranno di molto il numero di tentativi necessari ad indovinare la chiave stessa. Le chiavi devono essere quindi non correlate tra di loro, ma anche i bit che li compongono devono essere il più possibile indipendenti l'uno dall'altro.
Nel garantire l'imprevedibilità delle chiavi generate, la qualità delle sorgenti di entropia utilizzate gioca un ruolo fondamentale. Tanto più la sorgente di entropia sarà in grado di generare valori vicini ad un'effettiva distribuzione randomica (ovvero dove ogni bit generato è totalmente indipendente da tutti i bit precedenti e successivi), tanto più le chiavi che saranno derivate da questi valori saranno imprevedibili e difficili da indovinare per un potenziale attaccante.
Cos'è una sorgente di entropia?
Per capire quali sono i criteri che definiscono la qualità di una sorgente di entropia, bisogna partire dalla definizione stessa di entropia:
"L'entropia di una sorgente è definita come il valore atteso dell'autoinformazione, ovvero l'informazione media contenuta in ogni messaggio emesso."
Questa è la definizione di entropia dettata da Claude Shannon riguardo i sistemi informazionali. Trattando una sorgente di entropia come una scatola chiusa che genera valori, si evince come la quantità di entropia che essa genera è proporzionale all'informazione dei bit che emette. Per fare un esempio banale, una sorgente di entropia che emette sempre bit di valore 1 avrà un valore di entropia pari a 0. Questo perché ogni bit rappresenta un evento certo che non trasmette alcuna informazione a chi lo riceve.
Si può intuire anche come la sorgente di entropia ottimale sia quella che genera 1 bit di informazione per bit output (e quindi avrà un'entropia di 1 bit per bit di output). In gergo questa viene definita come una sorgente full entropy, dove la quantità di entropia ottenuta dalla sorgente stessa è pari alla lunghezza dell'output che questa produce.
L'obiettivo ultimo di una sorgente è quindi proprio questo: ottenere un valore di entropia di 1 bit per bit di output prodotto.
Su cosa si basano le sorgenti?
Per capire come possa essere possibile ottenere un bit di entropia per ogni bit di output prodotto, bisogna comprendere da quali basi una sorgente parte per generare bit in maniera non deterministica.
Le basi sono naturalmente sempre legate a processi che sono stocastici in natura. Alcuni esempi di processi stocastici possono essere:
- I movimenti del mouse effettuati da un utente mentre lavora al suo pc;
- Gli interrupt generati dal sistema operativo;
- Gli oscillatori ad anello utilizzati per il clock dei calcolatori;
- I timestamp prodotti tramite l'utilizzo di clock ad alta precisione.
Tutti questi processi si basano su eventi che sono intrinsecamente più o meno randomici. Lo scopo di una sorgente di entropia sarà quello di campionare questi processi costantemente e convertire le misurazioni effettuate in un output binario per l'utente.
Per fare un esempio, gli oscillatori ad anello vengono utilizzati come sorgente di entropia nei generatori di numeri casuali hardware-based. Il periodo con il quale questi circuiti oscillano varia leggermente in modo imprevedibile in base alla temperatura del chip sul quale questi stanno operando (la quale a sua volta varia nel tempo). Una sorgente di entropia può quindi campionare le misurazioni e i delta di cambiamento di questi periodi oscillatori ed utilizzare questa informazione come base per produrre dei bit randomici.
Quanto è buona una sorgente di entropia?
Indipendentemente, dal principio su cui si basano, le capacità di una sorgente di entropia si valutano in base alla qualità statistica degli output che questa produce, alla quantità di risorse che utilizza per produrre questi output e all'utilizzo che l'utente deve fare di questi output.
In generale, per poter essere utilizzabile, una sorgente deve essere in grado di fornire output all'utente di buona qualità a livello statistico e, al contempo, senza consumare una quantità di risorse eccessiva che non ne permetterebbe l'utilizzo costante da parte dell'utente. Questo è vero in qualsiasi tipo di utilizzo della sorgente randomica. Essa può infatti essere utilizzata per diversi scopi: simulazioni statistiche, applicazioni matematiche, algoritmi crittografici, etc.
A seconda dell'utilizzo che si deve fare di una sorgente di entropia, il requisito sulla qualità statistica dei dati che essa produce sarà più o meno stringente, a volte anche a scapito delle prestazioni di quest'ultima.
Per quanto riguarda le applicazioni crittografiche, abbiamo detto che lo scopo di una sorgente di entropia è quello di produrre valori randomici che verranno poi utilizzati come base per derivare le chiavi e i valori segreti degli algoritmi crittografici. È chiaro quindi che in un utilizzo dove la sicurezza di queste chiavi è l'asset di maggiore importanza per chi ne fa utilizzo, il requisito sulla qualità dei numeri randomici prodotti da una sorgente di entropia è molto importante. Tanto più questi numeri saranno randomici e imprevedibili, tanto più le chiavi prodotte saranno sicure per essere utilizzate all'interno di un algoritmo crittografico.
Da qui nasce quindi la necessità di testare una sorgente di entropia, per garantire che questa sia in grado di produrre output che sono di alta qualità. La validazione che si fa di queste sorgenti è ovviamente una validazione statistica, dove un gran numero di campioni di output sono presi dalla sorgente e la loro distribuzione statistica viene analizzata per determinare quanto questa si avvicini ad una distribuzione randomica teorica.
NIST SP 800-90 Series (ESV Validations)
Un esempio autorevole di procedura di costruzione e validazione di generatori di numeri casuali e sorgenti di entropia è la serie di pubblicazioni 800-90 creata dal NIST (National Institute of Standards and Technologies) in America. Questa serie include i seguenti documenti:
- NIST SP 800-90A: pubblicazione volta a descrivere la costruzione e l'utilizzo sicuro di un generatore di numeri casuali. In particolare, questa pubblicazione si concentra sulla parte deterministica di un generatore di numeri casuali (chiamato DRBG) e ne descrive la costruzione a partire da algoritmi crittografici conosciuti come AES e SHA e dall'utilizzo di una sorgente di entropia validata come metodo per ottenere i seed randomici iniziali;
- NIST SP 800-90B: pubblicazione che si concentra sullo specificare i principi di costruzione di una sorgente di entropia, la metodologia con la quale questa deve essere validata e i self test che questa deve effettuare durante le sue operazioni;
- NIST SP 900-90C: pubblicazione che lega la 90A con la 90B e fornisce le specifiche per costruire random number generators completi e composti da una sorgente di entropia validata tramite i principi disposti dalla 90B e da un algoritmo deterministico implementato come descritto dalla 90A.
Per quanto riguarda questo articolo, di particolare interesse è la NIST SP 800-90B, che espone la metodologia di testing proposta dal NIST per validare una sorgente di entropia.
Questa metodologia viene presa come base per effettuare delle vere e proprie validazioni ufficiali sulle sorgenti di entropia (Entropy Source Validations) effettuate dai laboratori accreditati. Il risultato di queste validazioni è un certificato (ESV certificate) che è emesso dal NIST e che dichiara la quantità di entropia che una sorgente è in grado di produrre in uno o più specifici operational environments (espresso come rapporto bit di entropia per bit di output prodotto).
I test effettuati all'interno di queste validazioni sono rappresentati dalla raccolta di un ampio set di campioni di output dalla sorgente di entropia (minimo 1 000 000 di campioni secondo la NIST SP 800-90B). Questo set di campioni viene poi analizzato per produrre una stima della quantità di bit di entropia che sono contenuti in ogni output della sorgente.
Inoltre, l'analisi della sorgente prevede anche una code review da parte del laboratorio che verifica i requisiti di costruzione imposti dalla NIST SP 800-90B che riguardano anche i self test che la sorgente di entropia effettua durante le sue operazioni.
Infine, le validazioni effettuate sulle sorgenti di entropia e i relativi certificati emessi sono validi solo quando queste sono utilizzate negli stessi operational environment che sono stati utilizzati durante la validazione (individuati da sistema operativo, processore, ambiente di virtualizzazione, temperature di utilizzo, etc.). Questo perché la quantità di entropia prodotta da una sorgente è direttamente influenzata alle componenti che fanno parte dell'operational enviroment, sia hardware (processore, memoria, cache, etc.), che software (sistema operativo, ambiente di virtualizzazione, etc.), che di utilizzo (temperatura, umidità, etc.).
Questo processo di validazione delle sorgenti di entropia è anche alla base della validazione dei moduli crittografici effettuata dal NIST secondo lo standard FIPS (Federal Information Processing Standards) 140-3. Senza il certificato relativo alla sorgente di entropia, un modulo crittografico non potrà essere validato ed ottenere un relativo certificato FIPS 140-3. Questo evidenzia ancora di più quanto la sorgente di entropia sia un requisito fondamentale per l'implementazione e l'utilizzo sicuro degli algoritmi crittografici.
Conclusioni
Questo articolo mira ad evidenziare l'importanza dello sviluppo e della validazione delle sorgenti di entropia che vengono utilizzate in contesti crittografici.
Gli algoritmi crittografici sono imprescindibili per garantire la sicurezza delle nostre informazioni quando queste viaggiano sulla rete o vengono memorizzate su supporti informatici.
Le sorgenti di entropia rappresentano quindi la base su cui la sicurezza delle informazioni si fonda. Se le sorgenti non sono sviluppate e validate correttamente non produco output abbastanza imprevedibili da poter supportare gli algoritmi crittografici. Questi ultimi saranno quindi vulnerabili ad attacchi che mirano a svelare le chiavi simmetriche e/o segrete e a bypassare quindi completamente l'algoritmo stesso.
Questo pone un accento in più sull'importanza del testing e della validazione di una sorgente di entropia quando questa è oggetto di un utilizzo crittografico.
Abbiamo introdotto l'approccio adottato dall'istituto americano del NIST che pone una grande importanza nelle validazioni di entropia. Come abbiamo detto, queste fondano la base della validazione di un modulo crittografico che dovrà poi, nel contesto americano e canadese, essere validato anche secondo lo standard FIPS 140-3 per poter essere utilizzato nelle reti e sistemi ICT a supporto delle agenzie federali americane e canadesi.
L'approccio americano e canadese può, e probabilmente deve, essere preso d'esempio anche da gli altri stati e continenti. Adottare un tipo di approccio così rigoroso può infatti migliorare sensibilmente la sicurezza dei prodotti ICT in materia di crittografia, soprattutto quando questi sono utilizzati per garantire la sicurezza di informazioni che riguardano l'amministrazione pubblica e la gestione di informazioni sensibili per gli stati.