ドキュメント / 08
証拠の仕組みをご覧ください
メッセージは変更される可能性があります。しかし、あなたが確認した内容の記録は、いつでも検証可能な状態で残しておく必要があります。
以下の2つの小規模な実験をご覧ください。これらは架空のメッセージを使用しており、ブラウザ上で動作し、Telegramには一切接続しません。
1つのメッセージ、3つの観察点
Telegramから新しいメッセージ、編集通知、削除通知が届くと、コレクターはこれら3つの観測結果を個別に追加します。編集が行われても、最初の記録は上書きされません。削除通知があっても、その記録は消去されません。
そのメッセージはチャット画面から消えました。
- 01✓
message.new10:00に集合してください。
- 02✓
message.edited11:00にお会いしましょう
- 03✓
message.deleted#42 に関する削除通知
記録された3つの観察事項はすべて、ジャーナルに残ります。
削除通知には、信頼できる削除時刻も、メッセージを削除した人物も記載されていません。これらの情報を不明なままにしておくことで、観察と推測との区別が保たれます。
記録を変更する。ハッシュを追跡する。
各レコードには、前のレコードのハッシュが含まれています。そのレコード自身のハッシュは、そのリンクを含むイベントフィールド全体をカバーしています。外部に保持されたチェックポイントは、特定のジャーナルの長さと先頭ハッシュを固定します。
h₁ = SHA-256(e₁)64個のゼロへのリンクh₂ = SHA-256(e₂)h₁を含みますh₃ = SHA-256(e₃)h₂を含みますh₃この固定境界を、提供されたジャーナルと比較してください。イベントを変更すると、そのハッシュが変更されます。チェーンを再構築すると、その先頭が変更されます。末尾を削除すると、残されたチェックポイントよりも短くなります。
記録 2 および完全なハッシュを確認してください
これは、この例でハッシュ化された正確な UTF-8 JSON です。値は架空のものであり、9 つのフィールドとシリアライゼーションはジャーナルのフォーマットと一致しています。
- 保存された記録 2 のハッシュ
- レコード2のハッシュを再計算しました
実際のルールを数行でまとめると
hi = hex(SHA-256(C(ei)))
σi = Ed25519.Sign(sk, unhex(hi))
Cは、9つのイベントフィールドをUTF-8形式のJSONとしてシリアライズします。キーはソート済みで、余分な空白はなく、ASCIIエスケープもNaN/無限大も含まれません。イベントのprevious_hashはhi−1です。表示されているh0は64個のゼロ文字を意味し、署名は32バイトの生のダイジェストをカバーしています。
9つのフィールドは、seq、observed_at、source_at、kind、chat_id、message_id、actor_id、payload、previous_hashです。これはTgWitnessで規定されているJSONエンコーディングです。ハッシュおよび署名自体は、ハッシュ入力フィールドではありません。
hexport[Ncheckpoint] = Hcheckpoint
固定されたコレクターキーの下にあるチェックポイントの署名を検証し、その境界を検証済みのジャーナルと比較してください。後のエクスポートにはより多くのレコードが含まれている可能性がありますが、それらは依然として以前のチェックポイントで一致している必要があります。
3つの質問、3つの異なる確認手順
ハッシュ値と署名は、別途信頼された鍵を用いて検証してください。
02 / 継続性以前にはどのような内容が記載されていましたか?署名付きエクスポートデータを、別の証人が保持しているチェックポイントと比較してください。
03 / 提供これらのテストイベントは届きましたか?各アカウントのジャーナルと照合し、送信、編集、削除の操作を管理します。
一致するハッシュチェーンは、完全性に関する疑問に答えるものです。ただし、Telegramでの完全な配信、メッセージの真実性、あるいは独立して信頼できる観測時刻を立証するものではありません。
アカウント全体の調査を、取得から事件資料のまとめまで追跡します。