'init'
This commit is contained in:
15
problems/problem_sync.md
Normal file
15
problems/problem_sync.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Проблема синхронизации своих же сообщений (не сообщений оппонента)
|
||||
|
||||
При синхронизации переписок, мы отправляем пакеты сообщений на устройство, которое собираемся синхронизировать. Количество пакетов регулируется сервером, и сервер буквально может отправить последние пакеты за например 7 дней.
|
||||
Проблема в том, что сообщения шифруются только для оппонентов, и не могут быть прочитаны ни кем кроме них (даже нами). Проблема возникает при синхронизации наших же сообщений.
|
||||
|
||||
### 1. Пользователь был в сети, активно общался, а потом вышел из сети
|
||||
Пользователь был в сети, общался, потом вышел из сети. В момент, когда пользователь был не в сети, ему могли написать сообщения. В следующий раз когда пользователь зайдет в сеть, хорошо бы как и во всех мессенджерах, загружать пользователю новые сообщения для чтения. Так оно и происходит. Работает это посредством того, что на сервере на некоторое время сохраняются сообщения (зашифрованные) которые отправили пользователю, и когда пользователь заходит, сервер их перенаправляет на пользователя.
|
||||
Проблемы конкретно в этом случае нет, потому что мы синхронизируем только сообщения, которые пришли к нашему пользователю ОТ ОППОНЕНТОВ. Они и так предназначались для нас, а значит успешно расшифровываются с помощью ECC и ChaCha20. Проблемы начинаются в другом кейсе...
|
||||
|
||||
### 2. У пользователя два устройства
|
||||
Пользователь общался с одного из устройств (компьютер), второе в этот момент было офлайн (телефон), и не знало о том, что там что-то происходит с сообщениями. Допустим, оно вообще не было подключено к сети. Пользователь решил выключить компьютер и продолжить общаться с телефона. Включил телефон, зашел, и в этот момент приложению необходимо загрузить все те сообщения, которые и приходили и отправлялись пользователем за то время пока телефон был офлайн. Проще говоря, нужно синхронизироваться. С синхронизацией сообщений от оппонентов - проблем нет. Мы точно так же их получаем, как будто они были только что отправлены, разве что редактируем Timestamp. Текст точно так же как и обычно расшифровываем, сначала расшифровав ключ от ChaCha20 с помощью ECC и далее этим ключом расшифровав текст. Проблема начинается тогда, когда мы пытаемся расшифровать наши же собственные сообщения. Ключ от chacha20 зашифрован public ключом оппонента, и мы при синхронизации ключ расшифровать не можем, соотвественно не можем прочитать и текст.
|
||||
|
||||
|
||||
# Решение, использованное в Rosetta
|
||||
Добавить дополнительное поле aesChachaKey в PacketMessage, где ключ chacha20 зашифрован еще и AES256 приватным ключем отправителя. Таким образом при синхронизации сообщений отправитель которых равен текущему пользователю мы используем ключ из поля aesChachaKey, расшифровываем его с помощью private key и с помощью расшифрованного ключа дешифруем текст сообщения и вложения.
|
||||
Reference in New Issue
Block a user