Народный

Безопасность

Noise Protocol Framework

Криптографический фреймворк для построения handshake-протоколов: DH + симметричное шифрование + аутентификация. Основа WireGuard, Lightning Network, WhatsApp.

Определение

Noise Protocol Framework — это спецификация для построения криптографических handshake-протоколов из набора базовых примитивов: Diffie-Hellman (Curve25519), симметричное AEAD-шифрование (ChaCha20-Poly1305 или AES-GCM) и hash-функция (SHA-256 / SHA-512 / BLAKE2). Создан Trevor Perrin в 2016 году. Открытый стандарт, текущая ревизия — Revision 34 (2018).

Цель — дать разработчикам proven-design «строительные блоки» для безопасных протоколов, чтобы не изобретать handshake заново и не повторять ошибки прошлых лет (Heartbleed, BEAST, POODLE — все были последствиями кастомных TLS-расширений).

Как работает

Noise задаёт «handshake patterns» — последовательности обмена сообщениями. Каждый паттерн — это набор букв, описывающих, какие действия делает каждая сторона:

  • e — отправить ephemeral public key.
  • s — отправить static public key (зашифрованным, если уже есть ключ).
  • ee, es, se, ss — Diffie-Hellman между указанными парами ключей.

Пример — паттерн Noise_IK (используется в WireGuard):

<- s                      (out-of-band: клиент знает static key сервера)
...
-> e, es, s, ss           (initiator handshake)
<- e, ee, se              (responder handshake)

После handshake обе стороны имеют общий симметричный ключ chain (выводится из хэша всех handshake-сообщений и DH-результатов). Дальше — application data шифруется AEAD c этим ключом и счётчиком nonce.

Семейство паттернов:

  • Noise_N — anonymous, только сервер аутентифицирован.
  • Noise_K — known, mutual authentication из обоих static keys.
  • Noise_I — interactive, mutual auth + identity protection.
  • Noise_X — extended, дополнительные guarantees.
  • Noise_NN, Noise_NK, Noise_NX и т.д. — комбинации.

Производительность: один handshake — это 2–4 DH-операции (~50µs на современном CPU) + один AEAD-encrypt. На порядок быстрее TLS 1.3 handshake.

Почему это важно для пользователя VPN

Noise — это «движок» под капотом WireGuard. Конкретно WireGuard использует Noise_IK для handshake (initiator → responder, both authenticated by static keys). Это даёт WireGuard несколько ключевых свойств:

  • Минимальный handshake — 2 сообщения (initiator + responder).
  • Perfect Forward Secrecy. Сессионный ключ выводится из ephemeral DH, не из long-term. Компрометация static private key не раскрывает прошлые сессии.
  • Identity hiding на стороне responder. Responder’а нельзя «спросить» — кто он. Without правильного static key initiator получит только handshake-failure без идентификации сервера.
  • Малая cryptographic surface. WireGuard использует всего 4 примитива: Curve25519, ChaCha20-Poly1305, BLAKE2s, SipHash24. По объёму кода — на порядок меньше OpenSSL.

Помимо WireGuard, Noise используется:

  • WhatsApp — для end-to-end-шифрования групповых сообщений (Signal Protocol использует расширенный Noise).
  • Lightning Network — для шифрования каналов между нодами.
  • Concordium / Aleo / Mina — ряд blockchain-протоколов для p2p messaging.
  • I2P (исторически рассматривался для NTCP2-транспорта).

Юзеру: вы не настраиваете Noise напрямую. Но когда вы видите «WireGuard handshake», под капотом — это Noise_IK. Если вы read code WireGuard / AmneziaWG / Outline servers и видите функции вроде NoiseExpand, NoiseDH, NoiseHash — это framework Perrin’а.

Связанные термины

WireGuard — основной потребитель. Perfect Forward Secrecy — свойство, которое даёт Noise. AEAD — слой шифрования над handshake. ChaCha20 — конкретный шифр. TLS 1.3 — функционально похожий handshake.

Источники