İçeriğe atla
HexaTransfer
Bloga dön
Sifreleme ve guvenlik

JavaScript şifreleme kütüphaneleri: geliştiriciler için en iyi seçimler

Web uygulamaları için en iyi JS şifreleme kütüphanelerini karşılaştırın. tweetnacl'den libsodium.js'ye doğru kütüphaneyi bulun.

2026'da dosya aktarımı için en iyi JavaScript şifreleme kütüphaneleri şunlardır: geniş kapsam ve WASM hızı için libsodium.js; modern denetimlerle saf JS implementasyonları için @noble/ciphers ve @noble/curves; küçük paket boyutuyla NaCl uyumlu primitifler için tweetnacl; eski kod uyumluluğu için crypto-js (yeni kod için kaçının); ve desteklediği her şey için yerel Web Crypto API. Bu rehber bunları algoritma kapsamı, paket boyutu, denetim geçmişi, tarayıcı ile Node uyumluluğu ve dosya şifreleme iş yüklerindeki gerçek dünya performansı açısından karşılaştırıyor. Doğru seçim; tarayıcılara mı gönderdiğinize, Node üzerinde mi geliştirdiğinize, ChaCha20-Poly1305 veya Argon2'ye ihtiyaç duyup duymadığınıza ya da Web Crypto'nun sınırları içinde kalıp kalamayacağınıza bağlıdır.

Karşılaştırma Tablosu

| Kütüphane | Boyut (sıkıştırılmış) | Arka uç | Temel algoritmalar | Denetlendi | Güncel? | |---|---|---|---|---|---| | Web Crypto API | 0 KB (yerel) | Tarayıcı yerel | AES-GCM, PBKDF2, RSA, ECDH, HMAC | Evet (tarayıcı üreticileri) | Evet, ChaCha/Argon2 yok | | libsodium.js | 200 KB WASM / 400 KB JS | WASM + JS geri dönüşü | libsodium'daki her şey | Evet (birden fazla) | Evet | | @noble/ciphers | 8 KB | Saf JS | AES, ChaCha20, Poly1305, GCM-SIV | Evet (Cure53 2023) | Evet | | @noble/curves | 35 KB | Saf JS | Ed25519, X25519, secp256k1, BLS | Evet (Trail of Bits, Cure53) | Evet | | tweetnacl | 15 KB | Saf JS | Curve25519, Ed25519, XSalsa20-Poly1305 | Evet (orijinal NaCl denetimi) | Çoğunlukla, ChaCha20 yok | | crypto-js | 50 KB | Saf JS | AES-CBC, SHA, HMAC, PBKDF2 | Güncel denetim yok | Hayır, 2023'ten beri bakımsız | | node:crypto | 0 KB (Node yerel) | Node yerel (OpenSSL) | Kapsamlı | Evet (OpenSSL) | Evet |

libsodium.js: İsviçre Çakısı

libsodium.js (libsodium'un Emscripten ile derlenmiş sürümü), Web Crypto yetmediğinde varsayılan seçimdir. XChaCha20-Poly1305, Ed25519, X25519, Argon2id, BLAKE2b ve akış AEAD için crypto_secretstream API'sini kapsar. WASM sürümü, tipik donanımda yerel libsodium hızının yaklaşık yüzde 50-70'i oranında çalışır.

import _sodium from 'libsodium-wrappers';
await _sodium.ready;
const sodium = _sodium;

const key = sodium.crypto_secretstream_xchacha20poly1305_keygen();
const { state, header } = sodium.crypto_secretstream_xchacha20poly1305_init_push(key);
const chunk = sodium.crypto_secretstream_xchacha20poly1305_push(
  state, new Uint8Array([1,2,3]), null,
  sodium.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE
);

Akış API'si, büyük dosya aktarımları için belirleyici özelliktir. 5 GB'lık bir dosyayı tamamını belleğe yüklemeksizin parça parça şifreleyebilirsiniz; her parça kendi kimlik doğrulama etiketini taşıdığından bozulma yalnızca sonda değil parça düzeyinde algılanır.

Ödünleşimler: 200 KB WASM gönderilecek büyük bir boyuttur. Kütüphane yalnızca şifreleme gerçekten gerektiğinde yüklensin diye dinamik import kullanın (await import('libsodium-wrappers')). Sumo sürümü (tüm algoritmalar dahil) 600 KB'ın üzerindedir; ek algoritmalara ihtiyaç duymadıkça varsayılan sürümde kalın.

@noble: Küçük, Denetlenmiş, Modern

Paul Miller'ın @noble ailesi (@noble/ciphers, @noble/curves, @noble/hashes), saf JavaScript kripto için günümüzün en iyi seçimidir. Cure53 (ciphers, 2023) ve Trail of Bits (curves, 2022) tarafından denetlenmiş, sıfır bağımlılık, tree-shakeable, TypeScript-yerel.

import { gcm } from '@noble/ciphers/aes';
import { randomBytes } from '@noble/ciphers/webcrypto';

const key = randomBytes(32);
const nonce = randomBytes(12);
const ciphertext = gcm(key, nonce).encrypt(plaintext);

@noble WASM kullanmaz, dolayısıyla paket etkisi küçüktür (ciphers için 8 KB). Toplu AES-GCM için libsodium'un WASM'ından yüzde 30-50 daha yavaştır; ancak çoğu aktarım senaryosu için yeterlidir. Saf JS yaklaşımı aynı zamanda tarayıcılarda, Node, Deno, Bun ve React Native'de yerel modül kaygısı olmaksızın aynı biçimde çalışmasını sağlar.

@noble'ı şu durumlarda kullanın: paket boyutu önemliyse, tree-shakeable saf JS kütüphanesi istiyorsanız veya WASM'ın sorunlu olduğu bir platformdaysanız.

tweetnacl: Minimalist

tweetnacl-js, Daniel J. Bernstein'ın TweetNaCl C kütüphanesini JavaScript'e taşır. Sıkıştırılmış 15 KB. Curve25519 anahtar değişimi, Ed25519 imzaları ve XSalsa20-Poly1305 kimlik doğrulamalı şifrelemeyi kapsar. Orijinal NaCl çabası kapsamında denetlenmiştir; ancak yakın zamanda değil.

import nacl from 'tweetnacl';

const key = nacl.randomBytes(32);
const nonce = nacl.randomBytes(24);
const ciphertext = nacl.secretbox(plaintext, nonce, key);

API kasıtlı olarak küçüktür: NaCl'ın sağladığından fazlasına ihtiyacınız varsa (örneğin JS dışı sistemlerle birlikte çalışabilirlik için AES-GCM), başka yere bakın. Saf NaCl protokol uygulamaları için tweetnacl hâlâ makul bir seçimdir; ancak @noble/ciphers ve @noble/curves, daha güncel bakımla aynı alanı karşılar.

crypto-js: Yeni Kodda Kullanmayın

crypto-js, 2015'te tarayıcı kriptosuna hâkimdi. 2026'da bir yükümlülük hâline geldi. Son anlamlı sürüm 2021'deydi (4.1.1); depo 2023'te etkin olarak arşivlendi. Paroladan anahtar türetme için güvensiz bir şema kullanarak AES-CBC'yi varsayılan olarak alır (birkaç MD5 turu üzerinden OpenSSL'nin EVP_BytesToKey tarzı). CVE-2023-46233, zayıf PBKDF2 varsayılanlarını işaretledi.

crypto-js kullanan eski kodu yönetiyorsanız @noble/ciphers veya Web Crypto'ya taşımak basit ve değerlidir. 2026'da sıfırdan başlıyorsanız crypto-js'i tamamen atlayın.

Sunucu Kodu için node:crypto

Node'un yerleşik crypto modülü OpenSSL'i sarmalar ve bu listedeki en geniş algoritma kapsamına sahiptir. Node 18+'da require('crypto').webcrypto, Web Crypto uyumlu bir API sunar; dolayısıyla izomorfik kod sunucu ve istemcide çalışır.

import { createCipheriv, randomBytes } from 'crypto';

const key = randomBytes(32);
const iv = randomBytes(12);
const cipher = createCipheriv('aes-256-gcm', key, iv);
const ct = Buffer.concat([cipher.update(plaintext), cipher.final()]);
const tag = cipher.getAuthTag();

Web Crypto ile şifrelenmiş dosyaların sunucu taraflı şifre çözme işlemleri için bu en temiz yoldur. Dosya aktarım hizmetiniz sunucu tarafında bir şeyin şifresini çözüyorsa (sıfır bilgi tasarımlarında nadir, eski sistemlerin şifrelemeye geçişinde yaygın), node:crypto kullanın.

Gerçek Dosya Şifrelemesinde Performans

MacBook Air M2'de AES-256-GCM ile 100 MB tampon şifreleme karşılaştırması:

  • Web Crypto API (Chrome 120): 340 ms (donanım hızlandırmalı)
  • Web Crypto API (Safari 17): 280 ms (Apple Silicon'da donanım hızlandırmalı)
  • libsodium.js WASM: 420 ms
  • @noble/ciphers: 1.850 ms (saf JS'de donanım hızlandırma yok)
  • tweetnacl (XSalsa20): 1.200 ms
  • node:crypto: 180 ms (yerel OpenSSL)

Sonuç: AES-NI kullandığı için büyük dosyalarda Web Crypto kazanır. Saf JS küçük veri yükleri için yeterlidir; ancak çok gigabaytlık aktarımlarda saniyelerce ekleme yapar. 5 GB'lık bir yükleme için Web Crypto ile @noble/ciphers arasındaki fark 2 dakika ile 10 dakikalık şifreleme süresi olabilir.

Parola Hashing: Argon2 veya Daha İyisi Yok

PBKDF2 temel gereksinimdir; ancak Argon2id daha iyidir. Seçenekler:

  • argon2-browser: WASM derlenmiş referans implementasyonu, 200 KB
  • @noble/hashes: saf JS Argon2id, 15 KB, daha yavaş ama saf
  • libsodium.js: crypto_pwhash üzerinden Argon2id, 200 KB; ancak libsodium zaten kullanılıyorsa bunu da alırsınız

Tarayıcı bağlamlarında parola türetilen şifreleme anahtarları için Argon2id'yi en az 3 iterasyon, 64 MiB bellek ve 4 paralelizmle kullanın (OWASP 2024 rehberi).

Yığınınız için Seçim

  • AES-GCM şifreleme ile basit bir dosya aktarımı geliştiriyorsanız: Doğrudan Web Crypto kullanın, kütüphane gerekmez. HexaTransfer bu örüntüyü izler.
  • ChaCha20-Poly1305 veya akış AEAD'a ihtiyacınız varsa: libsodium.js.
  • WASM konusunda endişeleniyorsanız veya kısıtlı paketleyicilere gönderiyorsanız: @noble/ciphers + @noble/curves.
  • NaCl protokol anahtarları kullanıyorsanız (örn. şifreli dosya alımı için mühürlü kutular): @noble veya libsodium; crypto-js değil.
  • crypto-js'den göç ediyorsanız: paket boyutu önemliyse @noble'a, değilse libsodium.js'ye geçin.
  • Kuantum sonrası imzalara veya KEM'e ihtiyacınız varsa: Henüz olgun JS kütüphanesi yok; @noble/post-quantum'u kontrol edin (2026 başı itibarıyla ön sürüm).

Denetim ve Bakım Sinyalleri

Bir kripto kütüphanesi benimsemeden önce şunları kontrol edin:

  • Son taahhüt tarihi (18 aydan eski her şey risklidir)
  • Kamuya açık denetim raporları (Cure53, Trail of Bits, NCC Group)
  • Çözümlenmemiş güvenlik sorunları için konu takipçisi
  • Bağımlılık sayısı (az bağımlılık = daha küçük saldırı yüzeyi)
  • Haftalık npm indirme sayısı (yüksek = koda daha fazla göz)

JavaScript ekosistemi tedarik zinciri olayları yaşadı (event-stream, ua-parser-js, colors); bu durum minimal bağımlılıkları bir güvenlik özelliği hâline getiriyor. Sıfır çalışma zamanı bağımlılıklarına sahip kripto kütüphaneleri (@noble ailesi, tweetnacl), çok sayıda polyfill ve yardımcı kütüphane çekenlere kıyasla uçtan uca denetimi daha kolaydır.

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