Архитектура безопасности
Запираем на телефоне,
открываем на телефоне.
Посты, фото и чаты запечатываются ещё до того, как покинут телефон, и открыть их могут только те, кого вы выбрали. С кем вы знакомы, хранят ваши телефоны — наш сервер этого не хранит.
01 Печать
Открыть могут только те,
кого вы выбрали
Когда вы публикуете пост, телефон сначала запечатывает его и только потом отправляет. Наш сервер хранит и доставляет запечатанный пост, но ключа к нему у сервера нет. Ответы, фото, видео и превью ссылок идут тем же путём.
Телефон автора внутри ядра безопасности создаёт новый ключ содержимого только для этого поста.
Этим ключом он запирает текст, фото и видео. Текст сначала дополняется до заданного размера, чтобы не было видно его точной длины.
Для каждого читателя ключ содержимого запечатывается его ключом шифрования — получается по конверту на человека. Свой конверт есть и у автора.
Сервер хранит шифротекст и конверты и передаёт их читателям. Ключ от конверта есть только на телефоне читателя, поэтому сервер открыть их не может.
Телефон читателя внутри ядра безопасности открывает свой конверт и достаёт ключ содержимого.
Этим ключом он отпирает пост и показывает его на экране.
- На сервере только шифротекст
- Посты, ответы, фото, видео и превью ссылок заперты ещё до того, как попадут на наш сервер.
- Конверт для каждого читателя
- Ключ к посту кладётся в отдельный конверт для каждого читателя, и открыть его может только телефон этого читателя.
- Новый ключ для каждого поста
- У каждого поста и каждого ответа свой ключ. Ключ от одного не откроет другой.
- Кому доставить, решает ваш телефон
- Ваш телефон запечатывает пост для списка Fam, который хранит сам. В этот список попадают только те, кто принял запрос или связался с вами через QR-код или ссылку Fam. Ваша ссылка Fam срабатывает один раз в течение 24 часов: первый, кто её откроет, становится вашим Fam без вашего подтверждения — отправка ссылки и есть согласие.
Посты запираются XChaCha20-Poly1305. Каждый конверт запечатывается X25519 и вкладывается в общий секрет пары, который устанавливается сразу X25519 и ML-KEM-768.
02 Связи
С кем вы знакомы,
знают только ваши телефоны
Список вашего Fam запечатан на ваших телефонах, и наш сервер не хранит ни того, кто кого привёл, ни того, кто кому что отправил. Запечатанное идёт через почтовые ящики, не привязанные ни к одному аккаунту. Но в момент запроса сервер видит IP-адрес и время, и по ним почтовый ящик можно связать с аккаунтом. О тех, кого команда Krypton приняла напрямую, сервер хранит, что их приняла команда.
- Секрет, который знают только два телефона
- Когда двое становятся Fam, их телефоны получают общий секрет, которого наш сервер не видит. По нему находит дорогу всё, что идёт между ними.
- Почтовые ящики, а не аккаунты
- Посты, чаты и визитки попадают в почтовые ящики, не привязанные ни к одному аккаунту, а номера ящиков меняются каждые 30 дней.
- Отправитель — внутри печати
- Кто отправил, запечатано внутри вместе с подписью, и телефон получателя эту подпись проверяет.
- Приглашения, которых нет в записях
- Участники получают приглашения, которые наш сервер выдаёт, не видя их. Когда кто-то вступает, сервер проверяет только, что приглашение настоящее. В сохранённых записях нет того, кто кого привёл, но журналы подключений и запросы в момент вступления могут это показать.
Общие секреты пары запечатываются сразу X25519 и ML-KEM-768, ключи почтовых ящиков выводятся через HKDF-SHA256, а отправители подписывают Ed25519.
03 Ключи
Ключи хранятся
на вашем телефоне
Ваши закрытые ключи лежат в ядре безопасности на вашем телефоне — это общее ядро приложений для iPhone и Android. Ключи не получает даже код приложения, который рисует экран.
- Дескрипторы
- Открытые посты и фото
Закрытые ключи сюда не попадают
- Четыре закрытых ключа
- Ключи содержимого
- Закрытые ключи под замком
- Только на этом телефоне
- Открытые ключи
- Запертая копия для восстановления
- Половина для восстановления · хеш указателя
- Только на этом телефоне
- Хранятся в Keychain на iPhone или в Keystore на Android и никогда не переносятся на другой телефон через резервную копию. Новый телефон получает их только через восстановление.
- Приложение видит только дескрипторы
- Вместо ключа ядро выдаёт приложению дескриптор. Сам по себе, вне приложения, дескриптор ничего не открывает.
- Без номера телефона и почты
- Вы вступаете и входите только с помощью ключей на своём телефоне. Номера телефонов и адреса электронной почты мы не собираем.
- Распространённые стандарты
- Никакой самодельной криптографии: только распространённые стандарты в реализации Rust-библиотек dalek и RustCrypto.
- X25519
- ML-KEM-768
- Ed25519
- XChaCha20-Poly1305
- HKDF-SHA256
- BIP39
04 Восстановление
Телефон потерян,
аккаунт — нет
Задайте PIN-код и запишите на бумагу 18 английских слов — их предложат при вступлении, или их можно создать позже в настройках. На новом телефоне, когда слова и PIN-код подтвердятся, аккаунт вернётся.
- Слова — только на бумаге
- Мы показываем 18 слов один раз — когда вы их создаёте — и просим повторить некоторые из них. Создать их можно при вступлении или позже в настройках. Слова не хранятся ни на нашем сервере, ни в облаке, ни на телефоне, и больше мы их не показываем.
- И слова, и PIN-код
- Ни слова, ни PIN-код по отдельности ничего не открывают. После нескольких неверных попыток PIN-код блокируется, а наш сервер находит аккаунт не по самим словам, а по хешу одностороннего значения, полученного из них.
- Время, чтобы остановить
- Восстановление завершается после 48 часов ожидания. За это время старый телефон видит запрос и может его отменить.
- Того, что есть у сервера, недостаточно
- Секрет, который открывает резервную копию, состоит из двух половин: одна на нашем сервере, другая — в словах на вашей бумаге. Даже если забрать весь наш сервер, без слов копию не открыть.
Слова — 18 слов стандарта BIP39, 192 бита. Даже квантовому компьютеру понадобится 2⁹⁶ попыток. Две половины объединяются через HKDF и открывают резервную копию.
05 Звонки
Звонки, которые остаются
между вами двумя
Говорите с вашим Fam голосом. Голос шифруется между двумя телефонами, а история звонков хранится на каждом из них.
- Позвонить может только ваш Fam
- Вызов приходит запечатанным через почтовый ящик, который есть только у вас двоих. Наш сервер не записывает, кто кому звонит.
- Кто звонит, знает только принимающий телефон
- Кто звонит, принимающий телефон расшифровывает сам и показывает на экране вызова. Наш сервер имени звонящего не знает.
- Ретранслятор скрывает ваш IP-адрес
- Обычно звонки идут через ретранслятор. Он видит IP-адреса обоих телефонов, но не может открыть зашифрованный звук, а собеседник не видит ваш IP-адрес. Если телефон не получил данные ретранслятора, телефоны соединяются напрямую, и тогда каждый может увидеть IP-адрес другого.
- Соединение подписано обоими телефонами
- Каждый телефон подписывает данные соединения своим ключом. Если что-то подменить по пути, звонок не состоится.
Данные соединения подписываются ключом аккаунта Ed25519 каждого из собеседников.
06 Решаете вы
Что показывать,
решаете вы
Заблокируйте приложение, выберите, кто видит вашу визитку, и оставьте то, что на экране, только на экране.
- Блокировка приложения
- Заблокируйте Krypton распознаванием лица, отпечатком пальца или паролем телефона — сразу или через 1, 15 или 60 минут после выхода из приложения. Пока блокировка включена, в переключателе приложений содержимое не видно. Настройка хранится только на вашем телефоне, и наш сервер не знает, пользуетесь ли вы ею.
- Кто видит вашу визитку
- Ваша визитка запечатана. Выберите «Только Fam» или «Для всех» — в любом случае фото в оригинале получает только ваш Fam. Если сузить круг, телефон снова запечатает визитку новым ключом.
- Без скриншотов
- Экраны в Krypton нельзя снять скриншотом или записать на видео.
- Исчезающие посты
- Сделайте пост исчезающим — и через 24 часа после появления исчезнут сам пост, его чат и фото.
07 Квантовая стойкость
Трудно взломать
даже квантовому компьютеру
Некоторые атакующие собирают шифротекст уже сейчас, чтобы позже вскрыть его квантовым компьютером. Во внешнем слое, который передаёт ключи выбранным вами людям, Krypton использует сразу проверенное сегодняшнее шифрование (X25519) и постквантовое (ML-KEM-768).
- Взломать придётся оба
- Секреты из обоих алгоритмов перед запечатыванием объединяются в один. Если в одном найдётся слабость, второй всё равно защитит. Это тот же гибридный подход, который выбрали Signal и iMessage.
- Каждый внешний слой — обоими алгоритмами
- Запросы в Fam и сообщения, которыми пара договаривается об общем секрете, запечатанные резервные копии, восстановление, пакеты приглашений и жалобы — каждый внешний слой, передающий ключи, запечатан обоими алгоритмами. Посты и чаты в почтовых ящиках пары обёрнуты 256-битным общим секретом пары, полученным так же.
- Открытые ключи, которые нельзя подменить
- Постквантовый открытый ключ тоже привязан к подписи вашего аккаунта. Если наш сервер или кто-то по пути подменит ключ, подпись не сойдётся, и телефон его не примет.
- Шифрование содержимого остаётся надёжным
- 256-битный XChaCha20-Poly1305, которым запираются посты и фото, и SHA-256 сохраняют достаточную стойкость и против квантовых компьютеров, так что менять их не нужно.
Внешний слой запечатывается сразу X25519 и ML-KEM-768 (стандарт NIST США FIPS 203), а два секрета объединяются через SHA3-256.
Что ещё переводим
- Подписи (Ed25519) пока не постквантовые. Но поддельная подпись не откроет ничего из прошлого. У каждого аккаунта уже есть ключ подписи ML-DSA (FIPS 204), созданный при вступлении и привязанный к вашей личности, и мы планируем включить подписи, использующие его вместе с Ed25519, до того как практичные квантовые компьютеры станут вероятными.
- Анонимные приглашения и против квантовых компьютеров продолжают скрывать, чьими они были. Часть, которая защищает их от подделки, перейдёт вместе с подписями.
- Звук звонка шифруется между двумя телефонами по стандарту WebRTC, и эта часть пока не постквантовая.
От чего не защитит ни одно приложение
- Фото, которое получатель сохранил в свою галерею, или снимок экрана другой камерой
- Человек, которому вы отдали разблокированный телефон
- Изменённое приложение, через которое владелец достаёт то, что получил
- Запись звонка, которую собеседник делает сам
- Телефон, уже захваченный вредоносной программой
- Тот, кто следит за сетью и по IP-адресу и времени связывает почтовые ящики, звонки или регистрацию с аккаунтом, — Krypton не пропускает запросы через ретранслятор, скрывающий IP-адреса
- Изменённое приложение, которое игнорирует правила на устройстве, — блокировки и лимит на передачу постов соблюдает приложение получателя, а не наш сервер
- Утечка секрета между вами и одним человеком из Fam — он не меняется со временем, поэтому запечатанные сообщения этой пары, ещё лежащие на сервере (до 90 дней), можно будет открыть
Подробное техническое описание будет опубликовано на GitHub.