Рейтинг:1

В целом, как платформы обмена сообщениями e2e справляются с изменениями в структуре зашифрованных данных?

флаг tz

Я непрофессионал, пытающийся углубить свое понимание криптографии и обмена личными сообщениями, создав (доказательство концепции) централизованную сквозную зашифрованную «платформу» обмена сообщениями.

Сообщения отправляются устройствами на «сервер» (работающий на моем Pi внутри моей домашней сети), где они хранятся и откуда получатели могут получить их через вызов API. Сервер знает только самый минимум для правильного распределения сообщений, в то время как текст сообщения зашифрован, а все сообщение правильно подписано.

Теперь я столкнулся со следующей проблемой: я хочу переименовать свойство формата сообщения, используемого клиентскими приложениями (например, JSON: message.body – message.content). Теперь проблема заключается в том, что (1) все предыдущие сообщения хранятся на сервере в старом формате и (2) «старый» клиент может попытаться отправить сообщение «новому» клиенту, что вынуждает меня как-то разрешить это несоответствие между форматы передаваемых сообщений.

Если бы закрытые ключи были доступны серверу, это было бы тривиальной проблемой: просто преобразовать сообщение в ожидаемый формат сообщения получателя. Но поскольку я пытаюсь быть по-настоящему закрытым, а закрытые ключи известны только их владельцам, это не вариант. Сообщения не могут быть изменены сервером.

Я чувствую, что в основе этой проблемы лежит более фундаментальная задача, решения которой, я уверен, придумали люди гораздо более способные, чем я, и для которых существуют стандартизированные подходы. Таким образом вот мой вопрос: Как в целом решения e2ee для обмена сообщениями (например, сигнальные, матричные) обрабатывают изменения в структуре зашифрованных данных? Какие существуют подходы, кроме обрезания старых версий и выбрасывания всей истории сообщений?

Прошу прощения, если этот вопрос звучит расплывчато или слишком широко. Я просто нуб, пытающийся получить общую картину.

Большое спасибо.

Maarten Bodewes avatar
флаг in
Синтаксический анализ или дешифрование не так уж сильно отличаются: для обоих требуется специальный код. Как правило, решается путем помещения номера версии в часть открытого текста сообщения (и, желательно, включая его в расчет подписи и/или информацию AAD аутентифицированного шифра). Если у вас нет номера версии, вам нужно его ввести. Взгляните на другие протоколы безопасности транспорта E2E; они обычно будут иметь такой номер версии.
флаг kr
Этот вопрос не по теме Crypto SE. Этот вопрос на самом деле касается дизайна программного обеспечения, которое поддерживает несколько версий API. Его следует перенести в SO или в Software Engineering SE.
Рейтинг:3
флаг ng

Это общая ИТ-проблема обратной совместимости, усугубляемая криптографией.

В ИТ распространенным способом обеспечения обратной совместимости является наличие поля версии в начале структур данных, что позволяет приложениям решать, распознают ли они формат, и обрабатывать его, если могут. Новые приложения работают со старыми форматами, по крайней мере, в переходный период. Это можно распространить на криптографическую полезную нагрузку, очистив поле версии, а остальные зашифровав/аутентифицируя в соответствии с полем версии.

Когда метод шифрования/аутентификации не меняется, проблема, связанная с криптографией, отсутствует, и подойдут обычные механизмы для работы с обогащением структур данных без нарушения совместимости (например,в JSON можно добавить новые поля, которые старые приложения будут пропускать). Далее я предполагаю, что криптография изменилась, и поле версии позволяет это обнаружить.

Теперь проблема заключается в том, что (1) все предыдущие сообщения хранятся на сервере в старом формате и (2) «старый» клиент может попытаться отправить сообщение «новому» клиенту, что вынуждает меня как-то разрешить это несоответствие между форматы передаваемых сообщений.

Если новый клиент все еще может расшифровать старый формат, это тоже не проблема. Вот так!

Настоящая трудная проблема возникает, когда «новый» клиент отправляет сообщение. Есть много вариантов, ни один из которых не идеален. Что-нибудь из этого:

  • Новые клиенты всегда используют новый формат, который не понимают старые клиенты.
  • Новые клиенты используют старый формат до какого-либо срабатывания (дата переключения, сообщение с сервера), а затем используют новый формат. Старые клиенты нельзя будет использовать после перехода, а новые клиенты не смогут пользоваться новыми функциями нового формата до этого события.
  • Новые клиенты используют новый формат после срабатывания триггера или если есть некоторая подсказка, что получатель (или все получатели) понимает его, например. потому что клиент-отправитель получил аутентифицированное сообщение от (всех) получателей (получателей), которое указывает на поддержку нового формата, возможно, неявно, используя его.
  • Новые клиенты генерируют оба формата до срабатывания триггера и отправляют оба на сервер, который их сохраняет; старые клиенты извлекают старый формат, новые клиенты извлекают новый и в случае сбоя извлекают старый формат. Сервер должен обрабатывать запросы в обоих форматах, и в промежуточный период ему требуется больше места для хранения и больше трафика.
korolev avatar
флаг tz
Очень четкий ответ. Большое тебе спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.