Inhaltsverzeichnis
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
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional
Zuletzt geändert: 30.01.2026. u 01:24