Ga naar inhoud
HexaTransfer
Terug naar blog
Encryptie & beveiliging

JavaScript encryptiebibliotheken: topkeuzes voor ontwikkelaars

Vergelijk de beste JS-encryptiebibliotheken. Van tweetnacl tot libsodium.js, vind de juiste voor uw project.

De beste JavaScript-encryptiebibliotheken voor bestandsoverdracht in 2026 zijn libsodium.js voor brede dekking en WASM-snelheid, @noble/ciphers en @noble/curves voor pure-JS-implementaties met recente audits, tweetnacl voor kleine bundelgrootte met NaCl-compatibele primitieven, crypto-js voor legacy-compatibiliteit (vermijd voor nieuwe code) en de native Web Crypto API voor alles wat het ondersteunt. Deze gids vergelijkt ze op algoritmendekking, bundelgrootte, auditgeschiedenis, browser- versus Node-compatibiliteit en werkelijke prestaties op bestandsversleutelingsworkloads. De juiste keuze hangt af van of je levert aan browsers, bouwt op Node, ChaCha20-Poly1305 of Argon2 nodig hebt, of binnen de grenzen van Web Crypto kunt blijven.

Vergelijkingstabel

| Bibliotheek | Grootte (gzipped) | Backend | Kernalgoritmen | Geauditeerd | Modern? | |---|---|---|---|---|---| | Web Crypto API | 0 KB (native) | Browser native | AES-GCM, PBKDF2, RSA, ECDH, HMAC | Ja (door browserleveranciers) | Ja, maar geen ChaCha/Argon2 | | libsodium.js | 200 KB WASM / 400 KB JS | WASM + JS fallback | Alles in libsodium | Ja (meerdere) | Ja | | @noble/ciphers | 8 KB | Pure JS | AES, ChaCha20, Poly1305, GCM-SIV | Ja (Cure53 2023) | Ja | | @noble/curves | 35 KB | Pure JS | Ed25519, X25519, secp256k1, BLS | Ja (Trail of Bits, Cure53) | Ja | | tweetnacl | 15 KB | Pure JS | Curve25519, Ed25519, XSalsa20-Poly1305 | Ja (originele NaCl-audit) | Grotendeels, mist ChaCha20 | | crypto-js | 50 KB | Pure JS | AES-CBC, SHA, HMAC, PBKDF2 | Geen recente audit | Nee, onderhoud gestopt in 2023 | | node:crypto | 0 KB (Node native) | Node native (OpenSSL) | Uitgebreid | Ja (OpenSSL) | Ja |

libsodium.js: het Zwitserse zakmes

libsodium.js (de Emscripten-gecompileerde build van libsodium) is de standaardkeuze wanneer Web Crypto niet genoeg is. Het dekt XChaCha20-Poly1305, Ed25519, X25519, Argon2id, BLAKE2b en de crypto_secretstream API voor streaming AEAD. De WASM-build draait op ruwweg 50-70% van native libsodium-snelheid op typische hardware.

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
);

De streaming API is de doorslaggevende functie voor grote bestandsoverdrachten. Je kunt een bestand van 5 GB stuk voor stuk versleutelen zonder het geheel in het geheugen te laden, en elk stuk heeft zijn eigen authenticatietag zodat corruptie per stuk wordt gedetecteerd, niet alleen aan het einde.

Nadelen: 200 KB WASM is veel om te verzenden. Gebruik dynamische imports (await import('libsodium-wrappers')) zodat de bibliotheek alleen laadt wanneer encryptie daadwerkelijk nodig is. De sumo-build (bevat alle algoritmen) is 600 KB+; blijf bij de standaardbuild tenzij je de extra's nodig hebt.

@noble: klein, geauditeerd, modern

Paul Miller's @noble-familie (@noble/ciphers, @noble/curves, @noble/hashes) is de huidige beste pure-JavaScript-crypto. Geauditeerd door Cure53 (ciphers, 2023) en Trail of Bits (curves, 2022), nul afhankelijkheden, tree-shakeable, TypeScript-native.

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 gebruikt geen WASM, dus bundelimpact is klein (8 KB voor ciphers). Prestaties zijn 30-50% langzamer dan libsodium's WASM voor bulk AES-GCM, maar goed genoeg voor de meeste overdrachtsscenario's. De pure-JS-aanpak betekent ook dat het identiek werkt in browsers, Node, Deno, Bun en React Native zonder problemen met native modules.

Gebruik @noble wanneer bundelgrootte telt, wanneer je een tree-shakeable pure-JS-bibliotheek wilt, of wanneer je op een platform zit waar WASM ruwe kanten heeft.

tweetnacl: de minimalist

tweetnacl-js portert Daniel J. Bernstein's TweetNaCl C-bibliotheek naar JavaScript. 15 KB gzipped. Dekt Curve25519 sleuteluitwisseling, Ed25519 handtekeningen en XSalsa20-Poly1305 geauthenticeerde versleuteling. Geauditeerd als onderdeel van de originele NaCl-inspanning, al is dit niet recent.

import nacl from 'tweetnacl';

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

De API is bewust klein: als je meer nodig hebt dan NaCl biedt (bijv. AES-GCM voor interoperabiliteit met niet-JS systemen), kijk dan elders. Voor pure NaCl-protocolapps is tweetnacl nog steeds een redelijke keuze, al dekt @noble/ciphers plus @noble/curves hetzelfde terrein met actuelere onderhoudsgeschiedenis.

crypto-js: gebruik het niet voor nieuwe code

crypto-js domineerde browser-crypto in 2015. In 2026 is het een aansprakelijkheid. Laatste betekenisvolle release was 2021 (4.1.1); de repo werd feitelijk gearchiveerd in 2023. Standaard gebruikt het AES-CBC met een onveilige sleutelafleiding van wachtwoorden (OpenSSL's EVP_BytesToKey-stijl schema), dat sleutels afleidt via een paar rondes MD5. CVE-2023-46233 markeerde zwakke PBKDF2-standaardwaarden.

Als je legacy code onderhoudt die crypto-js gebruikt, is migreren naar @noble/ciphers of Web Crypto eenvoudig en de moeite waard. Als je in 2026 nieuw begint, sla crypto-js volledig over.

node:crypto voor servercode

Node's ingebouwde crypto-module omhult OpenSSL en heeft de breedste algoritmendekking van alles op deze lijst. Op Node 18+ stelt require('crypto').webcrypto een Web Crypto-compatibele API beschikbaar, zodat isomorfe code zowel op server als client werkt.

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();

Voor server-side ontsleuteling van Web Crypto-versleutelde bestanden is dit het meest directe pad. Als je bestandsoverdrachtsservice iets server-side ontsleutelt (zeldzaam in zero-knowledge ontwerpen, maar gebruikelijk in legacy systemen die migreren naar encryptie), gebruik dan node:crypto.

Prestaties op werkelijke bestandsversleuteling

Benchmarks op een MacBook Air M2 bij het versleutelen van een 100 MB buffer met AES-256-GCM:

  • Web Crypto API (Chrome 120): 340 ms (hardwareversneld)
  • Web Crypto API (Safari 17): 280 ms (hardwareversneld op Apple Silicon)
  • libsodium.js WASM: 420 ms
  • @noble/ciphers: 1.850 ms (geen hardwareversnelling in pure JS)
  • tweetnacl (XSalsa20): 1.200 ms
  • node:crypto: 180 ms (native OpenSSL)

Conclusie: Web Crypto wint voor grote bestanden omdat het AES-NI gebruikt. Pure JS is prima voor kleine payloads maar voegt seconden toe bij overdrachten van meerdere gigabytes. Voor een upload van 5 GB kan het verschil tussen Web Crypto en @noble/ciphers 2 minuten versus 10 minuten versleutelingstijd zijn.

Wachtwoord-hashing: Argon2 of niets

PBKDF2 is het minimum, maar Argon2id is beter. Opties:

  • argon2-browser: WASM-gecompileerde referentie-implementatie, 200 KB
  • @noble/hashes: pure-JS Argon2id, 15 KB, langzamer maar puur
  • libsodium.js: Argon2id via crypto_pwhash, 200 KB maar je hebt het toch al als je libsodium gebruikt

Gebruik Argon2id met minstens 3 iteraties, 64 MiB geheugen en 4 parallelisme voor wachtwoordafgeleide versleutelingssleutels in browserkontexten (OWASP 2024-richtlijnen).

Kiezen voor jouw stack

  • Je bouwt een eenvoudige bestandsoverdracht met AES-GCM versleuteling: gebruik Web Crypto direct, geen bibliotheek. HexaTransfer volgt dit patroon.
  • Je hebt ChaCha20-Poly1305 of streaming AEAD nodig: libsodium.js.
  • Je bent bezorgd over WASM of levert aan beperkte bundlers: @noble/ciphers + @noble/curves.
  • Je gebruikt NaCl-protocolsleutels (bijv. sealed boxes voor ontvangst van versleutelde bestanden): @noble of libsodium, niet crypto-js.
  • Je migreert van crypto-js: ga naar @noble als bundelgrootte telt, anders libsodium.js.
  • Je hebt post-kwantumhandtekeningen of KEM nodig: nog geen volwassen JS-bibliotheek; controleer @noble/post-quantum (pre-release begin 2026).

Audit- en onderhoudssignalen

Controleer voor het adopteren van een cryptobibliotheek:

  • Datum van laatste commit (alles ouder dan 18 maanden is riskant)
  • Openbare auditrapporten (Cure53, Trail of Bits, NCC Group)
  • Issue tracker voor onopgeloste beveiligingsproblemen
  • Aantal afhankelijkheden (minder = kleiner aanvalsoppervlak)
  • Wekelijkse npm-downloads (meer = meer ogen op de code)

Het JavaScript-ecosysteem heeft supply-chain-incidenten gehad (event-stream, ua-parser-js, colors) die minimale afhankelijkheden tot een beveiligingseigenschap maken. Cryptobibliotheken zonder runtime-afhankelijkheden (@noble-familie, tweetnacl) zijn van begin tot eind gemakkelijker te auditeren dan die polyfills en hulpprogramma's binnenhalen.

Probeer het op hexatransfer.com — gratis, zonder account, tot 10 GB.

Verstuur grote bestanden veilig met end-to-end-versleuteling

Draag bestanden tot 10 GB gratis over met end-to-end-versleuteling. Geen account nodig. Uw bestanden worden in uw browser versleuteld voordat ze worden geüpload — niemand anders kan ze lezen.

Een bestand verzenden