TgWitness / ডকুমেন্টেশন

তথ্যসূত্র / প্রমাণ

প্রমাণের ফর্ম্যাট

স্বাক্ষরিত ZIP-এর বিষয়বস্তু, রেকর্ড ধরনের, প্রক্রিয়া রসিদ, ব্যক্তি প্রোফাইল, অফ-সাইট অনুলিপি এবং অফলাইন যাচাইকরণ।

একটি পর্যবেক্ষণ কোনো উপসংহার নয়। একটি প্রেরক আইডি কোনো বাস্তব-বিশ্বের পরিচয় নয়। অ্যাকাউন্ট-দৃশ্যমান সার্ভিস আপডেটই উৎস; টেলিগ্রাম তৃতীয় পক্ষের তদন্তকারীর জন্য এই সংরক্ষিত রেকর্ডগুলো ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষর করে না।

কি স্বাক্ষরিত হয়েছে#

উপকরণ সুরক্ষা কি ধরে রাখতে হবে
প্রতিটি জার্নাল পর্যবেক্ষণ, অপারেশনাল ঘটনা সহ প্রতি ইভেন্টে একটি SHA-256 চেইন এবং একটি Ed25519 স্বাক্ষর মূল events.jsonl, বিশ্বাসযোগ্য কী ফিঙ্গারপ্রিন্ট, এবং একটি সংরক্ষিত চেকপয়েন্ট
প্রমাণের জিপ সামগ্রী manifest.sig ক্যানোনিক্যাল ম্যানিফেস্টে স্বাক্ষর করে, যা বিষয়বস্তু ফাইলগুলির হ্যাশ তালিকাভুক্ত করে। সম্পূর্ণ জিপ, এর ম্যানিফেস্ট এবং স্বাক্ষরসহ
সংরক্ষিত সংযুক্তি স্বাক্ষরিত media.saved ইভেন্টে SHA-256 এবং বাইট গণনা; স্বাক্ষরিত ZIP ম্যানিফেস্টে ফাইল হ্যাশ যাচাইকৃত ZIP-এর ভিতরে মূল বাইটগুলো
চেকপয়েন্ট জার্নাল দৈর্ঘ্য, হেড হ্যাশ, পাবলিক কী এবং সৃষ্টি সময় জুড়ে Ed25519 স্বাক্ষর বিবাদিত পরিবর্তনের আগে সংরক্ষিত একটি স্বতন্ত্র অনুলিপি
চালানের রসিদ স্বতন্ত্রভাবে স্বাক্ষরিত কালেক্টর পরিমাপ; এছাড়াও স্বাক্ষরিত process.started ইভেন্টে অন্তর্ভুক্ত রসিদ এবং সংশ্লিষ্ট জার্নাল; পরিমাপগুলো স্ব-প্রতিবেদিত।
স্বতন্ত্র CSV বা HTML স্বতন্ত্র ক্রিপ্টোগ্রাফিক স্বাক্ষর নেই; শুধুমাত্র ইভেন্ট হ্যাশগুলোই অপর্যাপ্ত। অখণ্ডতা যাচাই করার জন্য যাচাইকৃত ZIP-এর ভিতরে থাকা সঠিক অনুলিপি ব্যবহার করুন।
স্ক্রিনশট, প্রিন্টআউট বা ব্রাউজার দ্বারা তৈরি PDF ডেরিভেটিভের উপর TgWitness স্বাক্ষর নেই মূল যাচাইকৃত প্যাকেজটি সংরক্ষণ করুন এবং কীভাবে ডেরিভেটিভ তৈরি করা হয়েছে তা নথিভুক্ত করুন।

সংগ্রাহক প্রতিটি এক্সপোর্ট ফরম্যাট তৈরি করার আগে জার্নাল স্বাক্ষর যাচাই করে। সেই উৎস যাচাই পৃথকভাবে ডাউনলোড করা CSV বা HTML ফাইলে স্বাক্ষর তৈরি করে না। একটি বৈধ JSONL ইভেন্ট স্বাক্ষরও একইভাবে সংযুক্তি বাইট প্রদান করে না বা স্বতন্ত্রভাবে প্রমাণ করে না যে সম্পূর্ণ পর্যবেক্ষিত জার্নাল সরবরাহ করা হয়েছে।

তদন্ত হস্তান্তর#

  1. আপনার কেস নোটসে কেস রেফারেন্স, অপারেটর, সংখ্যাগত টেলিগ্রাম অ্যাকাউন্ট আইডি, নির্বাচিত উৎসসমূহ, সংগ্রহ নীতি এবং সংগ্রহ সময়কাল রেকর্ড করুন। TgWitness পর্যবেক্ষণ সংরক্ষণ করে; কেস বরাদ্দ এবং হেফাজত রেকর্ড অ্যাপ্লিকেশনের বাইরে পরিচালিত হয়। লাইভ গ্রহণ প্রক্রিয়ার সাথে পরিকল্পিত সংগ্রহ সেটআপকে নির্দিষ্ট করুন।
  2. ওয়ার্কস্পেসের পাবলিক-কি ফিঙ্গারপ্রিন্ট তার এক্সপোর্টগুলোর ওপর নির্ভর করার আগে স্বতন্ত্রভাবে সংরক্ষণ করুন। সংগ্রহের সময় কালেক্টরের বাইরে স্বাক্ষরিত চেকপয়েন্টগুলো সংরক্ষণ করুন। বিঘ্ন এবং অ্যাকাউন্টের দৃশ্যমানতার সীমা রেকর্ড করুন।
  3. স্বাক্ষরিত ZIP রপ্তানি করুন এবং স্বাক্ষরিত রান রসিদ সংরক্ষণ করুন। রপ্তানি করা জার্নাল সীমানার আগে বা তার সময়ে একটি চেকপয়েন্ট ব্যবহার করুন। পরবর্তী একটি চেকপয়েন্ট পূর্বের রপ্তানিকে খুব সংক্ষিপ্ত হিসেবে সঠিকভাবে প্রত্যাখ্যান করতে পারে। রপ্তানিতে প্যানেল ফিল্টার যাই হোক না কেন সম্পূর্ণ ওয়ার্কস্পেস জার্নাল অন্তর্ভুক্ত থাকে; শেয়ার করার আগে বিষয়বস্তু পর্যালোচনা করুন।
  4. প্রাপ্তকারীকে একটি বিশ্বস্ত ভেরিফায়ারের অনুলিপি এবং স্বতন্ত্রভাবে সরবরাহিত ফিঙ্গারপ্রিন্ট/চেকপয়েন্ট ব্যবহার করে জিপ যাচাই করতে বলুন। বিশ্বস্ত চেকআউট থেকে, যার পাইথন পরিবেশ সক্রিয় আছে:

    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).
    
    1. আর্কাইভের SHA-256, রপ্তানি সীমা, স্থানান্তর তারিখ, প্রেরক এবং প্রাপক আপনার হেফাজত রেকর্ডে নথিভুক্ত করুন। মূল প্যাকেজটি অক্ষত রাখুন এবং অনুলিপি থেকে কাজ করুন। অ্যাপ্লিকেশনের ব্যক্তিগত ডেটা ডিরেক্টরির পরিবর্তে প্রমাণ ফাইল শেয়ার করুন, কারণ সেই ডিরেক্টরিতে অ্যাকাউন্ট সেশন এবং স্বাক্ষর গোপনীয়তাও থাকে। ট্রান্সফারের জন্য, একটি এক্সপোর্ট পাসওয়ার্ড-সুরক্ষিত AES-256 ZIP ফাইলে রাখা যেতে পারে। পাসওয়ার্ড শুধুমাত্র গোপনীয়তা রক্ষা করে এবং সংরক্ষণ করা হয় না; প্রাপক আর্কাইভটি এক্সট্র্যাক্ট করে এবং ভিতরের স্বাক্ষরিত এক্সপোর্ট যাচাই করে, যা অপরিবর্তিত থাকে।
    2. যদি স্বাধীন সময় এঙ্করিং প্রয়োজন হয়, RFC 3161 পদ্ধতি অনুসরণ করুন এবং অনুরোধ, চেকপয়েন্ট, বিশ্বাসযোগ্য CA-এর তথ্য এবং যাচাইকৃত কর্তৃপক্ষের প্রতিক্রিয়া সংরক্ষণ করুন। শুধুমাত্র অনুরোধ প্রস্তুত করলে টাইমস্ট্যাম্প পাওয়া যায় না।

সফল যাচাইকরণ বিশ্বস্ত সংগ্রাহক কী এবং সংরক্ষিত সীমার তুলনায় অখণ্ডতা প্রতিষ্ঠা করে। উৎস সত্য, সম্পূর্ণ টেলিগ্রাম ডেলিভারি, বিশ্বস্ত সময়, এবং আইনি গ্রহণযোগ্যতার জন্য পৃথক প্রমাণ প্রয়োজন। এই সংস্করণটি এখনও লাইভ টেলিগ্রাম যোগ্যতা অর্জন বা একটি স্বাধীন ফরেনসিক/নিরাপত্তা মূল্যায়ন সম্পন্ন করেনি।

একটি অনুলিপি করা কালেক্টর কী একটি জাল প্রতিস্থাপন জার্নালে স্বাক্ষর করতে পারে। স্বাধীনভাবে সংরক্ষিত চেকপয়েন্ট বা সাক্ষী রেকর্ডের বিরুদ্ধে যাচাইকরণ পূর্বের পরিবর্তিত প্রিফিক্স সনাক্ত করে; শুধুমাত্র স্বাক্ষর যাচাইকরণ তা করতে পারে না। একজন সাক্ষী যা সংগ্রহকারী উপস্থাপন করেছে তা স্থির করে, তাই এটি স্বাধীনভাবে প্রথম বাহ্যিক চেকপয়েন্টের আগে তৈরি করা রেকর্ডগুলির সত্যতা প্রতিষ্ঠা করে না। ক্লাউড ডিপ্লয়মেন্ট রিপোর্টগুলি কনফিগারেশন এবং সংগ্রহকারী-রিপোর্টকৃত পরিমাপগুলি যাচাই করে; এগুলি প্রমাণ করে না যে বুটস্ট্র্যাপের সময় কোনো ব্যক্তিগত কী কখনো অনুলিপি করা হয়নি।

Apprise-এর মাধ্যমে পাঠানো বিজ্ঞপ্তিগুলোতে ওয়ার্কস্পেস এবং চ্যাটের নাম ও সংখ্যা থাকে; মুছে ফেলা ও সম্পাদিত বার্তার সংক্ষিপ্ত অংশগুলো শুধুমাত্র তখনই যোগ করা হয় যখন অপারেটর সেগুলো চালু করেন (ডিফল্টভাবে বন্ধ)। এগুলো একটি সুবিধাজনক সংকেত, প্রমাণ নয়: ডেলিভারি নিশ্চিত নয়, এবং শুধুমাত্র জার্নাল ও এর স্বাক্ষরিত রপ্তানিগুলোই পর্যবেক্ষিত বিষয়গুলো রেকর্ড করে। ওয়ার্কস্পেস প্রক্সি ব্যবহারের ক্ষেত্রে, বিজ্ঞপ্তিগুলি একই পথ ব্যবহার করে; যেসব সার্ভিস এটি ব্যবহার করতে পারে না, এবং MTProxy রুটগুলিকে প্রত্যাখ্যান করা হয়।

ইভেন্ট ক্যানোনিক্যালাইজেশন#

হ্যাশ ইনপুটে ঠিক এই ক্ষেত্রগুলো রয়েছে:

seq, observed_at, source_at, kind, chat_id, message_id, actor_id, payload, previous_hash

পাইথন-সামঞ্জস্যপূর্ণ JSON ব্যবহার করে UTF-8-এ সিরিয়ালাইজ করুন, সাজানো অবজেক্ট কী সহ, কোনো ASCII এস্কেপিং ছাড়া, কোনো অপ্রয়োজনীয় শূন্যস্থান ছাড়া, এবং কোনো NaN/ইনফিনিটি ছাড়া:

json.dumps(value, ensure_ascii=False, sort_keys=True,
           separators=(",", ":"), allow_nan=False).encode("utf-8")

সেই বাইটগুলির SHA-256 ইভেন্ট হ্যাশ হিসেবে ব্যবহৃত হয়। স্বাক্ষরটি 32টি কাঁচা হ্যাশ বাইট নিয়ে Ed25519 করা হয়, তারপর base64 এনকোড করা হয়। প্রথম previous_hash 64টি শূন্য। ক্রমসংখ্যা ১ থেকে শুরু হয়ে ১ করে বৃদ্ধি পায়। সমস্ত ইভেন্ট, অপারেশনাল ইভেন্টসহ, একটিই চেইন শেয়ার করে। ডুপ্লিকেট-ডেলিভারি সাপ্রেশন নেই: পুনরাবৃত্তি পর্যবেক্ষণগুলো পৃথক রসিদ, টেলিগ্রামের পৃথক ক্রিয়ার দাবি নয়।

Raw Telegram তারিখগুলো ISO স্ট্রিং; বাইনারি ফিল্ডগুলো bytes_base64 ধারণকারী অবজেক্টে পরিণত হয়। মেসেজ টেক্সট, এন্টিটি, মিডিয়া ডেসক্রিপ্টর, রিপ্লাই মেটাডেটা, রিঅ্যাকশন এবং সার্ভিস অ্যাকশনগুলো সরবরাহিত হলে রাও মেসেজ মেটাডেটায় সংরক্ষিত থাকে।

observed_at হল কালেক্টরের UTC ওয়াল ক্লক। source_at হল টেলিগ্রামের সরবরাহকৃত তারিখ, যখন এটি উপলব্ধ থাকে। মুছে ফেলার বিজ্ঞপ্তিগুলো সঠিক মুছে ফেলার সময় সরবরাহ করে না, তাই source_at শূন্যই থাকে। ট্রান্সপোর্ট গ্রহণের ক্রম অবশ্যই সোর্স-ইভেন্টের ক্রম নয়। ইতিহাসের স্ন্যাপশটগুলো পুরনো সোর্স তারিখ ব্যবহার করে কিন্তু বর্তমান পর্যবেক্ষণ সময় ব্যবহার করে।

অভিনেতা সেম্যান্টিক্স#

message.new actor_id হল বার্তার প্রেরক। message.edited-এর কোনো অনুমানিত সম্পাদক নেই; payload.sender_id পর্যবেক্ষিত বার্তার প্রেরককে রেকর্ড করে। মোছা actor_id শূন্যই থাকে। সদস্যতা সার্ভিস বার্তাগুলো প্রেরক এবং ক্রিয়া ধরন ধরে রাখে, প্রতিটি অপসারণকে স্বেচ্ছায় পদত্যাগে রূপান্তর না করে। কাঁচা অংশগ্রহণকারী আপডেটগুলো সরবরাহকৃত actor_id অপরিবর্তিত রাখে। প্রতিক্রিয়া স্ন্যাপশটগুলো কোনো পরিবর্তনকারী অ্যাক্টর উদ্ভাবন করে না।

ব্যক্তিগত চ্যাট এবং সাধারণ গ্রুপের মুছে ফেলার বিজ্ঞপ্তিতে শুধুমাত্র মেসেজ আইডি থাকে। এই চ্যাটগুলো একটি একাউন্ট-ব্যাপী আইডি সিকোয়েন্স শেয়ার করে, তাই একটি আইডি এই একাউন্টের একটি একক মেসেজকে চিহ্নিত করে। যখন সেই আইডির কোনো বার্তা আগে এই জার্নালে সংরক্ষণ করা হয়েছিল, তখন সেই চ্যাটে message.deleted হিসেবে ডিলিशन রেকর্ড করা হয়, যেখানে payload.chat_resolution মেথডটির নাম উল্লেখ করে। যেসব আইডি কখনো সংরক্ষণ করা হয়নি, সেগুলো কোনো chat_id ছাড়াই deletion.unscoped হিসেবে রাখা হয়; কিছুই অনুমান করা হয় না। চ্যানেল এবং সুপারগ্রুপগুলো প্রতি চ্যাটে বার্তার সংখ্যা গণনা করে এবং এইভাবে কখনই মিলানো হয় না। যখন মুছে ফেলা বার্তাটি পর্যবেক্ষিত অ্যাকাউন্ট দ্বারা পাঠানো হয়েছিল, payload.deleted_message_was_outgoing সত্য হয়; ডিলিটার এখনও সরবরাহ করা হয় না।

আবরণ: ধারাবাহিকতা, ফাঁক এবং অদৃশ্য আইডি#

প্রতিটি স্বাক্ষরিত ZIP ফাইলে coverage.json অন্তর্ভুক্ত থাকে, HTML রিপোর্ট একই সারসংক্ষেপ দিয়ে শুরু হয়, এবং verify.py ফাইলটিকে বিশ্বাস না করে events.jsonl থেকে এটি পুনরায় গণনা করে:

  • X থেকে Y পর্যন্ত ধারাবাহিকভাবে পর্যবেক্ষণ করা হয়। একটি সময়কাল observation.started দিয়ে শুরু হয় এবং বিরতি, স্টপ, টেলিগ্রাম সংযোগ বিচ্ছিন্ন হওয়া, সাইন-আউট, শৃঙ্খিপূর্ণভাবে বন্ধ না করে প্রক্রিয়া শুরু হওয়া, অথবা পর্যবেক্ষণের সময় কোনো রেকর্ড ছাড়া তিন মিনিটের বেশি সময় অতিবাহিত হলে শেষ হয়। (প্রতি মিনিটে হার্টবিট লেখা হয়, তাই নীরবতা মানে প্রক্রিয়াটি থেমে গেছে, আটকে গেছে বা কম্পিউটার শয়ন করেছে)। যখন প্যারামিটারে হার্টবিট ইন্টারভাল পরিবর্তন করা হয়, প্রতিটি হার্টবিট এটি রেকর্ড করে এবং অনুমোদিত নীরবতা হয়ে যায় তিনটি ইন্টারভাল, কখনোই তিন মিনিটের কম নয়।
  • Gaps পিরিয়ডগুলোর মধ্যেকার সময় এবং কারণ তালিকাভুক্ত করে। শেষ রেকর্ডে এখনও খোলা থাকা একটি গ্যাপ not_resumed_by_last_record দ্বারা চিহ্নিত করা হয়।
  • বার্তা আইডি পর্যবেক্ষণ করা হয়নি। চ্যানেল এবং সুপারগ্রুপের জন্য, যা প্রতি চ্যাটে বার্তাগুলো নম্বর করে, পর্যবেক্ষিত আইডিগুলোর মধ্যবর্তী অনুপস্থিত আইডিগুলো পরিসর হিসেবে তালিকাভুক্ত করা হয়। এগুলো 'পর্যবেক্ষণ করা হয়নি' হিসেবে রিপোর্ট করা হয় — মুছে ফেলা, কখনও ডেলিভারি হয়নি, বা সংরক্ষিত ইতিহাসের বাইরে — কখনই মুছে ফেলা হিসেবে নয়। ব্যক্তিগত চ্যাট এবং সাধারণ গ্রুপগুলো অ্যাকাউন্ট-ব্যাপী একটি ধারাবাহিকতা শেয়ার করে, তাই সেখানকার ফাঁকগুলো কোনো অর্থ বহন করে না এবং তালিকাভুক্ত করা হয় না।
  • চ্যাট-স্তরের ফাঁক বিজ্ঞপ্তি (যেমন টেলিগ্রাম একটি চ্যানেলে পার্থক্য পুনরুদ্ধারের জন্য অনুরোধ করছে) নোট হিসেবে গণ্য হয়; এগুলো বৈশ্বিক কভারেজ বাধাগ্রস্ত করে না।

কভারেজ বর্ণনা করে এই কালেক্টর কী রেকর্ড করেছে। এটি প্রমাণ নয় যে টেলিগ্রাম একটি ধারাবাহিক সময়কালে প্রতিটি আপডেট পৌঁছে দিয়েছে।

প্রযোজক#

স্বাক্ষরিত প্রমাণ ZIP-সমূহ, চ্যাট এক্সপোর্ট, সাক্ষীর জার্নাল এবং মানুষ-প্রোফাইল ফাইলগুলির বিবৃতিতে producer রয়েছে: সফটওয়্যার, সংস্করণ, প্রকল্প (PhishDestroy), হোমপেজ এবং সোর্স রিপোজিটরি। HTML রিপোর্টে একই লাইন দেখায়, এবং verify.py যা যাচাই করেছে তার অংশ হিসেবে এটি মুদ্রণ করে। এই ক্ষেত্রটি তৈরি হওয়ার আগে তৈরি করা আর্কাইভগুলো পূর্বের মতোই যাচাই করে এবং রিপোর্ট করে যে সেগুলো কোনো প্রস্তুতকারকের নাম উল্লেখ করে না।

ব্যক্তি প্রোফাইল#

একটি প্রোফাইল ফাইল (tgwitness-dossier-v1, JSON) একটি চ্যাটের জন্য জার্নালে ইতিমধ্যেই থাকা রেকর্ড থেকে অনুরোধের ভিত্তিতে তৈরি করা হয়; টেলিগ্রাম থেকে কিছুই আনা হয় না এবং প্রোফাইলের বিষয়বস্তু কখনই জার্নালে লেখা হয় না (প্রোফাইল চালু এবং বন্ধ করা dossier.changed হিসেবে রেকর্ড করা হয়)। সংরক্ষিত বার্তা থাকা প্রতিটি ব্যক্তির জন্য এটি নাম এবং ব্যবহারকারীর নাম ইতিহাস, টেলিগ্রাম ফ্ল্যাগ (বট, প্রতারণা, নকল, প্রিমিয়াম, যাচাইকৃত, সীমাবদ্ধ, মুছে ফেলা) সংরক্ষণের সময় যেমন দেখা গিয়েছিল, প্রোফাইল স্থানীয় অবতার ক্যাশে থাকা অনুরূপ অবতারগুলির ফটো আইডি, SHA-256 এবং পারসেপচুয়াল হ্যাশ (pHash, imagehash.phash-এর সাথে সামঞ্জস্যপূর্ণ), কার্যকলাপ (প্রথম এবং শেষ বার্তা, গণনা, সম্পাদিত এবং মুছে ফেলা শেয়ার, UTC ঘন্টা অনুযায়ী বার্তা), কে কার উত্তর দিচ্ছে, অন্যান্য চ্যাট এই জার্নালে ব্যক্তিটি যা লিখেছে, এবং ওয়ালেট (BTC, EVM, TRON, TON, LTC, DOGE, XMR, SOL; Base58Check ঠিকানাগুলি চেকসাম-ভ্যালিডেটেড), ফোন নম্বর, ব্যবহারকারীর নাম এবং লিঙ্ক, যার মধ্যে টেক্সটের পিছনে লুকানো লিঙ্কও রয়েছে।

প্রতিটি ফ্যাক্ট যে জার্নাল রেকর্ড (seq) থেকে এসেছে তা তালিকাভুক্ত করে, এবং record_hashes প্রতিটি উল্লেখিত রেকর্ডের হ্যাশ ধারণ করে। বিবৃতিটি ওয়ার্কস্পেস কী দিয়ে স্বাক্ষরিত:

python verify.py tgwitness-dossier-CHAT.json --fingerprint TRUSTED_SHA256 --evidence tgwitness-evidence.zip

স্বাক্ষর যাচাই করে, প্রমাণ রপ্তানি নিজেই যাচাই করে (স্বাক্ষর, হ্যাশ চেইন এবং ফাইলসমূহ) এবং নিশ্চিত করে যে প্রতিটি উল্লেখিত রেকর্ড একই ওয়ার্কস্পেসের সেই রপ্তানিতে অপরিবর্তিত অবস্থায় বিদ্যমান। অবতার হ্যাশগুলো স্থানীয় ক্যাশ থেকে এসেছে (জার্নাল রেকর্ড নয়) হিসেবে লেবেল করা হয়। উল্লেখগুলো প্যাটার্ন মিল — যাচাইকৃত তথ্য নয়, যাচাইয়ের দিকে নির্দেশ করে। প্রোফাইলগুলো প্রতিটি চ্যাটের জন্য চালু করা হয়, পাসওয়ার্ডসহ AES-256 ZIP ফাইল হিসেবে রপ্তানি করা যায়, এবং বন্ধ করে দেওয়া হলে বা চ্যাটটি সোর্স থেকে সরিয়ে ফেলা হলে সেগুলো মুছে যায়।

স্বতন্ত্র সাক্ষী#

একটি সাক্ষী জার্নাল (tgwitness-witness-v1) এবং এর চ্যানেল পোস্টগুলি verify.py --witness … --channel …-এর প্রমাণ রপ্তানির সাথে যাচাই করা হয়; স্বাধীন সাক্ষী দেখুন।

ম্যানিফেস্ট এবং চেকপয়েন্টসমূহ#

manifest.json-এ ফরম্যাট, রপ্তানি সময়, পাবলিক কী, ফিঙ্গারপ্রিন্ট, জার্নাল দৈর্ঘ্য, হেড হ্যাশ, স্কোপ, প্রযোজক, সীমাবদ্ধতা এবং SHA-256 অন্তর্ভুক্ত থাকে, manifest.json এবং manifest.sig ছাড়া প্রতিটি কন্টেন্ট সদস্যের। manifest.sig হল ক্যানোনিক্যাল ম্যানিফেস্ট JSON-এর উপর ভিত্তি করে তৈরি base64 Ed25519 স্বাক্ষর। যাচাইকারী অপ্রত্যাশিত/অনুপস্থিত সদস্য, ডুপ্লিকেট নাম, ক্ষতিগ্রস্ত ফাইল, ভাঙা সিকোয়েন্স/চেইন, অবৈধ স্বাক্ষর, এবং প্রদত্ত চেকপয়েন্টের সাথে অমিল প্রত্যাখ্যান করে। এটি কখনই আর্কাইভ পথ বের করে না। এটি মোট ঘোষিত অসংকুচিত আকারকে 4 GiB-এ সীমাবদ্ধ করে; --max-gib N বাড়ানো প্যারামিটার সীমা ব্যবহার করে তৈরি বড় আর্কাইভের অনুমতি দেয়।

বিশ্বস্ত চেকআউট বা পর্যালোচিত স্বাধীন অনুলিপি থেকে ভেরিফায়ার কোড সংগ্রহ করুন। অবিশ্বস্ত আর্কাইভের ভিতরে থাকা ভেরিফায়ার হল সেই আর্কাইভের লেখক দ্বারা সরবরাহিত একটি কার্যকরযোগ্য উপাদান; এর উপস্থিতি বহনযোগ্যতার সুবিধাজনকতা মাত্র, স্বতন্ত্র বিশ্বাসের ভিত্তি নয়।

একটি চেকপয়েন্ট পাবলিক কী, জার্নাল দৈর্ঘ্য, হেড হ্যাশ এবং সৃষ্টি সময় ধারণকারী একটি বিবৃতি স্বাক্ষর করে। যাচাইকারী পরীক্ষা করতে পারে যে পরবর্তী আর্কাইভে একই প্রিফিক্স রয়েছে। কোনো বিতর্কিত পরিবর্তনের আগে কালেক্টরের বাইরে একটি চেকপয়েন্ট সংরক্ষণ করুন: আর্কাইভ এবং চেকপয়েন্ট উভয়ই নিয়ন্ত্রণকারী একজন আক্রমণকারী উভয়কেই প্রতিস্থাপন করতে পারে।

আনপিন করা কী থেকে একটি বৈধ স্বাক্ষর শুধুমাত্র অভ্যন্তরীণ সামঞ্জস্য প্রতিষ্ঠা করে। রেকর্ডিং করার আগে যদি সংগ্রাহক বা কী আপস করা হয়ে থাকে, তাহলে পিন করা কী-ও সত্যিকারের উৎসের বিষয়বস্তু প্রমাণ করতে পারে না। বাহ্যিক টাইমস্ট্যাম্পিং এবং বিশ্বাসযোগ্য ক্যাপচার আলাদা প্রয়োজনীয়তা। TgWitness গ্রহণযোগ্যতা বা ফরেনসিক সার্টিফিকেশন নিশ্চিত করে না।

সংযুক্তিগুলি#

মিডিয়া/ ফোল্ডারের ফাইলগুলো SHA-256 দ্বারা ঠিকানা নির্ধারণ করা হয়। media.saved ইভেন্ট একটি হ্যাশ এবং বাইট দৈর্ঘ্যকে একটি নির্দিষ্ট মেসেজ ইভেন্টের সাথে সংযুক্ত করে। কাঁচা ফাইলনেমগুলো মেটাডেটা, কখনই স্থানীয় পথ নয়। মিডিয়া বাইটগুলো অ্যাসিঙ্ক্রোনাসভাবে ডাউনলোড করা হয়, তাই তাৎক্ষণিক মুছে ফেলা ক্যাপচারে বাধা দিতে পারে। নিষ্ক্রিয় সংগ্রহ, অতিরিক্ত আকারের/অজানা আকারের ফাইল, ডাউনলোড ব্যর্থতা এবং বিঘ্নিত ডাউনলোড ফলাফল হিসেবে দৃশ্যমান। একটি প্রসেস ক্র্যাশ রেফারেন্সবিহীন আংশিক ফাইল রেখে যেতে পারে; সেগুলো এক্সপোর্টে অন্তর্ভুক্ত হয় না।

ZIP এক্সপোর্টার সংরক্ষিত মিডিয়াকে তাদের নামের সাথে যাচাই করে। JSONL, CSV এবং HTML এক্সপোর্ট ইভেন্ট স্বাক্ষর যাচাই করে কিন্তু মিডিয়া বাইট বহন করে না। ডেরিভেটিভ রিপোর্টগুলো সুবিধাজনক; events.jsonl হল ইভেন্টের স্বীকৃত উপস্থাপনা।

স্থায়ী সংগ্রহ এবং প্রক্রিয়াকরণ রসিদ (০.২)#

একটি মিডিয়া জব এবং এর মেসেজ ইভেন্ট একটি লেনদেনে কমিট করে। জবটি মূল TL মেসেজ ডিসক্রিপ্টর সংরক্ষণ করে; স্বাক্ষরিত পর্যবেক্ষণ তার SHA-256, অ্যাকাউন্ট এবং সাইজ নীতি সংযুক্ত করে। পুনরুদ্ধার ডাউনলোড করার আগে সেই বাইন্ডিং যাচাই করে। এটি কখনোই বর্তমান মেসেজটি আনয়ন করে না এবং নীরবে একটি নতুন সংযুক্তি প্রতিস্থাপন করে। বিঘ্নিত জবগুলো পুনরায় চেষ্টা করা হয়, তবে স্থায়ী ব্যর্থতা স্পষ্ট ফলাফল হিসেবে রয়ে যায়।

প্রতিটি ওয়ার্কস্পেসের নিজস্ব জার্নাল এবং স্বাক্ষর পরিচয় রয়েছে। একটি process.started ইভেন্টে একটি রান আইডি, স্থানীয় ঘড়ি, নির্ভরতা সংস্করণ, সোর্স-ফাইল হ্যাশ, প্রাথমিক অ্যাকাউন্ট/স্कोप, এবং ক্যাপচার সেটিংস অন্তর্ভুক্ত থাকে। হার্টবিটগুলিতে রান আইডি, মনোটোনিক সময়, এবং কুই স্টেট অন্তর্ভুক্ত থাকে। প্রক্রিয়া রসিদটি পৃথকভাবে স্বাক্ষরিত বিবৃতি হিসেবেও ডাউনলোড করা যেতে পারে। ফাইলের পরিমাপগুলো স্ব-প্রতিবেদিত এবং এগুলো বিশ্বস্ত হার্ডওয়্যার প্রত্যয়ন নয়।

স্বয়ংক্রিয় চেকপয়েন্টগুলো স্টার্টআপে, পর্যবেক্ষণের সময় প্রতি পাঁচ মিনিট অন্তর (প্যারামিটার → সাইনড চেকপয়েন্ট এভরি), এবং শৃঙ্খিপূর্ণভাবে বন্ধ করার সময় স্থানীয়ভাবে সংরক্ষণ করা হয়। স্টার্টআপ যাচাইকরণ এবং এক্সপোর্ট সাম্প্রতিক সংরক্ষিত স্থানীয় চেকপয়েন্টের সাথে জার্নাল তুলনা করে। চেকপয়েন্ট টিকে থাকলে এটি ডাটাবেস রোলব্যাক সনাক্ত করতে পারে; উভয়ই নিয়ন্ত্রণকারী অপারেটর উভয়কেই প্রতিস্থাপন করতে পারে। স্বতন্ত্র সংরক্ষণ এবং বাহ্যিক বিশ্বস্ত টাইমস্ট্যাম্প পৃথক প্রয়োজনীয়তা হিসেবে রয়ে যায়।

পুনঃশুরু করার পর সংরক্ষিত টেলিগ্রাম আপডেট অবস্থান পুনরায় গ্রহণ করা হয় (catch_up_from-এ observation.started) এবং মিস হওয়া আপডেটগুলি অনুরোধ করা হয়। একটি নিয়মিত পুনঃপরীক্ষা মিস হওয়া বার্তাগুলির জন্য message.recovered রেকর্ড করে এবং যখন টেলিগ্রাম আর সংরক্ষিত বার্তা ফেরত দেয় না তখন message.missing_on_recheck রেকর্ড করে; পরেরটি মুছে ফেলার নোটিশ নয় এবং এতে কোনো মুছে ফেলারকারী বা সময় উল্লেখ নেই।

অফ-সাইট কপি এবং পুনরুদ্ধার (S3)#

অফ-সাইট কপি (রপ্তানি, ডিফল্টভাবে বন্ধ) জার্নাল সেগমেন্ট, সংরক্ষিত ফাইল, চেকপয়েন্টসমূহ তাদের টাইমস্ট্যাম্পসহ এবং সম্পন্ন চ্যাট রপ্তানি S3-সামঞ্জস্যপূর্ণ স্টোরেজে আপলোড করে, এনক্রিপ্ট করে AES-256-GCM দিয়ে এনক্রিপ্ট করে আপলোডের আগে ওয়ার্কস্পেস ভল্টে রাখা একটি কী-এর অধীনে S3-সামঞ্জস্যপূর্ণ স্টোরেজে আপলোড করা হয়; যখন বাকেটটি Object Lock সমর্থন করে তখন Object Lock ধরে রাখার নিয়ম প্রযোজ্য। ডাউনলোডকৃত কী ছাড়া কপিটি পড়া যাবে না। পুনরুদ্ধার এবং যাচাই করতে python -m tgwitness.replica restore --key-file KEY.json --out DIR ব্যবহার করুন।

Restore-এর জন্য একটি খালি সাধারণ ডিরেক্টরি প্রয়োজন। ডাউনলোড এবং ডিক্রিপ্ট করা অবজেক্টগুলো ব্যক্তিগত অস্থায়ী স্টোরেজে থাকে যতক্ষণ না পুরো জার্নাল এবং প্রতিটি সংরক্ষিত চেকপয়েন্ট যাচাইকরণ সম্পন্ন হয়। অনিরাপদ অবজেক্ট পথ, অসামঞ্জস্যপূর্ণ সেগমেন্ট পরিসীমা এবং একটি চেকপয়েন্টের চেয়ে ছোট জার্নালগুলো প্রত্যাখ্যাত হয়; যাচাইকরণ ব্যর্থ হলে কোনো পুনরুদ্ধারকৃত ফাইল প্রকাশিত হয় না। রিটেনশন চেকগুলি ফেরত দেওয়া অবজেক্ট লক মোড এবং তারিখকে আপলোডের সময় প্রেরিত সময়সীমার সাথে তুলনা করে (এক সেকেন্ড রাউন্ডিং টলারেন্স সহ)। মেয়াদোত্তীর্ণ, অবৈধ বা সংক্ষিপ্ত সময়সীমা যাচাইকৃত হিসেবে গণ্য হয় না। স্ট্যাটাস রিপোর্টে সেই নমুনা অবজেক্টের তথ্য দেখায় যার রিটেনশন ঐ আপলোড পাসের জন্য রিডিং করা হয়েছিল।

কপি অগ্রগতি গন্তব্য এবং এনক্রিপশন কী-তে সীমাবদ্ধ। এন্ডপয়েন্ট, বাকেট বা প্রিফিক্স পরিবর্তন করলে স্থানীয়ভাবে সংরক্ষিত জার্নাল, মিডিয়া এবং চেকপয়েন্টের সেই গন্তব্যে সম্পূর্ণ কপি শুরু হয়। পুরনো সীমাহীন অগ্রগতি সংরক্ষিত থাকে, তবে আপগ্রেডের পর একবার পুনরায় চালানো হয়। ইতিহাসগত চ্যাট এক্সপোর্ট যা ইতিমধ্যেই স্থানীয় আউটবক্স থেকে মুছে ফেলা হয়েছে, তা তাদের পূর্ববর্তী গন্তব্যেই থাকে।

অভাবিত বা ক্ষতিগ্রস্ত স্থানীয় মিডিয়াকে পাসের ত্রুটি হিসেবে রিপোর্ট করা হয় এবং মিডিয়া কার্সরটিকে তার আগে আটকে রাখে, যাতে ফাইলটি পরবর্তী পাসে আবার চেষ্টা করা হয়; এর পরের ফাইল, চেকপয়েন্ট এবং এক্সপোর্টগুলো এখনও কপি করা হয়। রিস্টোর চেকসমূহ সমস্ত সংরক্ষিত-মিডিয়া রেফারেন্সকে ডিক্রিপ্টকৃত হ্যাশ এবং রেকর্ডকৃত সাইজের বিরুদ্ধে যাচাই করে। বাধাগ্রস্ত আপলোডের অভিন্ন ওভারল্যাপিং জার্নাল সেগমেন্টগুলো ডিডুপ্লিকেট করা হয়; বিরোধপূর্ণ ওভারল্যাপগুলো প্রত্যাখ্যাত হয়। আপলোডের সময় তৈরি করা চেকপয়েন্টগুলো তাদের অন্তর্ভুক্ত জার্নাল রেকর্ডগুলো অনুলিপি না হওয়া পর্যন্ত স্থগিত রাখা হয়, তাই একটি সম্পন্ন পাস তার জার্নালের আগে কোনো চেকপয়েন্ট প্রকাশ করে না।

স্ট্রিমিং এক্সপোর্ট স্ন্যাপশট#

স্ট্রিমিং এক্সপোর্ট একটি স্থিতিশীল SQLite রিড স্ন্যাপশট ব্যবহার করে। ডাউনলোড শেষ হলে এর হেড বর্তমান লাইভ জার্নালের তুলনায় পুরনো হতে পারে। ওই স্ন্যাপশটের পর তৈরি করা একটি চেকপয়েন্ট সঠিকভাবে রিপোর্ট করতে পারে যে আর্কাইভটি ছোট; তুলনা করতে হবে এক্সপোর্ট করা প্রিফিক্সে বা তার আগে থাকা চেকপয়েন্টের সাথে, কোনো ইচ্ছামত পরের চেকপয়েন্টের সাথে নয়।

RFC 3161 প্রস্তুতি এবং প্রতিক্রিয়া যাচাইকরণ (০.২)#

প্রমাণ মোড (ডিফল্টভাবে বন্ধ) প্রতিটি স্বাক্ষরিত চেকপয়েন্টের শুধুমাত্র SHA-256 হ্যাশ তালিকাভুক্ত RFC 3161 কর্তৃপক্ষ এবং OpenTimestamps ক্যালেন্ডারগুলোতে ওয়ার্কস্পেস রুটের মাধ্যমে পাঠায়, MTProxy-র মাধ্যমে কখনোই নয়। উত্তরগুলো checkpoints/anchors/-এ রাখা হয়, রপ্তানি করা হয়, এবং verify.py দ্বারা যাচাই করা হয় (--tsa-ca TSA স্বাক্ষর যাচাই করে; OpenTimestamps প্রমাণগুলি ots upgrade এবং ots verify দিয়ে নিশ্চিত করুন)।

প্যানেল একটি অনুরোধ সংরক্ষণাগার প্রস্তুত করে, যাতে থাকে ক্যানোনিক্যাল checkpoint.json বাইট, একটি SHA-256 বার্তার ছাপ এবং timestamp.tsq-এ এলোমেলো নন্স, চেকসাম এবং নির্দেশনা। কোনো নেটওয়ার্ক অনুরোধ করা হয় না। প্রস্তুতি একটি বিশ্বাসযোগ্য টাইমস্ট্যাম্প নয়।

python -m tgwitness.anchor verify OpenSSL ts-কে দুইবার কল করে: একবার চেকপয়েন্ট বাইটের বিরুদ্ধে এবং একবার মূল অনুরোধের বিরুদ্ধে। একটি বিশ্বস্ত CA ফাইল স্পষ্টভাবে প্রয়োজন; সংযুক্ত সার্টিফিকেটগুলো স্বয়ংক্রিয়ভাবে বিশ্বাসযোগ্য নয়। CLI-তে অনুরোধ যাচাইকরণ ঐচ্ছিক, তাই ননস যাচাই করতে --request ব্যবহার করুন। ফলাফলে উল্লেখ থাকবে এটি যাচাই করা হয়েছে কিনা। কালেক্টর চেকপয়েন্টের স্বাক্ষর এবং জার্নাল এখনও বিশ্বাসযোগ্য কালেক্টর ফিঙ্গারপ্রিন্ট দিয়ে পৃথকভাবে যাচাই করতে হবে।

বর্তমান যাচাইকারী প্রত্যাহার সংক্রান্ত তথ্য সংগ্রহ করে না বা সার্টিফিকেট মেয়াদোত্তীর্ণ হওয়ার পর দীর্ঘমেয়াদী সংরক্ষণ যাচাইকরণ বাস্তবায়ন করে না। সফল স্বাক্ষর যাচাইকরণকে যোগ্য টাইমস্ট্যাম্প বা আইনি গ্রহণযোগ্যতার সমতুল্য মনে করবেন না। উন্নয়নের সময় কোনো প্রকৃত স্বাধীন TSA-র সাথে যোগাযোগ করা হয়নি। প্রক্রিয়া দেখুন।