Files
desktop/problems/problem_sync.md
rosetta 83f38dc63f 'init'
2026-01-30 05:01:05 +02:00

15 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Проблема синхронизации своих же сообщений (не сообщений оппонента)
При синхронизации переписок, мы отправляем пакеты сообщений на устройство, которое собираемся синхронизировать. Количество пакетов регулируется сервером, и сервер буквально может отправить последние пакеты за например 7 дней.
Проблема в том, что сообщения шифруются только для оппонентов, и не могут быть прочитаны ни кем кроме них (даже нами). Проблема возникает при синхронизации наших же сообщений.
### 1. Пользователь был в сети, активно общался, а потом вышел из сети
Пользователь был в сети, общался, потом вышел из сети. В момент, когда пользователь был не в сети, ему могли написать сообщения. В следующий раз когда пользователь зайдет в сеть, хорошо бы как и во всех мессенджерах, загружать пользователю новые сообщения для чтения. Так оно и происходит. Работает это посредством того, что на сервере на некоторое время сохраняются сообщения (зашифрованные) которые отправили пользователю, и когда пользователь заходит, сервер их перенаправляет на пользователя.
Проблемы конкретно в этом случае нет, потому что мы синхронизируем только сообщения, которые пришли к нашему пользователю ОТ ОППОНЕНТОВ. Они и так предназначались для нас, а значит успешно расшифровываются с помощью ECC и ChaCha20. Проблемы начинаются в другом кейсе...
### 2. У пользователя два устройства
Пользователь общался с одного из устройств (компьютер), второе в этот момент было офлайн (телефон), и не знало о том, что там что-то происходит с сообщениями. Допустим, оно вообще не было подключено к сети. Пользователь решил выключить компьютер и продолжить общаться с телефона. Включил телефон, зашел, и в этот момент приложению необходимо загрузить все те сообщения, которые и приходили и отправлялись пользователем за то время пока телефон был офлайн. Проще говоря, нужно синхронизироваться. С синхронизацией сообщений от оппонентов - проблем нет. Мы точно так же их получаем, как будто они были только что отправлены, разве что редактируем Timestamp. Текст точно так же как и обычно расшифровываем, сначала расшифровав ключ от ChaCha20 с помощью ECC и далее этим ключом расшифровав текст. Проблема начинается тогда, когда мы пытаемся расшифровать наши же собственные сообщения. Ключ от chacha20 зашифрован public ключом оппонента, и мы при синхронизации ключ расшифровать не можем, соотвественно не можем прочитать и текст.
# Решение, использованное в Rosetta
Добавить дополнительное поле aesChachaKey в PacketMessage, где ключ chacha20 зашифрован еще и AES256 приватным ключем отправителя. Таким образом при синхронизации сообщений отправитель которых равен текущему пользователю мы используем ключ из поля aesChachaKey, расшифровываем его с помощью private key и с помощью расшифрованного ключа дешифруем текст сообщения и вложения.