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