Inhaltsverzeichnis

WasmCryptoProvider

Namespace: WvdS.System.Security.Cryptography.Providers

Provider crittografico basato su JavaScript Interop per Blazor WebAssembly. Comunica tramite IJSRuntime con openssl.wasm.

Panoramica

Il WasmCryptoProvider abilita la crittografia post-quantum in applicazioni Blazor WebAssembly attraverso:

Architettura

Blazor WebAssembly
      |
      v
+-----------------+
| WasmCrypto-     |
| Provider        |
| (C#)            |
+--------+--------+
         | IJSRuntime.InvokeAsync
         v
+-----------------+
| wvds-crypto.js  |
| (JavaScript)    |
+--------+--------+
         |
         v
+-----------------+
| openssl.wasm    |
| (WebAssembly)   |
+-----------------+

Proprieta

Proprieta Tipo Descrizione
Name string "WASM (JS Interop)"
IsAvailable bool true se inizializzato

Dependency Injection

// Program.cs (Blazor WebAssembly)
builder.Services.AddScoped<ICryptoProvider>(sp =>
    new WasmCryptoProvider(sp.GetRequiredService<IJSRuntime>()));

Inizializzazione

@inject ICryptoProvider CryptoProvider
 
@code {
    protected override async Task OnInitializedAsync()
    {
        await CryptoProvider.InitializeAsync();
 
        if (CryptoProvider.IsAvailable)
        {
            var version = CryptoProvider.GetOpenSslVersion();
            Console.WriteLine($"OpenSSL WASM: {version}");
        }
    }
}

File JS/WASM richiesti

In wwwroot/index.html:

<head>
    <!-- Modulo OpenSSL WASM -->
    <script src="_content/WvdS.Crypto/openssl.js"></script>
 
    <!-- Wrapper WvdS Crypto -->
    <script src="_content/WvdS.Crypto/wvds-crypto.js"></script>
</head>

ML-DSA e ML-KEM

I metodi sono identici a 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);

Metodi aggiuntivi specifici WASM

Key Derivation

Metodo Descrizione
Pbkdf2Async PBKDF2 via Web Crypto API
Pbkdf2WithPqSaltAsync PBKDF2 con salt rafforzato PQ
Argon2idAsync KDF memory-hard via OpenSSL WASM
HkdfDeriveKeyAsync HKDF Extract + Expand
DeriveHybridKeyAsync Combina secret classico + PQ

Cifratura Stream/Chunked

Metodo Descrizione
EncryptChunkedAsync Cifratura AES-GCM a chunk
DecryptChunkedAsync Decifratura AES-GCM a chunk
EncryptStreamWithPqKeyAsync ML-KEM + cifratura chunked
DecryptStreamWithPqKeyAsync ML-KEM + decifratura chunked

Utility

Metodo Descrizione
RandomBytesAsync Numeri casuali crittograficamente sicuri via Web Crypto API
CreateHybridSignatureAsync Creare firma ibrida
DeriveTls13KeysAsync Key Schedule TLS 1.3

Note sulla sicurezza

  • Richiede .NET 8.0+ con Blazor WebAssembly
  • La memoria del browser e meno sicura della memoria del server
  • Le chiavi private non dovrebbero essere memorizzate a lungo termine nel browser
  • Per operazioni sensibili: preferire elaborazione lato server
  • openssl.wasm e wvds-crypto.js devono essere caricati correttamente

Best Practice per crittografia nel browser:

  • Usare chiavi effimere per cifratura basata su sessione
  • Mantenere chiavi private sensibili sul server
  • Non usare IndexedDB/localStorage per chiavi non cifrate
  • Configurare correttamente gli header CSP per WASM

Vedi anche


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional