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ć

ProtocolWhat you get
WireGuardChaCha20-Poly1305 only; no negotiation
OpenVPN 2.5 and laterData channel negotiated from data-ciphers: AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305
IPsec / IKEv2AES-GCM as a combined-mode transform, or ChaCha20-Poly1305 where both peers implement it
OpenVPN control channelTLS 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.

Powiązane artykuły