====== X509StoreExtensions ====== **Namespace:** ''WvdS.System.Security.Cryptography.X509Certificates'' Extensions za ''X509Store'' s Post-Quantum Key perzistencijom. Omogućuje spremanje i vraćanje PQ ključeva u Windows Certificate Store. ===== Pregled ===== Windows Certificate Store ne podržava Post-Quantum ključeve izvorno. Ove Extensions spremaju PQ ključeve u zasebno šifrirano spremište datoteka: %LOCALAPPDATA%\WvdS.Crypto\PqKeys\{thumbprint}.pqkey Ključevi se automatski šifriraju s DPAPI (Windows) ili AES-256 (Cross-Platform). ===== Metode ===== ^ Metoda ^ Opis ^ | ''Add(certificate, mode)'' | Dodaje certifikat i perzistira PQ ključeve | | ''AddRange(collection, mode)'' | Dodaje više certifikata | | ''Remove(certificate, deletePqKeys)'' | Uklanja certifikat i opciono PQ ključeve | | ''RemoveRange(collection, deletePqKeys)'' | Uklanja više certifikata | | ''Find(findType, findValue, validOnly, restorePqKeys)'' | Traži certifikate i vraća PQ ključeve | | ''GetCertificatesWithPqKeys()'' | Svi certifikati s vraćenim PQ ključevima | ===== Statičke metode ===== ^ Metoda ^ Opis ^ | ''PersistPqKeys(certificate)'' | Ručno perzistira PQ ključeve | | ''RestorePqKeys(certificate)'' | Ručno vraća PQ ključeve | | ''DeletePqKeys(certificate)'' | Briše perzistrirane PQ ključeve | | ''HasPersistedPqKeys(certificate)'' | Provjerava postoje li PQ ključevi | | ''GetPersistedPqKeyThumbprints()'' | Ispisuje sve thumbprinte | ===== Dodavanje certifikata ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); // Dodavanje certifikata s PQ ključevima var hybridCert = CreateHybridCertificate(); store.Add(hybridCert, CryptoMode.Hybrid); // PQ ključevi se automatski perzistiraju Console.WriteLine($"PQ ključevi spremljeni: {X509StoreExtensions.HasPersistedPqKeys(hybridCert)}"); ===== Pretraga certifikata s PQ ključevima ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); // Pretraga i vraćanje PQ ključeva var certs = store.Find( X509FindType.FindBySubjectName, "MojCertifikat", validOnly: true, restorePqKeys: true); // Automatsko učitavanje PQ ključeva foreach (var cert in certs) { Console.WriteLine($"Pronađeno: {cert.Subject}"); Console.WriteLine($"Način: {cert.GetCryptoMode()}"); // PQ ključevi su sada dostupni if (PqKeyStore.TryGetPublicKey(cert, out var pqKey)) { Console.WriteLine($"PQ ključ: {pqKey.Length} bajtova"); } } ===== Svi certifikati s PQ ključevima ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); var allCerts = store.GetCertificatesWithPqKeys(); foreach (var cert in allCerts) { var hasPq = X509StoreExtensions.HasPersistedPqKeys(cert); Console.WriteLine($"{cert.Subject}: PQ={hasPq}"); } ===== Uklanjanje certifikata ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); var certToRemove = FindCertificate(store); // S čišćenjem PQ ključeva (preporučeno) store.Remove(certToRemove, deletePqKeys: true); // Bez čišćenja PQ ključeva (ključevi ostaju) store.Remove(certToRemove, deletePqKeys: false); ===== PqKeyStoreManager ===== Dodatna klasa za upravljanje Store-om: // Čišćenje napuštenih ključeva (ključevi bez pripadajućeg certifikata) int deleted = PqKeyStoreManager.CleanupOrphanedKeys( StoreName.My, StoreLocation.CurrentUser); Console.WriteLine($"{deleted} napuštenih ključeva obrisano"); // Sigurnosna kopija svih PQ ključeva PqKeyStoreManager.BackupAllPqKeys( "pq-keys-backup.enc", "BackupLozinka123!"); // Vraćanje iz sigurnosne kopije int restored = PqKeyStoreManager.RestoreFromBackup( "pq-keys-backup.enc", "BackupLozinka123!"); Console.WriteLine($"{restored} ključeva vraćeno"); ===== Šifriranje ključeva ===== ==== Windows (DPAPI) ==== DataProtectionScope.CurrentUser - Samo trenutni korisnik može dešifrirati ključeve - Ključevi su vezani za korisnički profil ==== Cross-Platform (AES-256) ==== Key = SHA256(MachineName + UserName) IV = nasumično generirano - Ključevi su vezani za Machine + User - Manje sigurno od DPAPI ===== Sigurno brisanje ===== PQ ključevi se sigurno brišu: // Interno se izvršava: // 1. Prepisivanje datoteke nasumičnim podacima var random = RandomNumberGenerator.GetBytes(fileLength); File.WriteAllBytes(keyPath, random); // 2. Brisanje datoteke File.Delete(keyPath); ===== Primjer: Potpuni radni tijek ===== // 1. Stvaranje hibridnog certifikata CryptoConfig.EnablePostQuantum(); var cert = CreateHybridCertificate("CN=Hybrid Test"); // 2. Dodavanje u Store using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadWrite); store.Add(cert, CryptoMode.Hybrid); } // 3. Ponovno pokretanje aplikacije... // 4. Kasnije ponovno učitavanje using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadOnly); var found = store.Find( X509FindType.FindBySubjectName, "Hybrid Test", true, restorePqKeys: true); var loadedCert = found[0]; // PQ ključevi su vraćeni! var pqPublicKey = PqKeyStore.GetPublicKey(loadedCert); Console.WriteLine($"PQ ključ učitan: {pqPublicKey.Length} bajtova"); } ===== Lokacija spremišta ===== ^ Operacijski sustav ^ Putanja ^ | Windows | ''%LOCALAPPDATA%\WvdS.Crypto\PqKeys\'' | | Linux | ''~/.local/share/WvdS.Crypto/PqKeys/'' | | macOS | ''~/Library/Application Support/WvdS.Crypto/PqKeys/'' | ===== Sigurnosne napomene ===== * PQ ključevi su dostupni samo za trenutnog korisnika * Izraditi sigurnosnu kopiju prije migracije sustava * Redovito izvršavati ''CleanupOrphanedKeys()'' * Cross-Platform šifriranje je manje sigurno od DPAPI ===== Vidi također ===== * [[.:x509certificate2exportextensions|X509Certificate2ExportExtensions]] * [[.:x509certificate2extensions|X509Certificate2Extensions]] * [[.:truststoreextensions|TrustStoreExtensions]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//