WebAssembly şifreleme: tarayıcıda neredeyse yerel kripto hızı
Tarayıcıda neredeyse yerel şifreleme hızları için WebAssembly kullanın. WASM crypto uygulamalarını karşılaştırın.
WASM derlenmiş kripto kütüphaneleri tarayıcıda yerel C hızının yaklaşık %60-80'inde çalışıyor; bu da saf JavaScript uygulamalarından 3-10 kat daha hızlı demek. Web Crypto API'sinde eksik olan şifreleme temelleri (ChaCha20-Poly1305, Argon2id, XChaCha20, Kyber gibi kuantum sonrası KEM'ler) için WASM, kullanılabilir performansa giden pratik yoldur. libsodium.js, 200 KB'lık WASM ikiliyle tam libsodium API'sini sağlayan baskın seçenek. AES-256-GCM gibi Web Crypto tarafından desteklenen temel bileşenler için tarayıcının donanım hızlandırmalı yerel uygulaması WASM'ı kolayca geride bırakıyor; dolayısıyla WASM her zaman doğru araç değil. Bu rehber ne zaman WASM'a başvuracağınızı ve dengeli değerlendirmeyi nasıl yapacağınızı ele alıyor.
Yerel Web Crypto'nun kazandığı durumlar
Web Crypto'nun zaten sunduğu algoritmalar için — AES-GCM, AES-CBC, AES-CTR, PBKDF2, HMAC, RSA-OAEP, ECDH, ECDSA, SHA-256/384/512 — tarayıcının yerel uygulaması, x86 üzerinde AES-NI ve mobilde ARMv8 kripto uzantıları aracılığıyla donanım hızlandırması kullanıyor. Tipik AES-256-GCM verimi:
- Web Crypto (Apple Silicon üzerinde Chrome): 1,7 GB/s
- Web Crypto (AES-NI'li Intel x86 üzerinde Chrome): 1,2 GB/s
- libsodium WASM AES-GCM: 400-800 MB/s
- Yerel OpenSSL referansı: 3-5 GB/s
WASM, sanal alan içinden AES-NI'ye erişemiyor; daha yavaş ama sabit zamanlı olan bit-dilimlenmiş AES uygulamalarına geri dönüyor. Web Crypto'nun desteklediği her şey için önce onu kullanın.
WASM'ın kazandığı durumlar
Web Crypto'da eksik algoritmalar için:
- ChaCha20-Poly1305: AES-NI olmayan cihazlarda AES'ten daha hızlı. 2026'da yerel tarayıcı desteği yok.
- XChaCha20-Poly1305: 192 bitlik nonce'lar, rastgele nonce kullanımını herhangi bir ölçekte güvenli kılıyor.
- Argon2id: PHC ödüllü parola karma fonksiyonu. Tarayıcı yerel desteği yok.
- X25519 / Ed25519: Safari 17 ve Firefox 129 yerel destek ekledi, ancak WASM hâlâ taşınabilir yol.
- BLAKE2b / BLAKE3: Web Crypto'da olmayan hızlı karma fonksiyonları.
- Kyber, Dilithium, SPHINCS+: Kuantum sonrası temel bileşenler; kütüphane gerektiriyor.
- Akışlı AEAD: libsodium'un
crypto_secretstream'i, büyük dosya akışlı şifrelemeyi temiz biçimde karşılıyor; Web Crypto'nun dengi yok.
Bu algoritmalar için JavaScript uygulamaları mevcut; ancak WASM'dan 5-20 kat daha yavaş. 1 GB'lık dosyada ChaCha20-Poly1305 ile WASM yaklaşık 2 saniyede tamamlanırken saf JS 15-40 saniye alıyor.
libsodium.js: Temel araç
libsodium-wrappers (Emscripten ile derlenmiş libsodium ve JS sarmalayıcıları) başvurulan kütüphane. Sıkıştırılmış olarak 200 KB WASM + ~50 KB JS sarmalayıcı.
import _sodium from 'libsodium-wrappers';
await _sodium.ready;
const sodium = _sodium;
// ChaCha20-Poly1305 kimlik doğrulamalı şifreleme
const key = sodium.crypto_aead_xchacha20poly1305_ietf_keygen();
const nonce = sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);
const ciphertext = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(
plaintext, null, null, nonce, key
);
"Sumo" derlemesi (daha fazla algoritma içerir) ~600 KB; varsayılan derleme, AEAD, parola karma (Argon2id), X25519 ve Ed25519 dahil kullanım durumlarının %90'ını kapsıyor.
Başlangıçtaki sayfa yüklenmesini engellememesi için WASM ikilisini dinamik olarak yükleyin:
async function getSodium() {
if (!window._sodium) {
const mod = await import('libsodium-wrappers');
await mod.ready;
window._sodium = mod;
}
return window._sodium;
}
crypto_secretstream ile Akışlı AEAD
Büyük dosya aktarımı için libsodium'un crypto_secretstream_xchacha20poly1305'i tarayıcıdaki en temiz akışlı AEAD çözümü:
const { state, header } = sodium.crypto_secretstream_xchacha20poly1305_init_push(key);
const chunk1 = sodium.crypto_secretstream_xchacha20poly1305_push(
state, plaintext1, null,
sodium.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE
);
// Son parça, alıcının kırpılmayı algılaması için TAG_FINAL kullanır
const chunkLast = sodium.crypto_secretstream_xchacha20poly1305_push(
state, plaintextLast, null,
sodium.crypto_secretstream_xchacha20poly1305_TAG_FINAL
);
TAG_FINAL işaretçisi, alıcının kırpma saldırılarını algılamasını sağlıyor — bir saldırgan sondaki parçaları düşürürse istemcide şifre çözme başarısız oluyor. Web Crypto'nun AES-GCM'si bu özelliğe sahip değil; kırpma algılamayı kendiniz oluşturmanız gerekiyor (AAD'de parça sayısı veya şifre çözme sonrası doğrulanmış genel dosya karması).
Tarayıcıda Argon2
Tarayıcıda parola tabanlı anahtar türetme için WASM üzerinden Argon2id, 2026'nın en iyi uygulaması. Seçenekler:
- argon2-browser: özel Argon2 WASM kütüphanesi, ~200 KB
- libsodium.js:
crypto_pwhasharacılığıyla Argon2id; libsodium zaten kullanılıyorsa - @noble/hashes: saf JS Argon2id, ~15 KB paket; WASM'dan 3-5 kat yavaş
argon2-browser örneği:
import argon2 from 'argon2-browser';
const result = await argon2.hash({
pass: password,
salt: salt, // Uint8Array, 16+ bayt
type: argon2.ArgonType.Argon2id,
time: 3,
mem: 65536, // KiB, yani 64 MiB
parallelism: 4,
hashLen: 32,
});
// result.hash, AES-256 anahtarı olarak kullanabileceğiniz bir Uint8Array
Parametreleri hedef kullanıcı bekleme süresine göre kalibre edin. OWASP 2024 temel değeri (m=19 MiB, t=2, p=1) ~300-500 ms'de çalışıyor. Daha güçlü (m=64 MiB, t=3, p=4) modern donanımda ~1-2 saniye alıyor.
WASM Aracılığıyla Kuantum Sonrası Kripto
Kyber (anahtar kapsülleme) ve Dilithium (imzalar) 2024'te NIST tarafından ML-KEM ve ML-DSA olarak standartlaştırıldı. JavaScript uygulamaları mevcut (pq-crystals referans içeriyor), ancak liboqs-js gibi WASM sürümleri daha hızlı ve denetlenmesi daha kolay.
Dosya aktarımı için, kuantum açısından güvenli açık anahtar temeli ile simetrik dosya anahtarını sarmak için kuantum sonrası KEM'ler kullanılabilir. Karma şemalar (ML-KEM + X25519) hem klasik hem de gelecekteki kuantum saldırganlarına karşı koruma sağlıyor. Chrome, ML-KEM'i sürüm 116'da (2023) TLS el sıkışmalarına dahil etti; ancak uygulama düzeyinde WASM, dosya içerik anahtarları için hâlâ geçerli yol.
Paket Boyutu Değerlendirmeleri
WASM ikilileri JS paketinin parçası olarak ya da tembel olarak alınıyor. Yaklaşık boyutlar (sıkıştırılmış):
- libsodium.js varsayılan: 200 KB
- libsodium.js sumo: 600 KB
- argon2-browser: 200 KB
- liboqs-js (kuantum sonrası): 1 MB+
Tarayıcıda şifreleyen bir açılış sayfası için, kullanıcı etkileşiminden sonra tembel yükleme yapılırsa 200-300 KB WASM makul. Şifrelemenin birincil özellik olduğu bir uygulama için ilk yüklemede WASM göndermek makul. Sonraki yüklemeleri anında tutmak için rel="modulepreload" ipuçları veya service worker önbelleği kullanın.
Her ziyarette yeniden indirmenin önüne geçmek için tarayıcı geliştirici araçlarının ağ panelinde WASM ikilisinin ilk yüklemenin ardından önbelleğe alındığını doğrulayın.
Derleme ve Başlatma Yükü
WebAssembly.instantiate() ikili dosyayı ayrıştırıp derliyor; masaüstünde 200 KB'lık modül için 20-100 ms, mobilde 100-500 ms alıyor. Bu her oturum için bir kez gerçekleşiyor. Sonraki yüklemeleri hızlandırmak için derlenmiş modülü WebAssembly.Module serileştirmesiyle IndexedDB'de önbelleğe alın.
WebAssembly.instantiateStreaming(), indirme ve derlemeyi paralel yürüterek alınan yanıta kıyasla instantiate()'ten %30-50 daha hızlı başlangıç sağlıyor:
const response = fetch('/sodium.wasm');
const { instance } = await WebAssembly.instantiateStreaming(response, importObject);
Bellek Yönetimi Tuzakları
WASM modülleri belleği lineer sayfalarda (her biri 64 KiB) ayırıyor. libsodium küçük bir başlangıç belleğiyle başlıyor ve gerektiğinde genişliyor; ancak sınırsız büyüme tarayıcı sınırlarına çarpabiliyor (tipik olarak 32 bit WASM'da 4 GB lineer bellek sınırı). Çok GB'lık dosya şifrelemesi için:
- Parçaları WASM modülünden akıtın, tam dosyayı WASM belleğine yüklemeyin
- Her parçanın ardından
sodium.memzeroveya referansları sıfırlayarak tamponu boşaltın - Uzun süreli oturumlarda
WebAssembly.Memory.buffer.byteLength'i izleyin
Memory64 (önerildi, Chrome'da kısmen uygulandı) 4 GB sınırını kaldırıyor. Şimdilik parçalı işleme güvenilir yol.
WASM'a Özgü Güvenlik Değerlendirmeleri
WASM, onu yükleyen sayfayla aynı kaynak içinde çalışıyor; aynı CSP ve CORS kurallarını devraliyor. Saldırgan, kaynağınıza kod enjekte ederse (XSS), WASM modülünün dışa aktarmalarını çağırabilir. WASM ek bir güvenlik sınırı sağlamıyor.
Sabit zaman garantileri: kripto kütüphaneleri C kaynağından WASM'a derlendiğinde genellikle sabit zaman özelliklerini koruyor; ancak WASM'dan JIT'e çeviri bazı platformlarda değişken zamanlı kod oluşturabiliyor. libsodium günlükleri birkaç WASM'a özgü sabit zaman sorununa dikkat çekiyor. Çoğu tehdit modeli için bu göz ardı edilebilir; yerel saldırganlara karşı hassas zamanlama ölçümleriyle savunmak isteyenler bu boşluğu değerlendirmeli.
Pratik Tarif
2026'da bir dosya aktarım uygulaması için:
- AES-256-GCM, PBKDF2, HMAC, SHA-256, RSA-OAEP için Web Crypto kullanın
- Parola karma için WASM üzerinden libsodium.js Argon2id kullanın
- Büyük dosyaların akışlı şifrelemesi için libsodium.js kullanın (
crypto_secretstream) - Desteklenen yerlerde yerel Ed25519/X25519, aksi takdirde libsodium kullanın
- İlk paketi hafif tutmak için kullanıcı etkileşiminden sonra WASM'ı tembel yükleyin
- Hedef cihazlarda kıyaslama yapın; masaüstü rakamlarının mobilde geçerli olmadığını varsaymayın
HexaTransfer, donanım hızlandırmalı yolun en hızlı olduğu toplu dosya şifrelemesi için Web Crypto AES-GCM'de kalıyor. WASM, yerel API'lerin karşılayamadığı algoritmalar için saklı tutuluyor.
hexatransfer.com'da deneyin — ücretsiz, hesap gerekmez, 10 GB'a kadar.
Uçtan uca şifreleme ile büyük dosyaları güvenle gönderin
Uçtan uca şifreleme ile 10 GB'a kadar dosya ücretsiz aktarın. Hesap gerekmez. Dosyalarınız yüklenmeden önce tarayıcınızda şifrelenir — başka kimse okuyamaz.
Dosya gönder