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