====== WasmCryptoProvider ====== **Namespace:** ''WvdS.System.Security.Cryptography.Providers'' JavaScript Interop-basierter Krypto-Provider für Blazor WebAssembly. Kommuniziert über ''IJSRuntime'' mit ''openssl.wasm''. ===== Übersicht ===== Der ''WasmCryptoProvider'' ermöglicht Post-Quantum Kryptographie in Blazor WebAssembly Anwendungen durch: * JavaScript Interop zu WebAssembly-kompiliertem OpenSSL * Vollständig asynchrone API (erforderlich für JS Interop) * Identische Funktionalität wie ''NativeCryptoProvider'' ===== Architektur ===== Blazor WebAssembly │ ▼ ┌─────────────────┐ │ WasmCrypto- │ │ Provider │ │ (C#) │ └────────┬────────┘ │ IJSRuntime.InvokeAsync ▼ ┌─────────────────┐ │ wvds-crypto.js │ │ (JavaScript) │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ openssl.wasm │ │ (WebAssembly) │ └─────────────────┘ ===== Eigenschaften ===== ^ Eigenschaft ^ Typ ^ Beschreibung ^ | ''Name'' | string | ''%%"WASM (JS Interop)"%%'' | | ''IsAvailable'' | bool | ''true'' wenn initialisiert | ===== Dependency Injection ===== // Program.cs (Blazor WebAssembly) builder.Services.AddScoped(sp => new WasmCryptoProvider(sp.GetRequiredService())); ===== Initialisierung ===== @inject ICryptoProvider CryptoProvider @code { protected override async Task OnInitializedAsync() { await CryptoProvider.InitializeAsync(); if (CryptoProvider.IsAvailable) { var version = CryptoProvider.GetOpenSslVersion(); Console.WriteLine($"OpenSSL WASM: {version}"); } } } ===== Erforderliche JS/WASM Dateien ===== In ''wwwroot/index.html'': ===== ML-DSA und ML-KEM ===== Die Methoden sind identisch mit ''NativeCryptoProvider'': // ML-KEM var (publicKey, privateKey) = await provider.GenerateMlKemKeyPairAsync("ML-KEM-768"); var (sharedSecret, ciphertext) = await provider.EncapsulateAsync(recipientPublicKey); byte[] sharedSecret = await provider.DecapsulateAsync(ciphertext, privateKey); // ML-DSA var (sigPub, sigPriv) = await provider.GenerateMlDsaKeyPairAsync("ML-DSA-65"); byte[] signature = await provider.SignMlDsaAsync(data, sigPriv); bool isValid = await provider.VerifyMlDsaAsync(data, signature, sigPub); ===== Zusätzliche WASM-spezifische Methoden ===== ==== Key Derivation ==== ^ Methode ^ Beschreibung ^ | ''Pbkdf2Async'' | PBKDF2 über Web Crypto API | | ''Pbkdf2WithPqSaltAsync'' | PBKDF2 mit PQ-verstärktem Salt | | ''Argon2idAsync'' | Memory-hard KDF via OpenSSL WASM | | ''HkdfDeriveKeyAsync'' | HKDF Extract + Expand | | ''DeriveHybridKeyAsync'' | Kombiniert klassisch + PQ Secret | ==== Stream/Chunked Encryption ==== ^ Methode ^ Beschreibung ^ | ''EncryptChunkedAsync'' | Chunked AES-GCM Verschlüsselung | | ''DecryptChunkedAsync'' | Chunked AES-GCM Entschlüsselung | | ''EncryptStreamWithPqKeyAsync'' | ML-KEM + chunked Encryption | | ''DecryptStreamWithPqKeyAsync'' | ML-KEM + chunked Decryption | ==== Utility ==== ^ Methode ^ Beschreibung ^ | ''RandomBytesAsync'' | Kryptographisch sichere Zufallszahlen via Web Crypto API | | ''CreateHybridSignatureAsync'' | Hybride Signatur erstellen | | ''DeriveTls13KeysAsync'' | TLS 1.3 Key Schedule | ===== Sicherheitshinweise ===== * **Erfordert .NET 8.0+** mit Blazor WebAssembly * Browser-Speicher ist weniger sicher als Server-Speicher * Private Keys sollten nicht langfristig im Browser gespeichert werden * Für sensible Operationen: Server-seitige Verarbeitung bevorzugen * ''openssl.wasm'' und ''wvds-crypto.js'' müssen korrekt geladen sein **Best Practices für Browser-Krypto:** * Ephemere Keys für Session-basierte Verschlüsselung verwenden * Sensible Private Keys auf Server belassen * IndexedDB/localStorage nicht für unverschlüsselte Keys verwenden * CSP-Header korrekt konfigurieren für WASM ===== Siehe auch ===== * [[.:start|Providers Namespace]] * [[.:icryptoprovider|ICryptoProvider]] * [[.:nativecryptoprovider|NativeCryptoProvider]] * [[de:int:pqcrypt:developer:integration|Integration Guide]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//