====== WasmCryptoProvider ====== **Imenski prostor:** ''WvdS.System.Security.Cryptography.Providers'' Kriptografski ponudnik na osnovi JavaScript Interop za Blazor WebAssembly. Komunicira preko ''IJSRuntime'' z ''openssl.wasm''. ===== Pregled ===== ''WasmCryptoProvider'' omogoča post-kvantno kriptografijo v aplikacijah Blazor WebAssembly z: * JavaScript Interop do OpenSSL, prevedenega v WebAssembly * Popolnoma asinhroni API (potreben za JS Interop) * Identična funkcionalnost kot ''NativeCryptoProvider'' ===== Arhitektura ===== Blazor WebAssembly | v +-----------------+ | WasmCrypto- | | Provider | | (C#) | +--------+--------+ | IJSRuntime.InvokeAsync v +-----------------+ | wvds-crypto.js | | (JavaScript) | +--------+--------+ | v +-----------------+ | openssl.wasm | | (WebAssembly) | +-----------------+ ===== Lastnosti ===== ^ Lastnost ^ Tip ^ Opis ^ | ''Name'' | string | ''%%"WASM (JS Interop)"%%'' | | ''IsAvailable'' | bool | ''true'', ko je inicializiran | ===== Dependency Injection ===== // Program.cs (Blazor WebAssembly) builder.Services.AddScoped(sp => new WasmCryptoProvider(sp.GetRequiredService())); ===== Inicializacija ===== @inject ICryptoProvider CryptoProvider @code { protected override async Task OnInitializedAsync() { await CryptoProvider.InitializeAsync(); if (CryptoProvider.IsAvailable) { var version = CryptoProvider.GetOpenSslVersion(); Console.WriteLine($"OpenSSL WASM: {version}"); } } } ===== Potrebne datoteke JS/WASM ===== V ''wwwroot/index.html'': ===== ML-DSA in ML-KEM ===== Metode so identične kot pri ''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); ===== Dodatne metode, specifične za WASM ===== ==== Izpeljava ključev ==== ^ Metoda ^ Opis ^ | ''Pbkdf2Async'' | PBKDF2 preko Web Crypto API | | ''Pbkdf2WithPqSaltAsync'' | PBKDF2 s PQ-ojačano soljo | | ''Argon2idAsync'' | KDF, odporen na pomnilnik, preko OpenSSL WASM | | ''HkdfDeriveKeyAsync'' | HKDF Extract + Expand | | ''DeriveHybridKeyAsync'' | Kombinira klasično + PQ skrivnost | ==== Šifriranje po kosih/tokih ==== ^ Metoda ^ Opis ^ | ''EncryptChunkedAsync'' | Šifriranje AES-GCM po kosih | | ''DecryptChunkedAsync'' | Dešifriranje AES-GCM po kosih | | ''EncryptStreamWithPqKeyAsync'' | ML-KEM + šifriranje po kosih | | ''DecryptStreamWithPqKeyAsync'' | ML-KEM + dešifriranje po kosih | ==== Pomožne funkcije ==== ^ Metoda ^ Opis ^ | ''RandomBytesAsync'' | Kriptografsko varna naključna števila preko Web Crypto API | | ''CreateHybridSignatureAsync'' | Ustvari hibridni podpis | | ''DeriveTls13KeysAsync'' | Razpored ključev TLS 1.3 | ===== Varnostne opombe ===== * **Zahteva .NET 8.0+** z Blazor WebAssembly * Pomnilnik brskalnika je manj varen kot pomnilnik strežnika * Zasebni ključi se ne smejo dolgoročno hraniti v brskalniku * Za občutljive operacije: raje uporabite strežniško obdelavo * ''openssl.wasm'' in ''wvds-crypto.js'' morata biti pravilno naložena **Najboljše prakse za kriptografijo v brskalniku:** * Uporabljajte kratkoživljajoče ključe za šifriranje na podlagi sej * Občutljive zasebne ključe pustite na strežniku * Ne uporabljajte IndexedDB/localStorage za nešifrirane ključe * Pravilno konfigurirajte CSP-glave za WASM ===== Glejte tudi ===== * [[.:start|Imenski prostor Providers]] * [[.:icryptoprovider|ICryptoProvider]] * [[.:nativecryptoprovider|NativeCryptoProvider]] * [[..:..:developer:integration|Vodnik za integracijo]] ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//