====== 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//