Перейти к документации
База знаний

Сквозное шифрование

Ключи OpenPGP создаются в вашем браузере. Письмо, отправляемое на другой адрес OpenEmail, можно запечатать ещё до того, как оно покинет вкладку, а запечатанная почта, адресованная вам, открывается в области чтения, расшифрованная на вашей машине. Ключи никогда не наши, и передавать нам нечего.

Подробности

  • Обе половины соединены от начала до конца. Письмо получателю, чей ключ опубликован, запечатывается в браузере до того, как запрос его покинет; серверу передаётся armor, который он не может прочесть, он помечает его как pgp-mime и собирает настоящее сообщение multipart/encrypted. Чтение работает так же, но в обратную сторону: шифротекст загружается, расшифровывается во вкладке и отрисовывается как обычное письмо.
  • Алгоритм тот же, что уже используют все остальные: OpenPGP через openpgp.js и PGP/MIME на проводе. Ключ v4 на Curve25519 — той же формы, какую выпускает Proton и какую gpg создаёт своим современным алгоритмом по умолчанию. Поэтому почта, которую это читает, в принципе та же, что производят Thunderbird, gpg и Proton, и здесь нет никакого собственного формата, который пришлось бы потом разматывать.
  • На практике, однако, это работает между OpenEmail и OpenEmail. Ни Web Key Directory, ни обращения к keyserver, ни разбора заголовков Autocrypt в этой кодовой базе нет: единственное место, где вообще находится ключ получателя, — наш собственный каталог, где лежат ключи, опубликованные из этого приложения людьми, чей адрес находится на размещённом здесь домене. Нет и способа раздать свой ключ. Приложение публикует вашу открытую половину в этот каталог и не предлагает ни скопировать её, ни экспортировать, поэтому у корреспондента на Thunderbird нет поддерживаемого способа её получить. Совместимость с широким миром PGP — свойство формата, а не то, что продукт пока делает за вас.
  • Чтение так не ограничено, потому что расшифровке каталог не нужен. Любое письмо PGP/MIME или встроенного PGP, дошедшее до этого ящика запечатанным на ключ, который есть в этом браузере, открывается — кто бы его ни отправил и каким бы клиентом ни пользовался. Сюда входят и письма, запечатанные на ключ, от которого вы с тех пор ушли при ротации: отставленные ключи остаются в связке и пробуются наравне с текущим, так что ротация не стоит вам уже полученной почты.
  • Зелёный означает «открыто», и никаким другим путём он не достигается. Строка «Подробности → Безопасность» становится зелёной только после того, как расшифровка действительно вернула открытый текст в этой вкладке, — никогда из поля на письме и никогда из самого факта, что пришёл зашифрованный конверт. Она гласит: «Зашифровано сквозным шифрованием. Открыто вашим ключом в этом браузере». У всего, что не дотягивает до этого, своя фраза, а не общая: ещё ищем, ключ заблокирован, запечатано на ключ, которого в этом браузере нет, не удалось открыть, ключа здесь нет вовсе и браузер не дал нам посмотреть. «Мы не смогли проверить» и «у вас нет ключа» — разные утверждения, и строка заставляет прочесть, какое из них вам досталось.
  • S/MIME по-прежнему не открывается. Это CMS под сертификатом X.509, openpgp.js к нему не подступится, и в продукте нет хранилища сертификатов, где лежал бы ключ, даже если бы подступился, поэтому письмо S/MIME сообщает, что OpenEmail не может его открыть, и ему не предлагают разблокировку, которая всё равно ничего не даст.
  • Закрытая половина создаётся в вашем браузере и никогда его не покидает: ни в зашифрованном виде, ни внутри резервной копии, ни в инструменте поддержки. Серверу её не отправляют, поэтому здесь нечего выдать, изъять по повестке или утечь. Она хранится под парольной фразой в отдельной базе IndexedDB — openemail-keyring, — сознательно вне досягаемости совета «очистите кэш» и сброса из отладочной консоли: оба стирают кеш запросов, и ключ, лежащий рядом с ним, превратил бы рутинный совет поддержки в необратимое уничтожение всех зашифрованных писем, которые когда-либо получал аккаунт. Удаление вашего аккаунта её всё-таки удаляет — потому что туда же уходит и почта. Разблокировка держит её в памяти 15 минут бездействия и максимум 8 часов, после чего чтение следующего запечатанного письма снова попросит парольную фразу.
  • Ни депонирования ключа, ни восстановления нет, и это навсегда, а не «пока не сделано». Ваша парольная фраза — единственный вход; забудьте её, и каждое письмо, которое кто-либо на вас запечатал, останется на наших серверах шифротекстом, который никто не прочтёт, включая нас. Почта пропала, и никакие просьбы её не вернут. Экран регистрации ключа говорит это до того, как появится первый ключ, за галочкой, которую нужно поставить, файл резервной копии обязателен, а кнопка «Готово» остаётся неактивной, пока вы его не скачаете. Этот файл записывается без дополнительной защиты при хранении, которую использует этот браузер, — намеренно, чтобы он по-прежнему импортировался в старые сборки gpg: резервная копия, которую нельзя открыть в другом месте, — это не резервная копия. Кроме того, ключ живёт в одном браузере на одном устройстве, и на телефоне или втором ноутбуке не будет ничего, пока вы не импортируете туда этот файл.
  • Каталог хранит открытые ключи и ничего больше, и ключ принадлежит человеку, а не почтовому ящику: привязанный к адресу ключ пришлось бы копировать всем, с кем этот адрес разделён, а это депонирование под другим названием. Для поиска в каталоге нужны вход в систему и право на отправку — никакого публичного эндпоинта, потому что открытая проверка адресов — это оракул, сообщающий любому, какие адреса здесь являются живыми ящиками. Он отвечает одинаково и на «мы такой домен не обслуживаем», и на «обслуживаем, но никто не опубликовал ключ», поскольку различение этих случаев лишь переносит оракул за форму входа, а не убирает его. И ключ перестают выдавать в тот момент, когда его владелец теряет доступ к адресу, а не тогда, когда кто-нибудь вспомнит его отозвать.
  • Каждый байт запечатывается в браузере в момент написания — именно это вообще позволяет работать отложенной отправке: запланированное письмо или письмо, лежащее в окне отмены, хранится как шифротекст и позже отправляется очередью, у которой нет ключа и которая ничего из этого прочесть не может. Получатель, поиск которого в каталоге ЗАВЕРШИЛСЯ ОШИБКОЙ, блокирует отправку, а не считается молча не имеющим ключа. И запечатанное письмо уходит только по тому пути, который несёт сообщение целиком. Исходящий путь, принимающий вместо этого HTML-тело, отправил бы armor как видимый текст и отчитался об успехе, поэтому отправка, которая туда попала бы, отклоняется до того, как уйдёт хоть байт, а не после.
  • Во что обойдётся запечатывание — измерено, а не угадано: armor занимает примерно в 1,86 раза больше исходных байтов, поэтому в 5 MB, разрешённые путём отправки, влезает примерно 2,7 MB вложений, и редактор письма отклоняет превышающую это нагрузку до того, как потратит секунды на шифрование того, что транспорт всё равно отвергнет. Зашифрованная почта не сообщает ни об открытиях, ни о кликах, потому что отслеживание по получателям работает за счёт того, что тело письма различается для каждого человека, а один запечатанный блок различаться не может; переписанная же ссылка — это ссылка, которую мы можем прочесть, что противоречит самому утверждению. Зашифрованную отправку также нельзя дедуплицировать по ключу идемпотентности: новый сеансовый ключ делает шифротекст другими байтами при каждой попытке, поэтому повтор никогда не даёт того же отпечатка, что оригинал.
  • Отложенная отправка запечатывает в момент написания, а не в момент отправки. Редактор письма строит шифротекст на ключах, которые есть у получателей в день, когда вы пишете, а не в день, когда письмо уйдёт, — то же правило продукт уже применяет к шаблонам и переводам, где запланированное письмо несёт то, что вы одобрили, а не то, что изменилось потом. Разница в том, что устаревший шаблон всего лишь устарел, а устаревший ключ означает нечитаемость, поэтому редактор называет дату словами, а не предлагает оговорку: «Запечатано сейчас, отправлено …. Всем, кто в нём, понадобится тот ключ, который есть у них сегодня». Отказ, охраняющий вторую половину, выпущен, но не срабатывал ни разу, потому что таких писем пока не может существовать: если бы такое появилось, его последующее редактирование было бы отклонено, а не разрешено молча, — ведь правка тела записала бы открытый текст поверх шифротекста, а смена получателей изменила бы тех, на кого письмо запечатано, и в любом из этих случаев оно ушло бы в открытом виде, хотя все экраны по-прежнему называли бы его зашифрованным.
  • Двух вещей редактор письма не предлагает вовсе и прямо об этом говорит, вместо того чтобы падать уже на проводе. Шаблон отрисовывается на сервере из опубликованной версии, поэтому в браузере нечего запечатывать. Ответ цитирует переписку под собой, и эта цитата добавляется уже после того, как тело было бы запечатано, оставляя читаемую копию всей цепочки снаружи печати, поэтому ответы и пересылки нельзя зашифровать, пока цитируемая история не будет убрана внутрь шифротекста.
  • Ничто из этого не скрывает вашу тему, адресатов и время отправки. Тема идёт в открытом виде на запечатанном письме ровно так же, как на любом другом, и область чтения говорит об этом прямо на письме: «Тема и адреса шли в открытом виде; этот текст — нет». PGP покрывает тело письма, и ни одна его реализация не покрывает остальное. Черновики тоже не запечатаны, потому что автосохранение продолжает писать открытый текст в ваш почтовый ящик, пока вы пишете, ведь молча не сохранять означало бы терять работу, — и замок сообщает об этом словами.
  • Сначала появилось распознавание почты, приходящей запечатанной, и оно работает до сих пор. PGP/MIME, встроенный PGP-armor и S/MIME раньше отрисовывались как пустое тело с двумя бессмысленными вложениями, потому что разборщик считает читаемыми только обычный текст и HTML, а остальное сбрасывал в полосу файлов. Теперь эти части определяются, служебные части протокола не попадают в список вложений, шифротекст сохраняется нетронутым — именно из него читалка и расшифровывает, ничего не загружая заново, — а письмо, которое здесь никто открыть не может, по-прежнему прямо об этом сообщает.
  • Подписанное письмо считается отдельной сущностью, потому что оно ею и является. Его тело читаемо, поэтому поиск, правила и всё остальное продолжают на нём работать; оно никогда не прячется за замком и никогда не прогоняется через расшифровку. Строка сообщает «Подписано отправителем. Подпись не проверена», приглушённо, и остаётся приглушённой, пока здесь не появится то, что действительно умеет проверять подпись, — а такого пока нет, в том числе и для письма, которое успешно расшифровалось. Видеть, что письмо запечатано, — не то же самое, что открыть его, а открыть его — не то же самое, что знать, кто его запечатал.
  • У зашифрованного письма тело закрыто от всего, что иначе бы его прочитало: от поискового фрагмента, от прохода фишингового оценщика по телу, от проверки на написанное ИИ, от условий по телу в правилах, от импорта приглашений в календарь и от сводок по цепочке. Аутентификационная половина фишинговой проверки по-прежнему работает, потому что DMARC, DKIM и SPF читаются из заголовков, которые шифротекст не скрывает. Расшифровка ничего из этого не меняет. Открытый текст существует только во вкладке, которая его открыла, поэтому запечатанное письмо остаётся ненаходимым поиском и вне функций с ИИ даже после того, как вы его прочли, и перевод для него не предлагается. Это цена утверждения, а не упущение.