Kort svar

På hardware med AES-acceleration (AES-NI på næsten alle moderne servere og laptops) er AES-GCM hurtigst. På enheder uden den acceleration — mange ældre telefoner, billige IoT-enheder, visse ARM-chips — er ChaCha20-Poly1305 betydeligt hurtigere, fordi den er designet til at køre effektivt i software. Derfor er det rigtige svar at tilbyde begge og lade klienten vælge.

Hvad de to har til fælles

Begge er AEAD — Authenticated Encryption with Associated Data. Det betyder at de krypterer og autentificerer i én operation, så der ikke er en separat MAC-trin (som ved de gamle CBC-suites). AEAD eliminerer en hel klasse af angreb som padding oracle-fejl. Begge bruges i både TLS 1.2 og TLS 1.3, og begge regnes som sikre med fuld 256-bit (ChaCha20) eller 128/256-bit (AES) styrke.

Den afgørende faktor: AES-NI

AES-GCM er hurtig fordi CPU'en har dedikerede AES-instruktioner (AES-NI på x86, tilsvarende på moderne ARM). Med dem krypterer AES-GCM flere gigabyte i sekundet. Uden dem skal AES køres i ren software, hvor det er langsomt og — værre — sårbart over for timing-baserede sidekanalangreb. ChaCha20 blev designet til at være hurtig og konstant-tid i software uden specialinstruktioner.

Scenarie Hurtigst
Server/laptop med AES-NIAES-GCM
Ældre telefon uden AES-accelerationChaCha20-Poly1305
Lav-effekt IoT / billig ARMChaCha20-Poly1305
Moderne high-end mobil (med acceleration)Stort set ens

Mål det på din egen CPU

OpenSSL kan måle den rå gennemstrømning på din maskine:

openssl speed -evp aes-256-gcm
openssl speed -evp chacha20-poly1305

På en moderne x86-server med AES-NI vil aes-256-gcm typisk vise højere tal. Slå AES-NI fra (eller kør på en chip uden), og forholdet vender. Det er hele pointen: der findes ikke ét universelt svar.

Hvorfor du skal lade klienten vælge

Da den hurtigste cipher afhænger af klientens hardware, er den rigtige serverkonfiguration at tilbyde begge og ikke tvinge en serverpræference. Så vælger en moderne server-til-server-forbindelse AES-GCM, mens en gammel telefon vælger ChaCha20 — hver får sin hurtigste mulighed. Det er præcis derfor Mozillas intermediate-profil sætter ssl_prefer_server_ciphers off.

# nginx — tilbyd begge, lad klienten vælge
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:\
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;

Hvordan de er bygget — kort og uden hype

AES-GCM kombinerer AES i counter-modus (selve krypteringen) med GMAC (autentificeringen). ChaCha20-Poly1305 kombinerer ChaCha20-stream-ciphen med Poly1305-MAC'en. Begge er konstruktioner hvor kryptering og integritet sker sammen — det er det "AEAD" betyder. En vigtig fælde gælder begge: de må aldrig genbruge den samme nonce med den samme nøgle. Gør de det, kollapser sikkerheden. I TLS håndteres dette korrekt af protokollen selv, så det er ikke noget du skal bekymre dig om i en almindelig serverkonfiguration — men det forklarer hvorfor man ikke selv skal rulle sin egen AEAD-brug uden for et velafprøvet bibliotek.

Hvad det betyder i praksis for dig

For en typisk webserver med moderne CPU'er er forskellen i gennemstrømning sjældent flaskehalsen — netværk og applikationslogik dominerer. Hvor det reelt betyder noget er to steder: høj-volumen API-trafik fra servere uden AES-acceleration, og mobile klienter på batteri, hvor ChaCha20's lavere CPU-forbrug oversættes til længere batterilevetid. Konklusionen forbliver den samme uanset: tilbyd begge, tving ikke en præference, og lad hver klient vinde på sin egen hardware.

Hvad med TLS 1.3?

I TLS 1.3 hedder de to suites TLS_AES_128_GCM_SHA256/TLS_AES_256_GCM_SHA384 og TLS_CHACHA20_POLY1305_SHA256. Begge er blandt de fem standardiserede suites, og forhandlingen fungerer på samme måde — klienten signalerer hvad den foretrækker. Læs hvordan navnene er bygget op i hvad er en cipher suite.

Det handler om at have begge — overalt

Den typiske fejl er ikke at vælge forkert cipher, men at en server kun tilbyder den ene — ofte fordi en hardening-skabelon fjernede ChaCha20 og dermed straffer alle klienter uden AES-NI. CertControl registrerer hvilke AEAD-ciphers hvert endpoint faktisk tilbyder, så I kan se hvor begge er til stede og hvor en server utilsigtet er endt med kun den ene. Se de farlige modstykker i hvorfor RC4 og 3DES er farlige.

Ofte stillede spørgsmål

Er ChaCha20-Poly1305 mindre sikkert end AES-GCM?

Nej. Begge er moderne AEAD-ciphers uden kendte praktiske svagheder. ChaCha20-Poly1305 bruges af store udbydere i stor skala. Forskellen er udelukkende ydeevne afhængigt af hardware, ikke sikkerhed.

Hvorfor er ChaCha20 hurtigere på telefoner?

Mange mobile og lav-effekt-CPU'er mangler hardware-acceleration til AES. ChaCha20 er designet til at være hurtig i ren software, så på de enheder slår den AES-GCM markant — derfor foretrækker mobile browsere ofte ChaCha20.

Hvad er AES-NI?

AES-NI er et sæt CPU-instruktioner der udfører AES-kryptering i hardware. Med dem er AES-GCM ekstremt hurtig og konstant-tid. Næsten alle moderne x86-servere og laptops har AES-NI.

Hvilken skal jeg vælge på min server?

Begge. Tilbyd både AES-GCM og ChaCha20-Poly1305 og sæt ikke en serverpræference, så hver klient automatisk får den der er hurtigst på dens hardware.

Betyder rækkefølgen i ssl_ciphers noget?

Kun hvis serverpræference er slået til. Med prefer_server_ciphers off ignoreres din rækkefølge, og klientens præference afgør — hvilket er det rigtige når du tilbyder både AES-GCM og ChaCha20.