อ้างอิง / หลักฐาน
รูปแบบหลักฐาน
เนื้อหาของไฟล์ ZIP ที่ลงนาม, ประเภทบันทึก, ใบยืนยันการดำเนินการ, โปรไฟล์ผู้ใช้, สำเนาที่เก็บไว้นอกระบบ และการตรวจสอบแบบออฟไลน์
การสังเกตไม่ใช่ข้อสรุป ID ผู้ส่งไม่ใช่ตัวตนในโลกจริง การอัปเดตบริการที่ผู้ถือบัญชีสามารถเห็นได้คือแหล่งข้อมูล; Telegram ไม่ได้ลงนามด้วยระบบเข้ารหัส ในบันทึกที่เก็บไว้เหล่านี้สำหรับนักสืบสวนจากฝ่ายที่สาม
อะไรคือ "ลงนาม"#
| เนื้อหา | การป้องกัน | สิ่งที่ควรเก็บไว้ |
|---|---|---|
| ทุกบันทึกในสมุดบันทึก รวมถึงเหตุการณ์การดำเนินงาน | โซ่ SHA-256 และลายเซ็น Ed25519 สำหรับแต่ละเหตุการณ์ | events.jsonl ดั้งเดิม, ลายนิ้วมือกุญแจที่เชื่อถือได้, และจุดตรวจสอบที่เก็บรักษาไว้ |
| เนื้อหาในไฟล์ ZIP ของหลักฐาน | manifest.sig ลงนามในไฟล์ manifest แบบมาตรฐาน ซึ่งระบุค่าแฮชของไฟล์เนื้อหา |
ไฟล์ ZIP ฉบับสมบูรณ์ รวมถึงไฟล์ manifest และลายเซ็น |
| ไฟล์แนบที่เก็บรักษาไว้ | SHA-256 และจำนวนไบต์ในเหตุการณ์media.savedที่ลงนาม; ค่าแฮชไฟล์ในไฟล์ ZIP manifest ที่ลงนาม |
ข้อมูลต้นฉบับภายในไฟล์ ZIP ที่ได้รับการตรวจสอบแล้ว |
| จุดตรวจสอบ | ลายเซ็น Ed25519 ที่ครอบคลุมความยาวของบันทึก, ค่าแฮชส่วนหัว, กุญแจสาธารณะ และเวลาสร้าง | สำเนาอิสระที่เก็บไว้ก่อนการเปลี่ยนแปลงที่มีข้อโต้แย้ง |
| ใบเสร็จรับเงิน | ข้อมูลการเก็บรวบรวมที่ลงนามแยกกัน; รวมถึงในเหตุการณ์process.startedที่ลงนามด้วย |
ใบรับและบันทึกที่เกี่ยวข้อง; ข้อมูลการวัดผลเป็นข้อมูลที่รายงานโดยผู้ใช้เอง |
| ไฟล์ CSV หรือ HTML แบบอิสระ | ไม่มีลายเซ็นเข้ารหัสแบบสแตนด์อโลน; การใช้แฮชของเหตุการณ์เพียงอย่างเดียวไม่เพียงพอ | ใช้สำเนาที่อยู่ในไฟล์ ZIP ที่ได้รับการตรวจสอบแล้วเพื่อตรวจสอบความสมบูรณ์ |
| ภาพหน้าจอ, เอกสารพิมพ์ หรือไฟล์ PDF ที่สร้างขึ้นจากเบราว์เซอร์ | ไม่มีลายเซ็นของ TgWitness บนเวอร์ชันที่ดัดแปลง | เก็บรักษาแพ็กเกจต้นฉบับที่ได้รับการตรวจสอบแล้ว และบันทึกวิธีการสร้างเวอร์ชันที่ดัดแปลง |
เครื่องมือเก็บข้อมูลจะตรวจสอบลายเซ็นของบันทึกก่อนที่จะสร้างทุกรูปแบบการส่งออก การตรวจสอบแหล่งข้อมูลดังกล่าวไม่สร้างลายเซ็นบนไฟล์ CSV หรือ HTML ที่ดาวน์โหลดมาแยกต่างหาก ลายเซ็นเหตุการณ์ JSONL ที่ถูกต้องก็ไม่ได้ให้ข้อมูล ขนาดของไฟล์แนบ หรือยืนยันอย่างอิสระว่าบันทึกทั้งหมดที่สังเกตได้ถูกส่งมาครบถ้วน
การส่งต่อคดี#
- บันทึกหมายเลขอ้างอิงคดี ผู้ดำเนินการ รหัสบัญชี Telegram แบบตัวเลข แหล่งข้อมูลที่เลือก นโยบายการเก็บรวบรวมข้อมูล และช่วงเวลาการเก็บรวบรวมข้อมูลไว้ในบันทึกคดีของคุณ TgWitness เก็บรักษาข้อมูลการสังเกตการณ์ไว้; การจัดสรรคดีและบันทึกการดูแลรักษาข้อมูลถูกจัดการนอก แอปพลิเคชัน ให้ตรวจสอบความเหมาะสมของการตั้งค่าการเก็บรวบรวมข้อมูลที่ตั้งใจไว้กับ ขั้นตอนการรับข้อมูลแบบเรียลไทม์
- เก็บลายนิ้วมือกุญแจสาธารณะของพื้นที่ทำงานไว้อย่างอิสระก่อนที่จะพึ่งพา ข้อมูลที่ส่งออกจากระบบนั้น บันทึกจุดตรวจสอบที่ลงนามไว้ภายนอกตัวเก็บข้อมูลระหว่างการเก็บข้อมูล บันทึกการหยุดชะงักและข้อจำกัดของขอบเขตการมองเห็นของบัญชี
- ส่งออกไฟล์ ZIP ที่มีลายเซ็นและเก็บใบเสร็จการรันที่มีลายเซ็นไว้ ใช้จุดตรวจสอบ (checkpoint) ที่ หรือก่อนขอบเขตของบันทึกที่ส่งออก จุดตรวจสอบที่ตั้งไว้ภายหลังสามารถปฏิเสธ การส่งออกก่อนหน้านี้ได้อย่างถูกต้อง เนื่องจากมีความยาวไม่เพียงพอ การส่งออกจะรวมบันทึกพื้นที่ทำงานทั้งหมด โดยไม่คำนึงถึงตัวกรองของแผงควบคุม; ตรวจสอบเนื้อหาให้ละเอียดก่อนที่จะแบ่งปัน
-
ให้ผู้รับตรวจสอบไฟล์ ZIP ด้วยเวอร์ิไฟเออร์ที่เชื่อถือได้และ ลายนิ้วมือ/จุดตรวจสอบที่จัดหาอย่างอิสระ จากระบบที่เชื่อถือได้ซึ่ง มีสภาพแวดล้อม Python ที่กำลังทำงานอยู่:
python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --checkpoint retained-checkpoint.jsonรายงานผลลัพธ์ที่สำเร็จจะแสดง
key_pinned: trueและcheckpoint_checked: trueเมื่อมีการป้อนข้อมูลทั้งสองและได้รับการยอมรับแล้ว ให้เก็บรักษาผลการตรวจสอบไว้For a handover requiring the final exported record to be witnessed, use `--witness witness.zip --witness-fingerprint TRUSTED_WITNESS_SHA256 --require-witness`. This refuses an export with an unwitnessed tail. See the [witness handover procedure](WITNESS.md#require-a-witnessed-export-boundary).- บันทึก SHA-256 ของไฟล์เก็บถาวร ขอบเขตการส่งออก วันที่ส่ง ผู้ส่ง และ ผู้รับไว้ในบันทึกการเก็บรักษาของคุณ รักษาแพ็กเกจต้นฉบับให้สมบูรณ์และทำงาน จากสำเนาเท่านั้น แบ่งปันไฟล์หลักฐานแทนที่จะแบ่งปันไดเรกทอรีข้อมูลส่วนตัวของแอปพลิเคชัน ซึ่งยังเก็บข้อมูลเซสชันบัญชีและข้อมูลลับสำหรับการลงนามด้วย สำหรับการส่งต่อ สามารถนำไฟล์ที่ส่งออกใส่ใน ZIP ที่ได้รับการป้องกันด้วยรหัสผ่าน AES-256 ได้ รหัสผ่าน นี้ใช้เพื่อรักษาความลับเท่านั้น และไม่ถูกเก็บไว้; ผู้รับจะทำการแตกไฟล์ และตรวจสอบไฟล์ส่งออกที่ลงนามภายใน ซึ่งไม่มีการเปลี่ยนแปลงใดๆ
- หากจำเป็นต้องกำหนดเวลาอย่างอิสระ ให้ปฏิบัติตาม ขั้นตอนตาม RFC 3161 และเก็บรักษาคำขอ จุดตรวจสอบ ข้อมูล CA ที่เชื่อถือได้ และคำตอบจากหน่วยงานที่มีอำนาจที่ได้รับการยืนยัน การเตรียมคำขอเพียงอย่างเดียว ไม่สามารถได้รับเวลาประทับได้
การตรวจสอบที่ประสบความสำเร็จจะยืนยันความสมบูรณ์ของข้อมูลเมื่อเทียบกับ กุญแจผู้เก็บข้อมูลที่เชื่อถือได้และขอบเขตที่เก็บรักษาไว้ ความถูกต้องของข้อมูลต้นทาง การส่งข้อความ Telegram ที่ครบถ้วน เวลาที่เชื่อถือได้ และความสามารถในการรับเป็นหลักฐานทางกฎหมาย ต้องมีหลักฐานแยกต่างหาก เวอร์ชันนี้ยังไม่ผ่าน การรับรองการใช้งานจริงกับ Telegram หรือการประเมินทางนิติวิทยาศาสตร์/ความปลอดภัยอย่างอิสระ
กุญแจผู้เก็บข้อมูลที่ถูกคัดลอกสามารถลงนามในบันทึกทดแทนที่ถูกสร้างขึ้นได้ การตรวจสอบกับ จุดตรวจสอบหรือบันทึกพยานที่เก็บไว้อย่างอิสระจะตรวจพบส่วนนำหน้าเดิมที่ถูกเปลี่ยนแปลง; การตรวจสอบลายเซ็นเพียงอย่างเดียวไม่สามารถทำได้ พยานจะแก้ไขสิ่งที่ผู้เก็บรวบรวมนำเสนอ ดังนั้น จึงไม่สามารถยืนยันความจริงของบันทึกที่ถูกสร้างขึ้นก่อน จุดตรวจสอบภายนอกครั้งแรกได้อย่างอิสระ รายงานการปรับใช้บนคลาวด์จะตรวจสอบการตั้งค่าและ การวัดผลที่ผู้เก็บรวบรวมรายงาน; แต่ไม่สามารถยืนยันได้ว่ากุญแจส่วนตัวไม่เคยถูกคัดลอกระหว่างขั้นตอนบูตสแตรป
การแจ้งเตือนที่ส่งผ่าน Apprise ประกอบด้วยชื่อพื้นที่ทำงานและชื่อห้องสนทนา รวมถึงจำนวนข้อความ; ส่วนสรุปสั้นๆ ของข้อความที่ถูกลบและแก้ไขจะถูกเพิ่มเข้ามาเฉพาะเมื่อผู้ดูแลระบบเปิดใช้งาน (ปิดโดยค่าเริ่มต้น) การแจ้งเตือนเหล่านี้เป็นสัญญาณเพื่อความสะดวก ไม่ใช่หลักฐาน: การส่งถึงผู้รับไม่ได้รับการรับประกัน และเพียงบันทึกและไฟล์ส่งออกที่ลงนามเท่านั้นที่บันทึกสิ่งที่ถูกสังเกตเห็น เมื่อใช้ พร็อกซีพื้นที่ทำงาน การแจ้งเตือนจะใช้เส้นทางเดียวกัน; บริการที่ไม่สามารถใช้พร็อกซีนี้ และเส้นทาง MTProxy จะถูกปฏิเสธ
การกำหนดรูปแบบมาตรฐานของเหตุการณ์#
ข้อมูลแฮชที่ป้อนเข้าประกอบด้วยสนามต่อไปนี้เท่านั้น:
seq, observed_at, source_at, kind, chat_id, message_id, actor_id, payload, previous_hash
จัดเรียงเป็นลำดับโดยใช้ JSON ที่เข้ากันได้กับ Python ด้วย UTF-8, คีย์วัตถุที่เรียงลำดับ, ไม่มีการหลบหลีก ASCII ไม่มีช่องว่างที่ไม่สำคัญ และไม่มี NaN/infinity:
json.dumps(value, ensure_ascii=False, sort_keys=True,
separators=(",", ":"), allow_nan=False).encode("utf-8")
SHA-256 ของไบต์เหล่านั้นจะกลายเป็นแฮชของเหตุการณ์ ลายเซ็นคือ Ed25519 ที่คำนวณจาก 32 ไบต์แฮชดิบ จากนั้นเข้ารหัสด้วย base64 ค่า previous_hash แรกคือ 64 ตัวศูนย์ หมายเลขลำดับเริ่มต้นที่ 1 และเพิ่มขึ้นทีละ 1 ทุกเหตุการณ์ รวมถึงเหตุการณ์ ปฏิบัติการ ใช้โซ่เดียวกัน ไม่มีการระงับการส่งซ้ำ: การสังเกต ซ้ำเป็นใบรับที่แยกกัน ไม่ใช่การอ้างว่าเป็นการกระทำของ Telegram ที่แยกกัน
ข้อมูลวันที่ Telegram แบบดิบเป็นสตริง ISO; สนามข้อมูลแบบไบนารีจะกลายเป็นอ็อบเจกต์ที่ประกอบด้วย bytes_base64 ข้อความข้อความ, เอนทิตี, ตัวอธิบายสื่อ, เมตาดาต้าการตอบกลับ, ปฏิกิริยา, และปฏิบัติการของบริการจะถูกเก็บรักษาไว้ในเมตาดาต้าข้อความแบบดิบเมื่อมีข้อมูลดังกล่าว
observed_at คือเวลา UTC ตามนาฬิกาของระบบเก็บข้อมูล source_at คือวันที่จาก Telegram เมื่อมีข้อมูล การแจ้งเตือนการลบไม่ระบุเวลาลบที่แม่นยำ ดังนั้น source_at จึงยังคงเป็นค่าว่าง ลำดับการรับข้อมูลจากระบบขนส่งไม่จำเป็นต้องเป็นลำดับเหตุการณ์ จากแหล่งข้อมูล ภาพถ่ายประวัติใช้วันที่จากแหล่งข้อมูลที่เก่ากว่า แต่ใช้เวลาการสังเกตการณ์ปัจจุบัน
ความหมายของตัวแสดง#
message.new actor_id คือผู้ส่งข้อความ message.edited ไม่มี ผู้แก้ไขที่คาดการณ์ได้ payload.sender_id บันทึกผู้ส่งของข้อความที่สังเกตได้ การลบ actor_id ยังคงเป็น null ข้อความจากบริการสมาชิกจะเก็บรักษาผู้ส่งและประเภทการดำเนินการ ไว้ โดยไม่แปลงการลบทุกครั้งเป็นการออกจากกลุ่มโดยสมัครใจ การอัปเดตผู้เข้าร่วมแบบดิบ จะเก็บรักษา actor_id ตามที่ระบุไว้ ภาพถ่ายปฏิกิริยาจะไม่สร้างผู้ดำเนินการเปลี่ยนแปลงขึ้นมา
การแจ้งเตือนการลบสำหรับแชทส่วนตัวและกลุ่มทั่วไปมีเพียง ID ของข้อความเท่านั้น แชทเหล่านั้นใช้ลำดับ ID เดียวกันสำหรับทั้งบัญชี ดังนั้น ID หนึ่งจึงระบุข้อความเดียวของ บัญชีนี้ เมื่อข้อความที่มี ID ดังกล่าวถูกบันทึกไว้ในสมุดบันทึกนี้ก่อนหน้านี้แล้ว การลบข้อความจะถูกบันทึกในแชทนั้นเป็น message.deleted โดยใช้ payload.chat_resolution เป็นชื่อของเมธอด ID ที่ไม่เคยถูกบันทึกไว้จะถูกเก็บไว้เป็น deletion.unscoped โดยไม่มี chat_id; ไม่มีการคาดเดาใดๆ ช่อง (Channels) และกลุ่มใหญ่ (supergroups) นับข้อความตามแต่ละแชท และ ไม่เคยถูกจับคู่ด้วยวิธีนี้ เมื่อข้อความที่ถูกลบถูกส่งโดยบัญชีที่ถูกสังเกต payload.deleted_message_was_outgoing จะมีค่าเป็น true; แต่ผู้ลบข้อความยังไม่ถูกระบุ
เนื้อหาที่ครอบคลุม: ความต่อเนื่อง ช่องว่าง และ ID ที่ไม่ถูกตรวจพบ#
ทุกไฟล์ ZIP ที่ลงนามจะมีรหัส coverage.json รายงาน HTML จะเปิดด้วยบทสรุปเดียวกัน และ
verify.py จะคำนวณใหม่จาก events.jsonl แทนที่จะเชื่อถือไฟล์ดังกล่าว:
- ถูกสังเกตอย่างต่อเนื่องจาก X ถึง Y ช่วงหนึ่งเริ่มต้นด้วย
observation.startedและ สิ้นสุดเมื่อมีการหยุดชั่วคราว การหยุด การสูญเสียการเชื่อมต่อ Telegram การออกจากระบบ การเริ่มกระบวนการโดยไม่ มีการหยุดอย่างเป็นระเบียบ หรือไม่มีบันทึกใดๆ เป็นเวลามากกว่าสามนาทีระหว่างการสังเกต (สัญญาณชีพถูกบันทึกทุกนาที ดังนั้นความเงียบหมายความว่ากระบวนการหยุดลง แช่แข็ง หรือ คอมพิวเตอร์เข้าสู่โหมดสลีป) เมื่อช่วงเวลาสัญญาณชีพถูกปรับเปลี่ยนในส่วนพารามิเตอร์ แต่ละสัญญาณชีพ จะบันทึกการเปลี่ยนแปลงนี้ และช่วงเวลาความเงียบที่อนุญาตจะกลายเป็นสามช่วงเวลา โดยไม่เคยน้อยกว่าสามนาที - ช่องว่างจะแสดงช่วงเวลาที่ขาดหายไปพร้อมเหตุผล ช่องว่างที่ยังคงเปิดอยู่ ณ บันทึกสุดท้าย
จะถูกทำเครื่องหมายว่า
not_resumed_by_last_record - ID ข้อความที่ไม่ได้สังเกตเห็น สำหรับช่อง (channels) และกลุ่มใหญ่ (supergroups) ซึ่งนับจำนวนข้อความตาม การสนทนา ID ที่ขาดหายไประหว่าง ID ที่สังเกตเห็นจะถูกรายการเป็นช่วง (range) และถูกรายงานว่า “ไม่ได้สังเกตเห็น” — ซึ่งอาจหมายถึงถูกลบ ไม่เคยส่งถึง หรืออยู่นอกประวัติที่บันทึกไว้ — ไม่เคยถูกรายงานว่า “ถูกลบ” การสนทนาส่วนตัวและกลุ่มทั่วไปใช้ลำดับเดียวกันสำหรับบัญชีทั้งหมด ดังนั้นช่องว่างในส่วนนี้ จึงไม่มีความหมายและไม่ถูกแสดงในรายการ
- การแจ้งเตือนช่องว่างระดับแชท (เช่น Telegram ที่ขอการกู้คืนความแตกต่างใน ช่องหนึ่ง) จะถูกนับเป็นบันทึก; สิ่งเหล่านี้ไม่ขัดขวางการครอบคลุมโดยรวม
ส่วน "Coverage" อธิบายว่าเครื่องมือเก็บข้อมูลนี้บันทึกข้อมูลอะไรไว้เท่านั้น ไม่ใช่หลักฐานว่า Telegram ได้ส่ง การอัปเดตทุกครั้งในช่วงเวลาต่อเนื่อง
ผู้ผลิต#
ไฟล์ ZIP ของรายการหลักฐานที่ลงนาม, ไฟล์ส่งออกการสนทนา, บันทึกพยาน และคำชี้แจงของ
ไฟล์โปรไฟล์บุคคล มีข้อมูลproducer
: ซอฟต์แวร์, เวอร์ชัน, โครงการ (PhishDestroy),
หน้าหลัก และคลังแหล่งที่มา รายงาน HTML แสดงบรรทัดเดียวกัน และverify.py
พิมพ์ข้อมูลนี้เป็นส่วนหนึ่งของสิ่งที่ได้รับการตรวจสอบ ไฟล์ที่เก็บไว้ก่อนที่ช่องข้อมูลนี้จะถูกสร้างขึ้น ได้รับการตรวจสอบว่า
เป็นไปตามเดิม และถูกรายงานว่าไม่ระบุชื่อผู้ผลิต
โปรไฟล์บุคคล#
ไฟล์โปรไฟล์ (tgwitness-dossier-v1, JSON) จะถูกสร้างขึ้นตามคำขอจากข้อมูลบันทึกที่มีอยู่แล้ว
ในสมุดบันทึกสำหรับแชทหนึ่งแชทเท่านั้น; ไม่มีการดึงข้อมูลใดจาก Telegram และเนื้อหาของโปรไฟล์จะไม่ถูก
บันทึกไว้ในสมุดบันทึก (การเปิดและปิดโปรไฟล์จะถูกบันทึกเป็น dossier.changed)
สำหรับทุกบุคคลที่มีข้อความที่บันทึกไว้ ระบบจะแสดงประวัติชื่อและชื่อผู้ใช้, สัญลักษณ์ของ Telegram
(บอท, หลอกลวง, ปลอม, พรีเมียม, ได้รับการยืนยัน, ถูกจำกัด, ถูกลบ) ตามที่ปรากฏ ณ เวลาบันทึก, รูปโปรไฟล์
ID รูปภาพโปรไฟล์, SHA-256 และแฮชเชิงรับรู้ (pHash, ที่เข้ากันได้กับimagehash.phash) ของ
อวาตาร์จากแคชอวาตาร์ท้องถิ่นที่มีอวาตาร์คล้ายกัน, กิจกรรม (ข้อความแรกและข้อความสุดท้าย,
จำนวนข้อความ, การแชร์ที่แก้ไขและลบ, ข้อความตามชั่วโมง UTC), ใครตอบใคร, การสนทนาอื่น ๆ
ในบันทึกนี้ที่บุคคลดังกล่าวได้เขียนและกล่าวถึงกระเป๋าเงิน (BTC, EVM, TRON, TON, LTC,
DOGE, XMR, SOL; ที่อยู่ Base58Check ได้รับการตรวจสอบความถูกต้องด้วย checksum), หมายเลขโทรศัพท์, ชื่อผู้ใช้ และ
ลิงก์ รวมถึงลิงก์ที่ซ่อนอยู่หลังข้อความ
ทุกข้อเท็จจริงจะระบุบันทึกในสมุดบันทึก (seq) ที่มันมาจาก และ record_hashes เก็บ
ค่าแฮชของบันทึกแต่ละรายการที่ถูกอ้างอิงไว้ ข้อความนี้ได้รับการลงนามด้วยกุญแจพื้นที่ทำงาน:
python verify.py tgwitness-dossier-CHAT.json --fingerprint TRUSTED_SHA256 --evidence tgwitness-evidence.zip
ตรวจสอบลายเซ็น, ตรวจสอบการส่งออกหลักฐานเอง (ลายเซ็น, ห่วงโซ่แฮช และไฟล์) และว่าทุกบันทึกที่อ้างอิงอยู่ยังคงไม่เปลี่ยนแปลงในไฟล์ส่งออกนั้นของพื้นที่ทำงานเดียวกัน แฮชของอวาตาร์ถูกระบุว่าเป็นข้อมูลจากแคชท้องถิ่น (ไม่ใช่บันทึกในสมุดบันทึก) การกล่าวถึงเป็นการจับคู่รูปแบบ — เป็นข้อมูลนำทางเพื่อตรวจสอบ ไม่ใช่ข้อเท็จจริงที่ได้รับการยืนยัน โปรไฟล์ถูกเปิดใช้งานตามแต่ละแชท สามารถส่งออกเป็นไฟล์ ZIP ที่เข้ารหัสด้วย AES-256 พร้อมรหัสผ่าน และ ถูกลบเมื่อปิดใช้งานหรือเมื่อแชทถูกลบออกจากแหล่งข้อมูล
พยานอิสระ#
สมุดบันทึกพยาน (tgwitness-witness-v1) และโพสต์ในช่องของมันถูกตรวจสอบเทียบกับ
การส่งออกหลักฐานด้วย verify.py --witness … --channel …; ดูพยานอิสระ
Manifest และจุดตรวจสอบ#
manifest.json ประกอบด้วยรูปแบบ เวลาส่งออก กุญแจสาธารณะ ลายนิ้วมือ ความยาวของบันทึก
แฮชส่วนหัว ขอบเขต ผู้ผลิต ข้อจำกัด และ SHA-256 ของสมาชิกเนื้อหาทุกตัว ยกเว้น
manifest.json และ manifest.sig เอง
manifest.sig คือลายเซ็น Ed25519 ที่เข้ารหัสด้วย base64 บนไฟล์ manifest JSON แบบมาตรฐาน
ตัวตรวจสอบจะปฏิเสธองค์ประกอบที่ไม่คาดคิด/ขาดหายไป ชื่อที่ซ้ำกัน ไฟล์ที่เสียหาย
ลำดับ/โซ่ที่ขาดหาย ลายเซ็นที่ไม่ถูกต้อง และความไม่ตรงกันกับจุดตรวจสอบที่ให้มา
ตัวตรวจสอบจะไม่ดึงเส้นทางของไฟล์เก็บถาวรออกมาเลย และจำกัดขนาดรวมที่ประกาศไว้ (ไม่รวมการบีบอัด) ไว้ที่ 4 GiB;
--max-gib N อนุญาตให้สร้างไฟล์เก็บถาวรที่มีขนาดใหญ่ขึ้นได้ โดยเพิ่มขีดจำกัดของ Parameters
รับรหัสผู้ตรวจสอบจากสำเนาที่ผ่านการตรวจสอบหรือสำเนาอิสระที่ได้รับการตรวจสอบแล้ว ผู้ตรวจสอบ ภายในไฟล์เก็บถาวรที่ไม่น่าเชื่อถือคือวัสดุที่สามารถรันได้ ซึ่งจัดหาโดยผู้สร้างไฟล์เก็บถาวรนั้น; การมีอยู่ของมันเป็นความสะดวกในการพกพา ไม่ใช่จุดยึดความน่าเชื่อถือที่อิสระ
จุดตรวจสอบ (checkpoint) จะลงนามในคำแถลงที่ประกอบด้วยกุญแจสาธารณะ ความยาวของบันทึก แฮชส่วนหัว และเวลาสร้าง ผู้ตรวจสอบสามารถตรวจสอบได้ว่าไฟล์เก็บถาวรที่สร้างขึ้นภายหลังมี คำนำหน้าเดียวกัน เก็บจุดตรวจสอบไว้ภายนอกตัวเก็บข้อมูลก่อนการเปลี่ยนแปลงที่มีข้อโต้แย้ง: ผู้โจมตีที่ควบคุมทั้งไฟล์เก็บถาวรและจุดตรวจสอบสามารถแทนที่ทั้งสองได้
ลายเซ็นที่ถูกต้องจากกุญแจที่ยังไม่ถูกตรึง (unpinned) จะยืนยันความสอดคล้องภายในเท่านั้น แม้กุญแจที่ถูกตรึง (pinned) ก็ไม่สามารถพิสูจน์ความถูกต้องของเนื้อหาต้นทางได้ หากผู้เก็บข้อมูลหรือกุญแจ ถูกบุกรุกก่อนการบันทึก การประทับเวลาจากภายนอกและการจับภาพที่เชื่อถือได้เป็นข้อกำหนดที่แยกต่างหาก TgWitness ไม่รับประกันความยอมรับในศาลหรือการรับรองทางนิติวิทยาศาสตร์
ไฟล์แนบ#
ไฟล์ถูกระบุด้วย SHA-256 ในโฟลเดอร์ media/ เหตุการณ์ media.saved เชื่อมโยงค่าแฮชและ ความยาวไบต์กับเหตุการณ์ข้อความเฉพาะ ชื่อไฟล์ดิบเป็นข้อมูลเมตา ไม่เคยเป็น เส้นทางในเครื่อง ไบต์ของสื่อถูกดาวน์โหลดแบบไม่พร้อมกัน ดังนั้นการลบข้อความทันทีอาจทำให้ การบันทึกไม่สำเร็จ การปิดการเก็บข้อมูล ไฟล์ที่มีขนาดใหญ่เกินกำหนด/ขนาดไม่ทราบ ความล้มเหลวในการดาวน์โหลด และการดาวน์โหลดที่ถูกขัดจังหวะ จะปรากฏเป็นผลลัพธ์ การเกิดข้อผิดพลาดของกระบวนการอาจทิ้ง ไฟล์บางส่วนที่ไม่มีอ้างอิงไว้; ไฟล์เหล่านี้จะไม่ถูกรวมอยู่ในการส่งออก
เครื่องมือส่งออก ZIP ตรวจสอบสื่อที่เก็บไว้ตามชื่อของสื่อนั้น JSONL, CSV และ HTML การส่งออกจะตรวจสอบลายเซ็นของเหตุการณ์ แต่ไม่ส่งข้อมูลไบต์ของสื่อ รายงานที่สร้างขึ้น เป็นเพียงเพื่อความสะดวกเท่านั้น; events.jsonl เป็นรูปแบบการแสดงเหตุการณ์ที่ถือเป็นมาตรฐาน
ใบรับการเก็บรวบรวมและประมวลผลที่คงทน (0.2)#
งานสื่อและเหตุการณ์การส่งข้อความถูกบันทึกในธุรกรรมเดียว งานนี้จะเก็บ ตัวระบุข้อความ TL ต้นฉบับ; การสังเกตที่ลงนามจะผูก SHA-256, บัญชี, และนโยบายขนาดไว้ การกู้คืนจะตรวจสอบการผูกนั้นก่อนดาวน์โหลด มันจะไม่เคยดึง ข้อความปัจจุบันมา และจะแทนที่ไฟล์แนบที่ใหม่กว่าอย่างเงียบๆ งานที่ถูกขัดจังหวะ จะได้รับการลองใหม่ ในขณะที่ความล้มเหลวถาวรยังคงเป็นผลลัพธ์ที่ชัดเจน
แต่ละพื้นที่ทำงานมีบันทึกและตัวตนการลงนามเป็นของตัวเอง เหตุการณ์ process.started ประกอบด้วย ID การทำงาน, นาฬิกาท้องถิ่น, เวอร์ชันของส่วนที่พึ่งพา, ค่าแฮชของไฟล์ต้นฉบับ, บัญชี/ขอบเขตเริ่มต้น, และตั้งค่าการบันทึก Heartbeats ประกอบด้วย ID การทำงาน, เวลาแบบโมโนโทนิก, และสถานะคิว ใบยืนยันกระบวนการยังสามารถดาวน์โหลดได้ในรูปแบบเอกสารที่ลงนามแยกต่างหาก การวัดค่าไฟล์เป็นการรายงานด้วยตนเอง และไม่ใช่การรับรองจากฮาร์ดแวร์ที่เชื่อถือได้
จุดตรวจสอบอัตโนมัติจะถูกเก็บรักษาไว้ในเครื่องท้องถิ่นเมื่อเริ่มต้นระบบ ทุกห้านาทีระหว่าง การเฝ้าสังเกต (พารามิเตอร์ → จุดตรวจสอบที่มีลายเซ็นทุก), และเมื่อหยุดระบบอย่างเป็นระเบียบ การตรวจสอบเมื่อเริ่มต้นระบบและการส่งออกจะเปรียบเทียบบันทึก กับจุดตรวจสอบล่าสุดที่เก็บไว้บนเครื่องท้องถิ่น สิ่งนี้สามารถตรวจพบการย้อนกลับของฐานข้อมูล เมื่อจุดตรวจสอบยังคงอยู่; ผู้ควบคุมที่จัดการทั้งสองส่วนยังคงสามารถแทนที่ทั้งสองได้ การเก็บรักษาข้อมูลอย่างอิสระและเวลาประทับที่เชื่อถือได้จากภายนอกยังคงเป็นข้อกำหนดที่แยกต่างหาก
หลังจากรีสตาร์ท ระบบจะกลับมาดำเนินการต่อจากตำแหน่งการอัปเดต Telegram ที่บันทึกไว้ (catch_up_from ใน
observation.started) และจะขอรับการอัปเดตที่พลาดไป การตรวจสอบซ้ำเป็นระยะจะบันทึก
message.recovered สำหรับข้อความที่พลาดไป และ message.missing_on_recheck เมื่อ Telegram ไม่
ส่งข้อความที่บันทึกไว้กลับมาอีกต่อไป; กรณีหลังนี้ไม่ใช่การแจ้งเตือนการลบ และไม่ระบุชื่อผู้ลบหรือเวลา
คัดลอกและกู้คืนข้อมูลจากภายนอก (S3)#
สำเนาที่จัดเก็บนอกไซต์ (Exports, ปิดตามค่าเริ่มต้น) จะอัปโหลดส่วนต่าง ๆ ของบันทึก, ไฟล์ที่เก็บรักษาไว้, จุดตรวจสอบ
พร้อมด้วยเวลาประทับ และไฟล์แชทที่ส่งออกเสร็จสมบูรณ์ไปยังพื้นที่จัดเก็บที่เข้ากันได้กับ S3, ซึ่งถูกเข้ารหัสด้วย
AES-256-GCM ก่อนการอัปโหลด โดยใช้กุญแจที่เก็บไว้ใน vault ของพื้นที่ทำงาน; การเก็บรักษาด้วย Object Lock จะถูกนำไปใช้
เมื่อ bucket รองรับคุณสมบัตินี้ หากไม่มีกุญแจที่ดาวน์โหลดมา สำเนาดังกล่าวจะไม่สามารถอ่านได้ การกู้คืนและตรวจสอบ
ด้วย python -m tgwitness.replica restore --key-file KEY.json --out DIR
การกู้คืนต้องการไดเรกทอรีธรรมดาที่ว่างเปล่า ไฟล์ที่ดาวน์โหลดและวัตถุที่ถูกถอดรหัสจะเก็บไว้ใน พื้นที่จัดเก็บชั่วคราวส่วนตัวจนกว่าบันทึกทั้งหมดและจุดตรวจสอบทุกจุดที่เก็บไว้จะผ่านการตรวจสอบ วัตถุ ที่มีเส้นทางไม่ปลอดภัย ช่วงเซกเมนต์ไม่สอดคล้องกัน หรือบันทึกที่สั้นกว่าจุดตรวจสอบจะถูกปฏิเสธ; หาก การตรวจสอบล้มเหลว จะไม่มีการเผยแพร่ไฟล์ที่กู้คืนได้ การตรวจสอบการเก็บรักษาจะเปรียบเทียบโหมด Object Lock และวันที่ที่ส่งกลับมา กับกำหนดเวลาที่ส่งไปเมื่ออัปโหลด (มีความคลาดเคลื่อนในการปัดเศษ 1 วินาที) กำหนดเวลาที่หมดอายุ ไม่ถูกต้อง หรือถูกตัดสั้น จะไม่นับว่าผ่านการตรวจสอบ สถานะจะรายงานวัตถุตัวอย่าง ที่การเก็บรักษาถูกอ่านกลับสำหรับการอัปโหลดครั้งนั้น
ความคืบหน้าของการคัดลอกถูกกำหนดขอบเขตตามจุดหมายปลายทางและกุญแจการเข้ารหัส การเปลี่ยนจุดปลายทาง, บักเก็ต หรือคำนำหน้า จะเริ่มการคัดลอกแบบครบถ้วนของบันทึก, สื่อ และจุดตรวจสอบที่เก็บไว้ท้องถิ่นไปยัง จุดหมายปลายทางนั้น ความคืบหน้าที่เก่าซึ่งไม่ถูกกำหนดขอบเขตจะถูกรักษาไว้ แต่จะถูกเล่นซ้ำเพียงครั้งเดียวหลังการอัปเกรด การส่งออก ประวัติการสนทนาที่ถูกลบออกจากกล่องส่งท้องถิ่นแล้ว จะยังคงอยู่ที่จุดหมายปลายทางเดิม
สื่อท้องถิ่นที่ขาดหายหรือเสียหายจะถูกรายงานเป็นข้อผิดพลาดของรอบการอัปโหลด และรักษาตัวชี้สื่อไว้ก่อน จุดนั้น เพื่อให้ไฟล์ได้รับการลองอัปโหลดอีกครั้งในรอบถัดไป; ไฟล์ จุดตรวจสอบ และการส่งออกหลังจากนั้นยังคง ถูกคัดลอกต่อไป การตรวจสอบการกู้คืน จะเปรียบเทียบการอ้างอิงสื่อที่เก็บรักษาไว้ทั้งหมดกับแฮชที่ถอดรหัสแล้วและขนาดที่บันทึกไว้ ส่วนบันทึก ที่ทับซ้อนกันและเหมือนกันจากการอัปโหลดที่ถูกขัดจังหวะจะถูกกำจัดข้อมูลซ้ำ; ส่วนทับซ้อนที่ขัดแย้งกันจะถูกปฏิเสธ จุดตรวจสอบที่สร้างขึ้นระหว่างการอัปโหลดจะถูกเลื่อนออกไปจนกว่าบันทึกในบันทึกที่ครอบคลุมจะถูก คัดลอกเสร็จสิ้น ดังนั้นรอบการอัปโหลดที่เสร็จสมบูรณ์จะไม่เผยแพร่จุดตรวจสอบก่อนบันทึกที่เกี่ยวข้อง
ภาพถ่ายหน้าจอการส่งออกแบบสตรีมมิ่ง#
การส่งออกแบบสตรีมมิ่งใช้สแนปช็อตการอ่าน SQLite ที่เสถียร ส่วนหัวของสแนปช็อตอาจเก่ากว่า บันทึกสดปัจจุบันเมื่อการดาวน์โหลดเสร็จสิ้น จุดตรวจสอบที่สร้างขึ้นหลังจาก สแนปช็อตนั้นสามารถรายงานได้อย่างถูกต้องว่าไฟล์เก็บถาวรสั้นกว่า; ให้เปรียบเทียบกับจุดตรวจสอบ ที่หรือก่อนส่วนนำที่ถูกส่งออก ไม่ใช่จุดตรวจสอบที่สร้างขึ้นภายหลังแบบสุ่ม
การเตรียมการตาม RFC 3161 และการตรวจสอบการตอบกลับ (0.2)#
โหมดหลักฐาน (ปิดตามค่าเริ่มต้น) จะส่งเพียง SHA-256 ของจุดตรวจสอบที่ลงนามแต่ละจุดไปยัง
หน่วยงาน RFC 3161 และปฏิทิน OpenTimestamps ที่ระบุไว้ ผ่านเส้นทางพื้นที่ทำงาน (workspace route) และไม่เคยผ่าน MTProxy
คำตอบถูกเก็บไว้ใน checkpoints/anchors/, ส่งออก และตรวจสอบโดย verify.py (--tsa-ca ตรวจสอบ
ลายเซ็น TSA; ยืนยันหลักฐาน OpenTimestamps ด้วย ots upgrade และ ots verify).
แผงควบคุมจะเตรียมอาร์ไคฟ์คำขอที่ประกอบด้วยข้อมูล byte ของไฟล์ checkpoint.json แบบมาตรฐาน, ลายนิ้วมือข้อความ SHA-256 และ nonce แบบสุ่มในไฟล์ timestamp.tsq, ค่า checksum และคำแนะนำ ไม่มีการส่งคำขอผ่านเครือข่าย การเตรียมข้อมูลนี้ไม่ใช่การประทับเวลาที่เชื่อถือได้
python -m tgwitness.anchor verify เรียก OpenSSL ts สองครั้ง: ครั้งหนึ่งกับ byte ของจุดตรวจสอบ
และครั้งหนึ่งกับคำขอเดิม จำเป็นต้องระบุไฟล์ CA ที่เชื่อถือได้อย่างชัดเจน;
ใบรับรองที่รวมมาจะไม่ได้รับการเชื่อถือโดยอัตโนมัติ การตรวจสอบคำขอเป็นตัวเลือกที่
CLI ดังนั้นให้เก็บและระบุ --request เพื่อตรวจสอบ nonce ผลลัพธ์จะระบุว่า
ได้ตรวจสอบแล้วหรือไม่ ลายเซ็นจุดตรวจสอบของตัวเก็บข้อมูลและบันทึกหลักฐานยังคงต้องได้รับการตรวจสอบ
แยกกันด้วยลายนิ้วมือของตัวเก็บข้อมูลที่เชื่อถือได้
ตัวตรวจสอบปัจจุบันไม่ดึงข้อมูลการเพิกถอนหรือดำเนินการตรวจสอบความถูกต้องของ การเก็บรักษาข้อมูลในระยะยาวหลังจากใบรับรองหมดอายุ อย่าถือว่าผลการตรวจสอบลายเซ็น ที่สำเร็จแล้วเป็นตราประทับเวลาที่ได้รับการรับรองหรือมีผลทางกฎหมาย ยังไม่มีการติดต่อ กับ TSA ที่อิสระและแท้จริงในระหว่างการพัฒนา ดูขั้นตอน