11. Memorizzazione delle Chiavi Crittografiche
L'efficacia della maggior parte degli algoritmi crittografici dipende dalla segretezza delle chiavi simmetriche e private. Queste chiavi diventano, di conseguenza, asset ad altissimo rischio e la loro
L'efficacia della maggior parte degli algoritmi crittografici dipende dalla segretezza delle chiavi (simmetriche e private). Queste chiavi diventano, di conseguenza, asset ad altissimo rischio e la loro protezione è fondamentale. La scelta delle misure di sicurezza appropriate deve basarsi sulla valutazione di diversi fattori:
- Rischio di Compromissione: La natura e la quantità dei dati che verrebbero compromessi in caso di perdita della chiave.
- Numerosità delle Operazioni: La frequenza con cui una chiave viene utilizzata. Chiavi usate più spesso richiedono protezioni più robuste.
- Tempo di Vita della Chiave: Per quanto tempo la chiave deve rimanere valida e protetta.
Misure di Sicurezza per la Protezione delle Chiavi
Il NIST (National Institute of Standards and Technology), nella sua "Recommendation for Key Management" (NIST 800-57), suggerisce diverse misure per proteggere chiavi simmetriche e private:
- Limitare il Tempo in Chiaro: Ridurre al minimo il periodo in cui una chiave è in chiaro nella memoria o in transito.
- Evitare la Visualizzazione Umana: Impedire che un operatore umano possa visualizzare le chiavi in chiaro.
- Isolamento delle Chiavi: Conservare le chiavi in chiaro all'interno di contenitori protetti come:
- Protezione dell'Integrità: Proteggere le chiavi con un controllo di integrità (es. MAC o firma digitale), aggiungendo anche timestamp per rilevare eventuali alterazioni o replay.
- Distruzione Tempestiva: Distruggere le chiavi non più utilizzate il prima possibile, in modo sicuro e irreversibile.
- Monitoraggio Accessi: Prevedere il monitoraggio e la registrazione di tutti gli accessi alle chiavi in chiaro.
- Piano di Recovery: Disporre di un piano di recovery da mettere in atto in caso di compromissione di una o più chiavi.
- Protezione Fisica: Garantire protezione fisica per i luoghi in cui sono memorizzate le chiavi (es. data center sicuri).
L'OWASP Key Management Cheat Sheet aggiunge ulteriori misure:
- Operazioni in "Sealed Vault": Tutte le operazioni crittografiche devono essere eseguite all'interno di un ambiente isolato e protetto, un "sealed vault".
- Accesso Limitato a Codice Privilegiato: L'accesso alle chiavi deve essere limitato a codice con alti diritti di accesso e non al codice standard dell'applicazione.
- Robustezza delle KEK: Le Key Encryption Key (KEK), cioè le chiavi utilizzate per cifrare altre chiavi, devono avere una robustezza non inferiore a quella delle chiavi che stanno cifrando.
Esempi di Soluzioni Hardware/Software
- Intel Cryptographic Module: Moduli integrati nei processori Intel per operazioni crittografiche sicure.
- Android Trusted Execution Environment (TEE): Ambiente isolato all'interno dei dispositivi Android per l'esecuzione di codice sensibile e la gestione delle chiavi.
- Apple Secure Enclave: Processore di sicurezza dedicato nei dispositivi Apple che gestisce e protegge le chiavi crittografiche dell'utente.
Key Escrow (Custodia delle Chiavi)
Per esigenze di backup, disaster recovery o per estrema sicurezza, le chiavi possono essere affidate in "custodia" a soggetti terzi, garantendo la confidenzialità, l'integrità e la disponibilità.
Un approccio comune al key escrow prevede la divisione della chiave in n parti, affidando ogni parte a un soggetto diverso.
- Sicurezza: Nessun singolo soggetto, individualmente, può ricostruire la chiave completa.
- Ricostruzione: Per la ricostruzione della chiave è necessaria la presenza o la collaborazione di tutti i soggetti (o di un numero minimo prestabilito).
Schema di Divisione Semplice (per 2 Soggetti)
Supponendo di avere una chiave S di k bit da dividere tra due soggetti:
1. Generare un numero random R di lunghezza k bit. 2. Assegnare al primo soggetto S1=R. 3. Assegnare al secondo soggetto S2=R⊕S. 4. La ricostruzione avverrà con S1⊕S2=R⊕(R⊕S)=(R⊕R)⊕S=0⊕S=S.
- Riservatezza Garantita:
Schema di Divisione Generalizzato (per n Soggetti)
Generalizzando la divisione di una chiave S di lunghezza k bit tra n soggetti:
1. Generare n−1 numeri random di k bit: R1,R2,…,Rn−1. 2. Assegnare i numeri Ri ai primi n−1 soggetti: S1=R1, S2=R2, …, Sn−1=Rn−1. 3. Assegnare all'ultimo soggetto: Sn=R1⊕R2⊕…⊕Rn−1⊕S. 4. La ricostruzione di S avviene eseguendo lo XOR di tutte le parti: S=S1⊕S2⊕…⊕Sn.
Schema di Divisione con Soglia (t su n)
Questi schemi precedenti richiedono la presenza di _tutti_ i soggetti. È possibile definire uno schema che divide la chiave in n parti ma richiede la presenza di almeno t soggetti (con t≤n) per la ricostruzione (Schema Segreto Condiviso di Shamir).
1. Generare un polinomio casuale di grado t−1: g(x)=(at−1xt−1+at−2xt−2+…+a1x+S)(modp) - Dove i coefficienti ai sono scelti in modo casuale. - p è un numero primo random maggiore di tutti i coefficienti e di S. - S è la chiave segreta che si vuole dividere (rappresenta il termine noto, g(0)). 2. Distribuire gli n segreti assegnando Si=g(i) a ciascun soggetto i (es. S1=g(1), S2=g(2), …, Sn=g(n)). 3. Il valore p deve essere reso pubblico, mentre i coefficienti ai possono essere scartati dopo la generazione delle parti. 4. La conoscenza di t parti (t punti sul polinomio) è sufficiente per ricostruire il polinomio stesso (mediante interpolazione polinomiale, es. utilizzando l'interpolazione di Lagrange) e quindi calcolare S=g(0).
Esempio con t=2 (qualsiasi n, retta):
Per t=2, l'equazione è una retta: g(x)=(a1x+S)(modp).
- La conoscenza di una sola parte della chiave (ovvero 1 punto sulla retta) non è sufficiente per determinare la retta e quindi S.
- La conoscenza di due parti della chiave (ovvero 2 punti sulla retta) è sufficiente per determinare la retta e calcolare la chiave iniziale S (l'intercetta sull'asse y).