Документация / 08
Как устроены доказательства
Сообщение может измениться. Запись того, что вы наблюдали, должна оставаться поддающейся проверке.
Ознакомьтесь с двумя небольшими экспериментами, приведёнными ниже. В них используются вымышленные сообщения, они работают непосредственно в вашем браузере и никогда не подключаются к Telegram.
Одно сообщение, три замечания
Когда Telegram доставляет новое сообщение, уведомление об изменении или об удалении, сборщик добавляет три отдельных записи. Изменение не заменяет первую запись. Уведомление об удалении не стирает её.
Сообщение исчезло из окна чата.
- 01✓
message.newВстреча в 10:00
- 02✓
message.editedВстреча в 11:00
- 03✓
message.deletedУведомление об удалении № 42
Все три зафиксированных события сохраняются в журнале.
Уведомление об удалении не содержит ни достоверного времени удаления, ни информации о том, кто удалил сообщение. Сохранение этих сведений в тайне позволяет провести разграничение между фактом наблюдения и предположением.
Измените запись. Проследите хеш.
Каждая запись содержит хеш предыдущей записи. Её собственный хеш охватывает поля события, включая эту ссылку. Внешний контрольный точка фиксирует конкретную длину журнала и хеш его начала.
h₁ = SHA-256(e₁)Ссылки на 64 нуляh₂ = SHA-256(e₂)Включает h₁h₃ = SHA-256(e₃)Включает h₂h₃Сравните эту фиксированную границу с предоставленным журналом.Изменение события приводит к изменению его хеша. Восстановление цепочки приводит к изменению её начала. Удаление конца делает цепочку короче, чем сохраненная контрольная точка.
Ознакомьтесь с записью № 2 и полными хешами
В данном примере представлен точный JSON-файл в кодировке UTF-8 с хешированием. Значения являются вымышленными; девять полей и формат сериализации соответствуют формату журнала.
- Хеш сохраненной записи № 2
- Пересчитанный хеш записи № 2
Фактические правила в нескольких строках
hi = hex(SHA-256(C(ei)))
σi = Ed25519.Sign(sk, unhex(hi))
C сериализует девять полей события в формате JSON с кодировкой UTF-8: отсортированные ключи, без лишних пробелов, без ASCII-эскейпинга и без значений NaN/бесконечности. Идентификатор события previous_hash равен hi−1. Отображаемое значение h0 означает 64 нулевых символа; подписи охватывают 32 байта исходного дайджеста.
Девять полей: seq, observed_at, source_at, kind, chat_id, message_id, actor_id, payload и previous_hash. Это задокументированная кодировка JSON в TgWitness; сам хеш и сама подпись не являются полями для ввода хеша.
hexport[Ncheckpoint] = Hcheckpoint
Проверьте подпись контрольной точки с помощью закреплённого ключа сборщика, а затем сравните её границы с проверенным журналом. Более поздний экспорт может содержать больше записей; при этом он должен по-прежнему совпадать с данными на более ранней контрольной точке.
Три вопроса, три различных проверки
Проверяйте хэши и подписи с помощью отдельного доверенного ключа.
02 / НЕПРЕРЫВНОСТЬЧто было сохранено ранее?Сравните подписанный экспорт с контрольными точками, хранящимися у отдельного свидетеля.
03 / ПРЕДОСТАВЛЕНИЕПоступили ли эти тестовые события?Сопоставьте контролируемые действия по отправке, редактированию и удалению с журналом каждого аккаунта.
Соответствующая цепочка хэшей служит ответом на вопрос о целостности данных. Она не подтверждает полную доставку сообщения в Telegram, достоверность самого сообщения или независимо подтверждённое время наблюдения.
Следите за ходом расследования по всему аккаунту — от сбора данных до формирования материалов дела.