Scenario 11.3: Rotazione chiavi
Categoria: Gestione chiavi
Complessità: Alta
Prerequisiti: Chiavi esistenti, strategia di backup
Tempo stimato: 30-45 minuti
Descrizione
Questo scenario descrive la rotazione regolare delle chiavi crittografiche. La rotazione delle chiavi è una misura di sicurezza critica che limita il rischio di compromissione.
Motivi di rotazione:
- Basata sul tempo - Raggiunta durata massima della chiave
- Basata sull'utilizzo - Massime operazioni/volume dati
- Incidente di sicurezza - Sospetto di compromissione
- Conformità - Requisiti normativi
- Upgrade algoritmo - Migrazione ad algoritmi più forti
Workflow
flowchart TD
TRIGGER[Trigger rotazione] --> CHECK{Rotazione necessaria?}
CHECK -->|No| WAIT[Attendere]
CHECK -->|Sì| BACKUP[Backup chiave vecchia]
BACKUP --> GEN[Generare nuova chiave]
GEN --> MIGRATE[Migrare sistemi]
MIGRATE --> TEST[Test funzionale]
TEST --> OVERLAP{Sovrapposizione OK?}
OVERLAP -->|Sì| RETIRE[Disattivare chiave vecchia]
OVERLAP -->|No| ROLLBACK[Rollback]
RETIRE --> ARCHIVE[Archiviare/Eliminare]
style GEN fill:#e8f5e9
style BACKUP fill:#fff3e0
Esempio codice: Rotazione automatica
using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ; public class KeyRotationService { private readonly IKeyStore _keyStore; private readonly TimeSpan _maxKeyAge = TimeSpan.FromDays(365); private readonly long _maxOperations = 1_000_000; public KeyRotationService(IKeyStore keyStore) { _keyStore = keyStore; } public async Task<RotationResult> CheckAndRotateAsync(string keyId) { var metadata = await _keyStore.GetMetadataAsync(keyId); // Verificare condizioni di rotazione var needsRotation = ShouldRotate(metadata); if (!needsRotation.Required) { return new RotationResult { KeyId = keyId, Rotated = false, Reason = "Nessuna rotazione necessaria" }; } return await PerformRotationAsync(keyId, metadata, needsRotation.Reason); } private RotationCheck ShouldRotate(KeyMetadata metadata) { // 1. Rotazione basata sul tempo if (DateTime.UtcNow - metadata.CreatedAt > _maxKeyAge) { return new RotationCheck(true, "Età massima raggiunta"); } // 2. Rotazione basata sull'utilizzo if (metadata.OperationCount > _maxOperations) { return new RotationCheck(true, "Operazioni massime raggiunte"); } // 3. Upgrade algoritmo (RSA → ML-DSA) if (metadata.Algorithm.StartsWith("RSA") && !metadata.Algorithm.Contains("ML-DSA")) { return new RotationCheck(true, "Migrazione PQ necessaria"); } return new RotationCheck(false, null); } private async Task<RotationResult> PerformRotationAsync( string keyId, KeyMetadata oldMetadata, string reason) { using var ctx = PqCryptoContext.Initialize(); // 1. Backup chiave vecchia await _keyStore.BackupAsync(keyId); // 2. Generare nuova chiave var newKeyId = $"{keyId}-{DateTime.UtcNow:yyyyMMdd}"; using var newKey = ctx.GenerateKeyPair(PqAlgorithm.MlDsa65); // 3. Salvare nuova chiave await _keyStore.StoreAsync(newKeyId, newKey, new KeyMetadata { Algorithm = "ML-DSA-65", CreatedAt = DateTime.UtcNow, PreviousKeyId = keyId, RotationReason = reason }); // 4. Contrassegnare vecchia chiave come "in rotazione" await _keyStore.SetStatusAsync(keyId, KeyStatus.Rotating); return new RotationResult { KeyId = keyId, NewKeyId = newKeyId, Rotated = true, Reason = reason }; } }
Esempio codice: Fase di sovrapposizione
public class OverlappingKeyManager { public async Task<byte[]> SignWithOverlap( byte[] data, string keyId, IKeyStore keyStore) { using var ctx = PqCryptoContext.Initialize(); // Caricare chiave corrente var currentKey = await keyStore.GetCurrentKeyAsync(keyId); // Firmare con chiave corrente var signature = ctx.SignData( data, currentKey, HashAlgorithmName.SHA256 ); return signature; } public async Task<bool> VerifyWithOverlap( byte[] data, byte[] signature, string keyId, IKeyStore keyStore) { using var ctx = PqCryptoContext.Initialize(); // Ottenere tutte le versioni valide della chiave var validKeys = await keyStore.GetValidKeysAsync(keyId); foreach (var key in validKeys) { try { if (ctx.VerifyData(data, signature, key.PublicKey, HashAlgorithmName.SHA256)) { return true; } } catch (CryptographicException) { // Chiave sbagliata, provare la prossima continue; } } return false; } }
Linee guida per la rotazione
| Tipo chiave | Età max. | Operazioni max. | Sovrapposizione |
|---|---|---|---|
| Chiave Root-CA | 10-20 anni | N/A | 1 anno |
| Chiave Intermediate-CA | 3-5 anni | N/A | 90 giorni |
| Chiave TLS Server | 1 anno | 10M handshake | 7 giorni |
| Chiave Code Signing | 2 anni | 100K firme | 30 giorni |
| Chiave Encryption | 1 anno | 100TB dati | 30 giorni |
Requisiti di rotazione specifici per settore
| Settore | Ciclo rotazione | Requisito | Particolarità |
|---|---|---|---|
| Finanza | 1 anno | PCI-DSS 3.6.4 | Obbligo Audit-Trail |
| Sanità | 2 anni | HIPAA | Key Escrow |
| Energia/KRITIS | 3 anni | BSI KRITIS-VO | Finestra manutenzione |
| Enti pubblici | 2 anni | BSI TR-03116 | Obbligo HSM |
Scenari correlati
| Relazione | Scenario | Descrizione |
|---|---|---|
| Prerequisito | 11.2 Archiviazione chiavi | Conservazione sicura |
| Prerequisito | 11.4 Backup chiavi | Backup prima della rotazione |
| Passo successivo | 11.5 Distruzione chiavi | Eliminare chiavi vecchie |
| Correlato | 4.2 Rekey | Certificato con nuova chiave |
« 11.2 Archiviazione chiavi | Panoramica chiavi | 11.4 Backup chiavi »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional
Zuletzt geändert: il 30/01/2026 alle 06:39