Inhaltsverzeichnis

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:

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<ICryptoProvider>(sp =>
    new WasmCryptoProvider(sp.GetRequiredService<IJSRuntime>()));

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:

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

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


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