AES-GCM czy ChaCha20-Poly1305: wybór szyfru danych VPN
AES-GCM to oczywisty wybór na serwerach z akceleracją sprzętową, a ChaCha20-Poly1305 dobrze działa bez niej. Być może protokół zdecyduje za ciebie.
Obie nazwy to konstrukcje AEAD, obie są znormalizowane, a na współczesnym serwerze x86 każda z nich wypełni łącze gigabitowe bez widocznego wysiłku. Wybór przestaje być dowolny, gdy opuszczasz ten serwer: tanie routery, starsze telefony i urządzenia wirtualne często nie mają akceleracji AES, a tam różnica jest duża. Porównanie nie dotyczy więc tego, który szyfr jest szybszy, ale tego, który szyfr dobrze działa na tym zbiorze punktów końcowych i czy protokół w ogóle daje wybór.
Ta sama praca, inne rdzenie
Obie konstrukcje zapewniają poufność i integralność w jednym przebiegu i uwierzytelniają dane powiązane, dlatego protokoły VPN używają ich do kanału danych. Różnica jest w środku: AES-GCM to szyfr blokowy AES w trybie licznika z uwierzytelnianiem wielomianowym nad GF(2^128), a ChaCha20-Poly1305 to szyfr strumieniowy z kluczem 256-bitowym i osobnym uwierzytelnianiem jednorazowym.
To, co ważne operacyjnie, jest wspólne: oba katastrofalnie zawodzą przy ponownym użyciu nonce, oba wymagają zarządzania przestrzenią nonce dla każdego klucza i żaden nie naprawia partnera, który uwierzytelnia niewłaściwą rzecz. Profil mówiący AES-256-GCM nie jest bezpieczniejszy od tego mówiącego CHACHA20-POLY1305; oba są mocne, gdy implementacja jest poprawna.
Gdzie wygrywa AES-GCM
AES ma dedykowane instrukcje na większości nowoczesnych procesorów: AES-NI na x86, rozszerzenia kryptograficzne na ARMv8 i odpowiedniki w nowszych projektach POWER i RISC-V. Gdy są obecne, GCM wykonuje kilka bloków równolegle na klasę cyklu, a implementacja programowa staje się nieistotna. To typowy przypadek serwerów, komputerów stacjonarnych i obecnych telefonów, dlatego rada, by używać AES, jest rozsądną wartością domyślną w centrum danych.
Problemem jest przypadek drugiego rzędu. Bez dedykowanych instrukcji AES w oprogramowaniu jest wolny, a implementacje programowe oparte na tablicach mają długą historię problemów z czasem dostępu do pamięci podręcznej. Koncentrator VPN w maszynie wirtualnej, której host nie udostępnia gościowi flag AES, to dokładnie ten przypadek, i łatwo go przeoczyć, bo procesor hosta ma tę funkcję.
Sprawdź, co proces faktycznie widzi, a nie co obsługuje procesor: grep -o aes /proc/cpuinfo | head -1 w Linuksie albo równoważną flagę funkcji w modelu procesora hiperwizora.
Gdzie wygrywa ChaCha20-Poly1305
ChaCha20 jest szybki w przenośnym oprogramowaniu, bo używa tylko dodawania, rotacji i XOR, a jego implementacje z założenia unikają wyszukiwania w tablicach zależnego od sekretu. Na urządzeniu bez akceleracji AES to istotna zaleta i właśnie dlatego WireGuard go wybrał: opis protokołu WireGuard podaje ChaCha20-Poly1305 jako jego szyfr danych bez alternatywy.
Ten jeden wybór mówi coś pożytecznego: na sprzęcie z akceleracją AES WireGuard oddaje część przepustowości w porównaniu z AES-GCM, a jego autorzy zaakceptowali to w zamian za przewidywalne zachowanie na telefonach, routerach domowych i hostach kontenerów. Jeśli twoja flota to głównie małe pudełka ARM, ta wymiana jest na twoją korzyść.
Przypadek przeciwny to zajęty koncentrator x86, gdzie AES-GCM z AES-NI jest szybszą i lepiej wspieraną drogą, a ChaCha20 kosztuje mierzalny procesor na gigabit. Żadna z konstrukcji nie jest słabością; pytanie brzmi, którą twój sprzęt wykonuje tanio.
Co twój protokół naprawdę pozwala ci wybrać
| Protocol | What you get |
|---|---|
| WireGuard | ChaCha20-Poly1305 only; no negotiation |
| OpenVPN 2.5 and later | Data channel negotiated from data-ciphers: AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305 |
| IPsec / IKEv2 | AES-GCM as a combined-mode transform, or ChaCha20-Poly1305 where both peers implement it |
| OpenVPN control channel | TLS decides; TLS 1.3 offers AES-GCM and ChaCha20-Poly1305 suites |
Zwróć uwagę na podział w OpenVPN: kanał kontrolny i kanał danych są negocjowane osobno, więc zestaw, który widzisz dla TLS, nic nie mówi o szyfrze chroniącym twoje dane. Podsumowanie sesji raportuje oba, a czytanie tylko jednego z dwóch to częste źródło zamieszania.
W OpenVPN szyfr kanału danych pochodzi z listy data-ciphers po obu stronach. Jeśli lista serwera i lista klienta nie przecinają się, połączenie albo cofa się do tego, co dopuszcza data-ciphers-fallback, albo zawodzi całkowicie, a ta porażka jest zwykle przypisywana niewłaściwej warstwie. Ustaw tę samą listę po obu stronach, a następnie potwierdź wynegocjowany wynik w logu, zamiast zakładać, że kolejność listy została uszanowana.
Zdecyduj na podstawie trzech faktów o wdrożeniu
Po pierwsze, czy punkty końcowe mają akcelerację AES? Jeśli ma ją każdy partner, AES-GCM jest tańszym wyborem i domyślnym w większości utrzymywanych konfiguracji. Jeśli znacząca część to małe routery lub starsze telefony, ChaCha20-Poly1305 nie pozwala, by ogon floty stał się limitem wydajności.
Po drugie, czy protokół w ogóle daje wybór? W WireGuardzie decyzja została podjęta za ciebie, a pożyteczna praca polega na sprawdzeniu, że narzędzia wokół niego po cichu nie podstawiają czegoś innego. W OpenVPN i IPsec odpowiedzią jest linia konfiguracji i wynegocjowany wynik do zapisania.
Po trzecie, czy obie strony mogą się zgodzić? Szyfr, którego jeden partner nie implementuje, nie jest decyzją o wydajności, to awaria. Dlatego lista partnerów znaczy więcej niż jakikolwiek benchmark: mieszana flota potrzebuje przecięcia możliwości, a nie preferencji najszybszej maszyny.
Jeśli mierzysz, utrzymaj identyczne urządzenie, punkt końcowy i obciążenie i zmień jedną rzecz. Test porównujący dwa serwery w różnych regionach mierzy trasę, a nie szyfr, a benchmark na laptopie nic nie mówi o hoście kontenerów, którego flagi procesora są zamaskowane. Porównaj, a potem zapisz, który szyfr został faktycznie wynegocjowany: ten zapis jest wart więcej niż benchmark.