Криптиране

Как работи криптирането от край до край: Прост гайд

Криптирането от край до край (E2EE) е един от онези термини, които се хвърлят навсякъде, но рядко се обясняват кристално. Ако някога си се чудил как услуги като Тайничко могат честно да кажат „дори ние не можем да четем съобщенията ти", тази статия ще ти обясни точно как работи — без диплома по информатика.

Основната идея: Катинари и ключове

Представи си, че имаш кутия с катинар. Слагаш съобщение вътре, заключваш я и я изпращаш на приятеля си. Само приятелят ти има ключа. Куриерът (сървърът) носи кутията, но никога не може да види какво е вътре.

Това е криптирането от край до край накратко. „Катинарът" е алгоритъм за криптиране, а „ключът" е криптографски ключ, който знаят само подателят и получателят.

AES-GCM: Златният стандарт

AES (Advanced Encryption Standard) е алгоритъмът за криптиране, използван от правителства, банки и сигурностно-ориентирани приложения по цял свят. GCM (Galois/Counter Mode) добавя автентикация — не само криптира данните ти, но и гарантира, че не са подправени.

Когато казваме „AES-256-GCM", имаме предвид:

  • AES — Алгоритъмът за криптиране
  • 256 — Размерът на ключа в битове (2²⁵⁶ възможни ключа — повече от атомите във видимата Вселена)
  • GCM — Режимът, който осигурява и криптиране, и проверка на целостта

Web Crypto API: Криптиране в браузъра ти

Модерните браузъри включват вграден набор от криптографски инструменти, наречен Web Crypto API. Той осигурява хардуерно ускорени, времево-константни криптографски операции директно в JavaScript — без нужда от външни библиотеки.

Ето опростен поглед към начина, по който Тайничко го ползва:

// 1. Генерирай случаен ключ за криптиране
const key = await crypto.subtle.generateKey(
  { name: 'AES-GCM', length: 256 },
  true, ['encrypt', 'decrypt']
);

// 2. Криптирай съобщението
const iv = crypto.getRandomValues(new Uint8Array(12));
const encrypted = await crypto.subtle.encrypt(
  { name: 'AES-GCM', iv },
  key, new TextEncoder().encode('Моето тайно съобщение')
);

// 3. Ключът отива в URL хеша, блобът — към сървъра

Трикът с URL хеша: Защо сървърът не може да мами

Тук е умният момент. Когато видиш URL като:

https://tainichko.com/note/abc123#МоятТаенКлючТук

Всичко след символа # се нарича URL фрагмент (или хеш). Ето критичното нещо за URL фрагментите:

Браузърите никога не изпращат URL фрагмента към сървъра. Това е дефинирано в HTTP спецификацията (RFC 3986). Фрагментът се обработва изцяло от страна на клиента.

Това значи, че когато получателят отвори линка, браузърът изпраща заявка за /note/abc123 към сървъра, но #МоятТаенКлючТук остава в браузъра. Сървърът няма как да го прихване — никога не влиза в HTTP заявката.

Пълният процес

Ето какво се случва, когато създаваш и споделяш самоунищожаваща се бележка в Тайничко:

  1. Пишеш съобщението си във формата.
  2. Браузърът ти генерира случаен AES-256 ключ и криптира съобщението.
  3. Криптираният блоб + IV се изпращат към сървъра. Ключът остава в браузъра ти.
  4. Сървърът съхранява криптирания блоб и връща ID.
  5. Браузърът ти създава линк: tainichko.com/note/[id]#[ключ]
  6. Споделяш линка с получателя.
  7. Получателят отваря линка. Браузърът му извлича ключа от хеша, взима криптирания блоб от сървъра и го дешифрира локално.
  8. Сървърът изтрива криптирания блоб след като бъде изтеглен. Бележката я няма завинаги.

Какво е IV?

IV (Инициализационен вектор) е случайна стойност, която гарантира, че криптирането на един и същ текст два пъти произвежда различен шифротекст. Съхранява се заедно с криптираните данни на сървъра — но без ключа, IV е безполезен. Не е тайна; това е предпазен механизъм.

Може ли наистина да се вярва на това?

Красотата на тази архитектура е, че не трябва да се доверяваш на оператора на сървъра. Сървърът вижда само криптирани данни. Дори сървърът да бъде компрометиран, атакуващият би получил нищо повече от случайно изглеждащи байтове, без възможност за дешифриране.

Сигурността разчита на добре одитирани, стандартни браузърни API-та — не на custom код. Web Crypto API е имплементиран от производителите на браузъри (Google, Mozilla, Apple) и е изпитан в бой на милиарди устройства.

Пробвай сам

Най-добрият начин да разбереш криптирането е да го ползваш. Създай бележка, огледай URL-а и виж архитектурата в действие.

Създай криптирана бележка 🔒