====== X509StoreExtensions ====== **Namespace:** ''WvdS.System.Security.Cryptography.X509Certificates'' Razširitve za ''X509Store'' s persistenco post-kvantnih ključev. Omogoča shranjevanje in obnavljanje PQ-ključev v Windows Certificate Store. ===== Pregled ===== Windows Certificate Store ne podpira post-kvantnih ključev izvorno. Te razširitve shranjujejo PQ-ključe v ločenem, šifriranem datotečnem sistemu: %LOCALAPPDATA%\WvdS.Crypto\PqKeys\{thumbprint}.pqkey Ključi so samodejno šifrirani z DPAPI (Windows) ali AES-256 (medplatformno). ===== Metode ===== ^ Metoda ^ Opis ^ | ''Add(certificate, mode)'' | Doda certifikat in persistira PQ-ključe | | ''AddRange(collection, mode)'' | Doda več certifikatov | | ''Remove(certificate, deletePqKeys)'' | Odstrani certifikat in opcijsko PQ-ključe | | ''RemoveRange(collection, deletePqKeys)'' | Odstrani več certifikatov | | ''Find(findType, findValue, validOnly, restorePqKeys)'' | Poišče certifikate in obnovi PQ-ključe | | ''GetCertificatesWithPqKeys()'' | Vsi certifikati z obnovljenimi PQ-ključi | ===== Statične metode ===== ^ Metoda ^ Opis ^ | ''PersistPqKeys(certificate)'' | Ročno persistira PQ-ključe | | ''RestorePqKeys(certificate)'' | Ročno obnovi PQ-ključe | | ''DeletePqKeys(certificate)'' | Izbriše persistirane PQ-ključe | | ''HasPersistedPqKeys(certificate)'' | Preveri ali so PQ-ključi prisotni | | ''GetPersistedPqKeyThumbprints()'' | Našteje vse thumbprinte | ===== Dodajanje certifikata ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); // Dodajanje certifikata s PQ-ključi var hybridCert = CreateHybridCertificate(); store.Add(hybridCert, CryptoMode.Hybrid); // PQ-ključi so samodejno persistirani Console.WriteLine($"PQ-ključi shranjeni: {X509StoreExtensions.HasPersistedPqKeys(hybridCert)}"); ===== Iskanje certifikata s PQ-ključi ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); // Iskanje in obnova PQ-ključev var certs = store.Find( X509FindType.FindBySubjectName, "MojCertifikat", validOnly: true, restorePqKeys: true); // Samodejno naloži PQ-ključe foreach (var cert in certs) { Console.WriteLine($"Najdeno: {cert.Subject}"); Console.WriteLine($"Način: {cert.GetCryptoMode()}"); // PQ-ključi so zdaj na voljo if (PqKeyStore.TryGetPublicKey(cert, out var pqKey)) { Console.WriteLine($"PQ-ključ: {pqKey.Length} bajtov"); } } ===== Vsi certifikati s PQ-ključi ===== 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}"); } ===== Odstranjevanje certifikata ===== using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); var certToRemove = FindCertificate(store); // S čiščenjem PQ-ključev (priporočeno) store.Remove(certToRemove, deletePqKeys: true); // Brez čiščenja PQ-ključev (ključi ostanejo) store.Remove(certToRemove, deletePqKeys: false); ===== PqKeyStoreManager ===== Dodatni razred za upravljanje shrambe: // Čiščenje osirotelih ključev (ključi brez pripadajočega certifikata) int deleted = PqKeyStoreManager.CleanupOrphanedKeys( StoreName.My, StoreLocation.CurrentUser); Console.WriteLine($"{deleted} osirotelih ključev izbrisanih"); // Varnostna kopija vseh PQ-ključev PqKeyStoreManager.BackupAllPqKeys( "pq-keys-backup.enc", "GesloZaVarnostnKopijo123!"); // Obnova iz varnostne kopije int restored = PqKeyStoreManager.RestoreFromBackup( "pq-keys-backup.enc", "GesloZaVarnostnKopijo123!"); Console.WriteLine($"{restored} ključev obnovljenih"); ===== Šifriranje ključev ===== ==== Windows (DPAPI) ==== DataProtectionScope.CurrentUser - Samo trenutni uporabnik lahko dešifrira ključe - Ključi so vezani na uporabniški profil ==== Medplatformno (AES-256) ==== Key = SHA256(MachineName + UserName) IV = naključno generiran - Ključi so vezani na stroj + uporabnika - Manj varno kot DPAPI ===== Varno brisanje ===== PQ-ključi so varno izbrisani: // Interno se izvede: // 1. Prepisovanje datoteke z naključnimi podatki var random = RandomNumberGenerator.GetBytes(fileLength); File.WriteAllBytes(keyPath, random); // 2. Brisanje datoteke File.Delete(keyPath); ===== Primer: Popoln potek dela ===== // 1. Ustvarjanje hibridnega certifikata CryptoConfig.EnablePostQuantum(); var cert = CreateHybridCertificate("CN=Hibridni test"); // 2. Dodajanje v shrambo using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadWrite); store.Add(cert, CryptoMode.Hybrid); } // 3. Ponovni zagon aplikacije... // 4. Kasnejše nalaganje using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) { store.Open(OpenFlags.ReadOnly); var found = store.Find( X509FindType.FindBySubjectName, "Hibridni test", true, restorePqKeys: true); var loadedCert = found[0]; // PQ-ključi so obnovljeni! var pqPublicKey = PqKeyStore.GetPublicKey(loadedCert); Console.WriteLine($"PQ-ključ naložen: {pqPublicKey.Length} bajtov"); } ===== Lokacija shrambe ===== ^ Operacijski sistem ^ Pot ^ | Windows | ''%LOCALAPPDATA%\WvdS.Crypto\PqKeys\'' | | Linux | ''~/.local/share/WvdS.Crypto/PqKeys/'' | | macOS | ''~/Library/Application Support/WvdS.Crypto/PqKeys/'' | ===== Varnostni nasveti ===== * PQ-ključi so dostopni samo trenutnemu uporabniku * Ustvarite varnostno kopijo pred migracijo sistema * Redno izvajajte ''CleanupOrphanedKeys()'' * Medplatformno šifriranje je manj varno kot DPAPI ===== Glej tudi ===== * [[.:x509certificate2exportextensions|X509Certificate2ExportExtensions]] * [[.:x509certificate2extensions|X509Certificate2Extensions]] * [[.:truststoreextensions|TrustStoreExtensions]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//