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