AES-GCM чи ChaCha20-Poly1305: вибір шифру даних для VPN
AES-GCM — очевидний вибір на серверах з апаратним прискоренням, а ChaCha20-Poly1305 добре працює без нього. Можливо, ваш протокол вирішить за вас.
Обидві назви — це конструкції AEAD, обидві стандартизовані, і на сучасному сервері x86 будь-яка з них наситить гігабітний канал без помітних зусиль. Вибір перестає бути довільним, коли ви залишаєте цей сервер: дешеві маршрутизатори, старі телефони та віртуальні пристрої часто не мають апаратного прискорення AES, і там різниця велика. Тому порівняння не в тому, який шифр швидший, а в тому, який шифр добре працює на цьому наборі кінцевих точок і чи пропонує протокол вибір узагалі.
Та сама робота, інші ядра
Обидві конструкції дають конфіденційність і цілісність за один прохід і автентифікують пов язані дані, тому протоколи VPN використовують їх для каналу даних. Різниця всередині: AES-GCM — це блоковий шифр AES у режимі лічильника з поліноміальним автентифікатором над GF(2^128), а ChaCha20-Poly1305 — потоковий шифр із 256-бітним ключем і окремим одноразовим автентифікатором.
Те, що важливо експлуатаційно, є спільним: обидва катастрофічно відмовляють при повторному використанні nonce, обом потрібне керування простором nonce для кожного ключа, і жоден не виправляє партнера, який автентифікує не те. Профіль, де написано AES-256-GCM, не безпечніший за профіль із CHACHA20-POLY1305; обидва сильні, коли реалізація правильна.
Де виграє AES-GCM
AES має виділені інструкції на більшості сучасних процесорів: AES-NI на x86, криптографічні розширення на ARMv8 та аналоги в новіших розробках POWER і RISC-V. Коли вони є, GCM обробляє кілька блоків паралельно за клас циклу, і програмна реалізація стає неважливою. Це звичайний випадок для серверів, настільних комп ютерів і нинішніх телефонів, і тому порада використовувати AES — розумне значення за замовчуванням у центрі обробки даних.
Проблема — випадок другого порядку. Без виділених інструкцій AES у програмному забезпеченні повільний, а реалізації на таблицях мають довгу історію проблем із часом доступу до кешу. Концентратор VPN у віртуальній машині, чий хост не показує гостьовій системі прапорці AES, — саме цей випадок, і його легко пропустити, бо процесор хоста має цю можливість.
Перевіряйте, що процес бачить насправді, а не що підтримує процесор: grep -o aes /proc/cpuinfo | head -1 у Linux або відповідний прапорець можливості в моделі процесора гіпервізора.
Де виграє ChaCha20-Poly1305
ChaCha20 швидкий у переносному програмному забезпеченні, бо використовує лише додавання, обертання та XOR, а його реалізації за задумом уникають пошуку в таблицях, залежного від секрету. На пристрої без прискорення AES це суттєва перевага, і саме тому WireGuard обрав його: опис протоколу WireGuard вказує ChaCha20-Poly1305 як шифр даних без альтернативи.
Цей єдиний вибір каже щось корисне: на обладнанні, де AES прискорений, WireGuard поступається частиною пропускної здатності порівняно з AES-GCM, і автори прийняли це в обмін на передбачувану поведінку на телефонах, домашніх маршрутизаторах і хостах контейнерів. Якщо ваш парк — переважно невеликі коробки ARM, цей обмін на вашу користь.
Протилежний випадок — завантажений концентратор x86, де AES-GCM з AES-NI є швидшим і краще підтриманим шляхом, а ChaCha20 коштує вимірного процесорного часу на кожен гігабіт. Жодна з конструкцій не є слабкістю; питання в тому, яку ваше обладнання виконує дешевше.
Що ваш протокол справді дозволяє вибрати
| 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 |
Зверніть увагу на розділення в OpenVPN: канал керування й канал даних узгоджуються окремо, тому набір, який ви бачите для TLS, нічого не каже про шифр, що захищає ваше корисне навантаження. Підсумок сеансу повідомляє про обидва, і читати лише один із двох — поширене джерело плутанини.
В OpenVPN шифр каналу даних береться зі списку data-ciphers на обох кінцях. Якщо список сервера й список клієнта не перетинаються, з єднання або відкочується до того, що дозволяє data-ciphers-fallback, або повністю падає, і цю невдачу зазвичай відносять до неправильного рівня. Задайте той самий список з обох боків, а потім підтвердьте узгоджений результат у журналі, замість того щоб припускати, що порядок списку було дотримано.
Вирішуйте за трьома фактами про розгортання
По-перше, чи мають кінцеві точки прискорення AES? Якщо має кожен партнер, AES-GCM — дешевший вибір і значення за замовчуванням у більшості підтримуваних конфігурацій. Якщо значна частка — невеликі маршрутизатори або старі телефони, ChaCha20-Poly1305 не дає хвосту парку стати межею ємності.
По-друге, чи пропонує протокол вибір узагалі? З WireGuard рішення вже ухвалено за вас, і корисна робота — переконатися, що інструменти навколо нього не підміняють мовчки щось інше. З OpenVPN і IPsec відповідь — рядок конфігурації та узгоджений результат, який треба записати.
По-третє, чи можуть обидві сторони домовитися? Шифр, який один партнер не реалізує, — це не рішення про продуктивність, а простій. Тому список партнерів важливіший за будь-який бенчмарк: змішаному парку потрібен перетин можливостей, а не перевага найшвидшої машини.
Якщо ви міряєте, тримайте пристрій, кінцеву точку й навантаження однаковими та змінюйте одну річ. Тест, що порівнює два сервери в різних регіонах, міряє маршрут, а не шифр, а замір на ноутбуці нічого не каже про хост контейнерів, чиї прапорці процесора приховані. Порівняйте, а потім запишіть, який шифр фактично узгоджено: цей запис цінніший за бенчмарк.