Tutorials

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:
- Moduli Crittografici (CM): Dispositivi hardware o software progettati per operazioni crittografiche sicure. - Hardware Security Modules (HSM): Dispositivi fisici dedicati alla protezione e gestione delle chiavi crittografiche. - Dispositivi per Key Storage: Soluzioni software o hardware specifiche per l'archiviazione sicura.
  • 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:
- S1​ è un numero random e non è collegato direttamente alla chiave S. - S2​ è la chiave S cifrata con un one-time pad (R agisce da one-time pad), quindi anch'esso appare random senza R.

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−1​xt−1+at−2​xt−2+…+a1​x+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)=(a1​x+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).