কীভাবে একটি সার্ভার আমাদের গোপনীয়তাগুলিকে পড়ার জন্য কীগুলি ধরে না রেখে সঞ্চয় এবং সিঙ্ক্রোনাইজ করতে পারে? আমরা অনুসরণ করব কিভাবে Confidex এর কী তৈরি করে, একটি লকের মধ্যে সেগুলিকে রক্ষা করে এবং ডেটা এনক্রিপ্ট করতে এবং পরিবর্তনগুলি যাচাই করতে ব্যবহার করে।
তালা
শুধু নির্বাচিত জনই দরজাটি খুলতে পারে
ম্যাট্রিক্স রিলোডেড
কল্পনা করুন যে আমরা গোপন তথ্য সংরক্ষণ করার জন্য একটি ভার্চুয়াল vault তৈরি করছি। অ্যাপ্লিকেশনটি বন্ধ হওয়ার পরে এটি অবশ্যই একটি ল্যাপটপে সেই ডেটা রাখতে হবে এবং আমাদের এটি অন্য ডিভাইসে খুলতে হবে। ভল্টের নিজস্ব চাবি লাগবে। আমাদের অবশ্যই সেগুলি সংরক্ষণ করতে হবে যাতে ফাইলগুলি অনুলিপি করা কোনও বহিরাগতকে তাদের বিষয়বস্তু পড়তে বা পরিবর্তন করার কোনও উপায় না দেয়।
একটি lock কীগুলি রক্ষা করে: একটি ছোট এনক্রিপ্ট করা ফাইল৷ এটি খুলতে একটি মাস্টার পাসওয়ার্ড এবং একটি গোপন কোড লাগে, secret_key; কোনটিই ফাইলে নেই। আমরা সকালের খবরের কাগজে পুরো তালা ছাপাতে পারতাম। পাঠকরা একটি অনুলিপি পাবে, তবে এটি প্রকাশ করলে ব্যক্তিগত কীগুলি প্রকাশ পাবে না।
ধরুন একজন বহিরাগত এই ফাইলটি পায় এবং এমনকি মাস্টার পাসওয়ার্ডও শিখেছে। তারা এখন প্রতিটি গণনা পুনরাবৃত্তি করতে পারে যার জন্য শুধুমাত্র পাসওয়ার্ডের প্রয়োজন, কিন্তু সেই গণনাগুলি লকটি খোলার কী তৈরি করবে না: secret_keyও একটি ইনপুট। ফাইলটিতে পাসওয়ার্ডের আলাদা কোনো পরীক্ষা নেই। এটি খোলার জন্য এখনও অজানা গোপন কোড প্রয়োজন।
সেই কোডটি আসে ক্রিপ্টোগ্রাফিকভাবে এলোমেলো ডেটা থেকে; একজন ব্যক্তি এটি উদ্ভাবন করে না। যতক্ষণ না secret_key অজানা, এমনকি একটি সঠিকভাবে অনুমান করা মাস্টার পাসওয়ার্ডও লক খুলবে না: আক্রমণকারীর এখনও একটি এলোমেলো গোপনীয়তার অভাব রয়েছে। একা একটি দুর্বল পাসওয়ার্ড তাই সার্ভারের অনুলিপিকে ব্যবহারিক অভিধান আক্রমণে পরিণত করে না।
যদি আক্রমণকারীও secret_key পায়, তারা অফলাইনে মাস্টার-পাসওয়ার্ড অনুমান পরীক্ষা করতে পারে। এটি ব্যয়বহুল, তবে চূড়ান্ত অসুবিধা পাসওয়ার্ডের শক্তির উপর নির্ভর করে।
চাবি
ভদ্রলোক, চাবি কি করে? কী... জিনিস আনলক করবেন?
পাইরেটস অফ দ্য ক্যারিবিয়ান - ডেড ম্যানস চেস্ট
অ্যাপ্লিকেশনটি অপারেটিং সিস্টেমের ক্রিপ্টোগ্রাফিক জেনারেটর থেকে 32 র্যান্ডম বাইট প্রাপ্ত করে এবং সেগুলিকে কী হিসাবে ব্যবহারের জন্য প্রস্তুত করে। এই প্রস্তুত বাইট হল ব্যক্তিগত মাস্টার কী, master_key।
অ্যাপ্লিকেশনটি সর্বদা master_key থেকে একই কীগুলি গ্রহণ করে: একই বাইটে একই গণনার পুনরাবৃত্তি একই ফলাফল দেয়। একটি ল্যাপটপ এবং একটি ফোন তাই অভিন্ন কীগুলি পুনরুদ্ধার করতে পারে৷ একটি নতুন ডিভাইসে master_key পেতে, অ্যাপ্লিকেশনটিকে প্রথমে মাস্টার পাসওয়ার্ড এবং secret_key দিয়ে লক খুলতে হবে।
প্রথম জোড়া: এনক্রিপশন
আমি প্রধান শিক্ষক।
ঘোস্টবাস্টারস
এনক্রিপ্ট করা ডেটা সঞ্চয় করতে, অ্যাপ্লিকেশনটি master_key: secret_key থেকে একটি পাবলিক কী গণনা করে। এটি ভল্টের জন্য ডেটা এনক্রিপ্ট করতে পারে, যখন ডিক্রিপশনের প্রয়োজন হয় master_key৷
"পাবলিক" অ্যালগরিদমে এই কীটির ভূমিকা বর্ণনা করে, এটি সবাইকে দেওয়ার বাধ্যবাধকতা নয়। Confidex এ এটি ব্যবহারকারীর সাথে থাকে। এটি লক খোলার জন্য প্রয়োজনীয় দ্বিতীয় গোপনীয়তা, তাই এটি স্থানীয় থাকে এবং নেটওয়ার্কের মাধ্যমে পাঠানো হয় না। নিজে থেকেই, secret_key কাউকে ভল্টের জন্য ডেটা এনক্রিপ্ট করতে দেয়, কিন্তু এটিকে ডিক্রিপ্ট করে না বা এর পক্ষ থেকে পরিবর্তনগুলি স্বাক্ষর করে না৷
X25519 master_key থেকে secret_key গণনা করার অ্যালগরিদম. master_key পুনরুদ্ধার করা, কেবল secret_key জানা থাকলে, বাস্তবে অসম্ভব. প্রতি সেকেন্ডে 10^18 কার্ভ অপারেশন করতে পারে এমন একটি কাল্পনিক সুপারকম্পিউটারেও একটি ধ্রুপদি আক্রমণে গড়ে প্রায় 2.3 ট্রিলিয়ন বছর লাগবে (SafeCurves-এর হিসাব).
দ্বিতীয় জোড়া: স্বাক্ষর
একমাত্র আসল জিনিস হল স্বাক্ষর
ক্যাচ মি ইফ ইউ ক্যান
প্রথম জোড়া বিষয়বস্তু লুকাতে সাহায্য করে। ভল্টের মালিক একটি পরিবর্তন অনুমোদন করেছেন তা নিশ্চিত করার জন্য আমাদের এখন একটি উপায় প্রয়োজন। সার্ভারটি অবশ্যই স্বাক্ষরগুলি পরীক্ষা করতে সক্ষম হবে, তাই আমাদের এটিকে একটি সর্বজনীন যাচাইকরণ কী পাঠাতে হবে। প্রথম জোড়ার সর্বজনীন অংশ হল secret_key, যা সার্ভার অবশ্যই গ্রহণ করবে না৷ তাই আমরা স্বাক্ষরের জন্য একটি দ্বিতীয়, স্থায়ী কী জোড়া তৈরি করি।
অন্য একটি স্বাধীন গোপনীয়তা সঞ্চয় করার পরিবর্তে, আমরা master_key থেকে একটি ব্যক্তিগত স্বাক্ষর কী প্রাপ্ত করি এবং এটিকে signing_key বলি৷ অ্যাপ্লিকেশনটি ডেটা এবং লক স্বাক্ষর করতে এটি ব্যবহার করে। অন্যান্য ডিভাইস এবং সার্ভার বিষয়বস্তু না পড়ে স্বাক্ষর পরীক্ষা করার জন্য তার সর্বজনীন অংশ ব্যবহার করে।
আমরা এই জোড়াটি একই master_key থেকে পুনরুদ্ধার করতে পারি। অ্যাপ্লিকেশনটি এটি থেকে একটি প্রারম্ভিক মান অর্জন করে: 32 বাইট যা স্বতন্ত্রভাবে স্বাক্ষর কী নির্ধারণ করে।
বিভিন্ন কাজের জন্য বিভিন্ন কী বের করতে, আমরা গণনায় একটি নির্দিষ্ট লেবেল অন্তর্ভুক্ত করি: এখানে, confidex/vault/ed25519/v1। একই master_key এবং একই লেবেল সবসময় একই কী তৈরি করে।
মাস্টার পাসওয়ার্ড এই গণনা প্রবেশ করান না. উভয় জোড়াই নির্ভর করে master_key-এর এলোমেলো বাইটের ওপর, কোনো ব্যক্তির উদ্ভাবিত কোনো স্ট্রিংয়ের ওপর নয়। এই পার্থক্যটি পরে গুরুত্বপূর্ণ হবে: পাসওয়ার্ডটি ইতিমধ্যে বিদ্যমান কীগুলির অ্যাক্সেস রক্ষা করবে, তাই আমরা কীগুলি পরিবর্তন না করেই এটি পরিবর্তন করতে পারি।
ডেরিভেশন একটি হ্যাশ-ভিত্তিক কী ডেরিভেশন ফাংশন ব্যবহার করে: HKDF, HMAC-based Extract-and-Expand Key Derivation Function। Confidex এটিকে SHA-256 দিয়ে ব্যবহার করে, তাই নাম HKDF-SHA256। ফলে 32 বাইট হল Ed25519 জোড়ার জন্য seed। signing_key-এর সর্বজনীন অংশ secret_key প্রকাশ করে না, তাই আমরা স্বাক্ষর যাচাইয়ের জন্য এটি সার্ভারে পাঠাতে পারি।
একটি লক ফাইল কি এবং এটি কি করে?
পড বে দরজা খুলো, HAL।
একটি স্পেস ওডিসি
আমি দুঃখিত, ডেভ। আমি ভয় পাচ্ছি আমি এটা করতে পারব না।
লকটি একটি এনক্রিপ্ট করা master_key সঞ্চয় করে৷ এটি খোলার জন্য মাস্টার পাসওয়ার্ড এবং secret_key প্রয়োজন৷ পাবলিক হেডারে ফরম্যাট সংস্করণ, ভল্ট শনাক্তকারী, signing_key-এর সর্বজনীন অংশ, একটি লবণ এবং পাসওয়ার্ড-প্রসেসিং প্যারামিটার রয়েছে। অভ্যন্তরীণ বিন্যাস সংস্করণটি master_key এর পাশাপাশি এনক্রিপ্ট করা হয়েছে৷
লক তৈরি করার সময়, অ্যাপ্লিকেশনটিতে ইতিমধ্যেই master_key আছে, তাই এটি এনক্রিপশনের আগে secret_key গণনা করে। এটি খোলার সময়, ব্যবহারকারী আলাদাভাবে secret_key সরবরাহ করে: এটি লকের সর্বজনীন অনুলিপি থেকে অনুপস্থিত।
ডিক্রিপশনের পরে, অ্যাপ্লিকেশনটি X25519 ব্যবহার করে master_key-এর সর্বজনীন অংশ গণনা করে এবং এটিকে secret_key-এর সাথে মেলে। এটি তারপরে signing_key পুনরুদ্ধার করে এবং শিরোনামের কীটির সাথে এর সর্বজনীন অংশের তুলনা করে। এইভাবে, লক নিজেই চেক করে।
মাস্টার-পাসওয়ার্ড অনুমান ধীর করতে, প্রতিটি প্রচেষ্টা সময় এবং মেমরি খরচ করতে হবে. Confidex 64 MiB মেমরি এবং তিনটি পাস সহ Argon2id ব্যবহার করে। পাসওয়ার্ড প্রক্রিয়াকরণ একটি এলোমেলো লবণ ব্যবহার করে। লবণ গোপন নয়: এটি একই পাসওয়ার্ড বিভিন্ন লকগুলিতে বিভিন্ন ফলাফল তৈরি করে।
যদি secret_key আগে থেকেই জানা থাকে, পাসওয়ার্ডের দৈর্ঘ্য আক্রমণের পরিসর নাটকীয়ভাবে বদলে দেয়। 5টি দৈবচয়িত ছোট হাতের লাতিন অক্ষরের প্রায় 12 মিলিয়ন সমন্বয় আছে, 7টির প্রায় 8 বিলিয়ন, আর 12টির প্রায় 9.5 × 10¹⁶। 7 থেকে 12 অক্ষরে গেলে অনুসন্ধানের পরিসর প্রায় 12 মিলিয়ন গুণ বেড়ে যায়। একটি নির্দিষ্ট যন্ত্রে 7 অক্ষরের অনুসন্ধানে গড়ে এক দিন লাগলে, 5 অক্ষরের জন্য প্রায় দুই মিনিট এবং 12 অক্ষরের জন্য প্রায় 33,000 বছর লাগবে।
Argon2id ফলাফল এবং secret_key থেকে একটি কী পেতে, আমরা confidex/lock/wrap/v1 লেবেল সহ আগে চালু করা HKDF-SHA256 ফাংশনটি ব্যবহার করি। ফলাফল হল wrapping_key, চাবি যা লকটিকে এনক্রিপ্ট করে।
আমাদের অবশ্যই master_key লুকিয়ে রাখতে হবে এবং এটিকে টেম্পারিং থেকে রক্ষা করতে হবে। XChaCha20-Poly1305 এটিকে wrapping_key দিয়ে এনক্রিপ্ট করে এবং একটি প্রমাণীকরণ ট্যাগ যোগ করে। ট্যাগটি সাইফারটেক্সটকে পাবলিক হেডারে আবদ্ধ করে: একটি ভুল পাসওয়ার্ড বা সুরক্ষিত বাইটে পরিবর্তন খোলার ব্যর্থতা তৈরি করে। ট্যাগ এবং একটি এলোমেলো একক-ব্যবহারের মান, nonce, সাইফারটেক্সট সহ সংরক্ষণ করা হয়।
প্রতিবার লকটি তৈরি বা এনক্রিপ্ট করা হলে, অ্যাপ্লিকেশনটি একটি তাজা লবণ এবং nonce প্রাপ্ত হয়। এনক্রিপ্ট করা বিষয়বস্তুগুলির মধ্যে রয়েছে একটি সংস্করণ বাইট এবং 32 বাইট master_key; একটি 24-বাইট nonce এবং একটি 16-বাইট ট্যাগ তাদের পাশাপাশি সংরক্ষণ করা হয়। অ্যালগরিদমের ডকুমেন্টেশন নির্মাণের বর্ণনা দেয়।
পুনরুদ্ধার করা কীগুলির মধ্যে একটি অমিল একটি ইচ্ছাকৃতভাবে বিকৃত লক বা এটি তৈরি করা প্রোগ্রামের একটি বাগ থেকে হতে পারে৷ র্যান্ডম বাইট দুর্নীতি সাধারণত আগে সনাক্ত করা হয়, যখন ট্যাগ চেক করা হয়।
সার্ভারের কাছে এই ট্যাগ চেক করার জন্য প্রয়োজনীয় গোপনীয়তা নেই। লকটি স্থানান্তর করতে, অ্যাপ্লিকেশনটি তাই signing_key দিয়ে তৈরি একটি স্বাক্ষর যুক্ত করে৷ এটি পাবলিক হেডার এবং এনক্রিপ্ট করা বিষয়বস্তু সহ সম্পূর্ণ সমাপ্ত ফাইল কভার করে। সার্ভার স্বাক্ষর পরীক্ষা করে এবং, প্রথম আপলোডের সময়, signing_key এর সম্পূর্ণ পাবলিক অংশ এবং অভ্যন্তরীণ ভল্ট শনাক্তকারীকে পিন করে। এটি এই কীটির বিপরীতে পরবর্তী পরিবর্তনগুলি পরীক্ষা করে। লক এবং এনক্রিপ্ট করা ডেটা একই signing_key দিয়ে স্বাক্ষরিত, master_key থেকে পুনরুদ্ধার করা হয়েছে।
ভল্ট
আমরা এখন লক প্রকাশ করতে পারেন. শুধুমাত্র secret_key এবং master password জানে এমন কেউ master_key পড়তে পারে, যখন যে কেউ লক ফাইল থেকে পাবলিক সাইনিং কী নিতে পারে এবং লক বা ডেটার বিষয়বস্তু না দেখে স্বাক্ষরিত ডেটা চেক করতে পারে।
একটি পাসওয়ার্ড বিবেচনা করুন, SuperPa55worD। আপাতত, আমরা শুধুমাত্র এটি সংরক্ষণ করতে চাই: অ্যাপ্লিকেশনটি বন্ধ করার পরে, আমরা লক ফাইল এবং এনক্রিপ্ট করা পাসওয়ার্ডটি যেকোনও জায়গায় পাঠাতে সক্ষম হব যাতে কেউ SuperPa55worD না দেখে, এখনও তাদের আমাদের লেখকত্ব যাচাই করতে দেয়৷ যখন আমাদের কাছে secret_key এবং master password থাকে তখন এনক্রিপশন অবশ্যই বিপরীত হতে হবে। একটি সিমেট্রিক সাইফার একই কী দিয়ে এনক্রিপ্ট এবং ডিক্রিপ্ট করতে পারে। যেহেতু আমরা সেই চাবিটি সংরক্ষণ করি না, তাই আমরা অবশ্যই তালা ব্যবহার করে এটি পুনরুদ্ধার করতে সক্ষম হব। আমরা একে বলব message_key।
আমরা প্রতিটি নতুন এনক্রিপশনের জন্য একটি পৃথক message_key পাব। আমাদের এখনও এটির পুনরুদ্ধারের ব্যবস্থা করতে হবে: সাইফারটেক্সটের পাশে চাবিটি খোলা রেখে দিলে যে কেউ একটি কপি সহ সবকিছু পড়তে দেবে।
তাজা র্যান্ডম বাইট থেকে, অ্যাপ্লিকেশনটি এই এনক্রিপশনের জন্য একটি অস্থায়ী X25519 জোড়া তৈরি করে: record_key। এটি তারপরে record_key এর ব্যক্তিগত অংশ এবং ভল্টের স্থায়ী সর্বজনীন কী, secret_key নেয় এবং একটি ভাগ করা গোপনীয়তা গণনা করে৷ একটি পৃথক ফাংশন এই গোপন থেকে উদ্ভূত হয় message_key; এই কী আমাদের পাসওয়ার্ড এনক্রিপ্ট করে।
পড়ার সময়, অ্যাপ্লিকেশনটি অন্য রুট নেয়। এটি master_key এবং record_key এর সর্বজনীন অংশ ব্যবহার করে। এই দুটি কী একই ভাগ করা গোপনীয়তা তৈরি করে। গাণিতিকভাবে, উভয় রুটই বক্ররেখার একই প্রাথমিক বিন্দুকে দুটি ব্যক্তিগত সংখ্যা দ্বারা গুণ করে, ভিন্ন ক্রমে। আদেশ ফলাফল পরিবর্তন করে না. তাই আমরা record_key এর ব্যক্তিগত অংশ না রেখেই ডিক্রিপশন কী পুনরুদ্ধার করতে পারি।
দুটি পাবলিক কী থেকে এই গোপনীয়তা প্রাপ্ত করা কার্যত অসম্ভব: যে কোনো রুটে সংশ্লিষ্ট ব্যক্তিগত কী প্রয়োজন। পাবলিক পয়েন্টগুলি আমাদেরকে দক্ষতার সাথে ব্যক্তিগত সংখ্যাগুলি পুনরুদ্ধার করতে দেয় না যা তাদের তৈরি করেছিল। এই গাণিতিক কৌতুকটি ভল্টের নিরাপত্তাকে আন্ডারপিন করে। কিন্তু এটি আমাদের তালা সংযুক্ত একটি ভিন্ন ভল্ট দিতে কেউ বাধা দেয় না.
আমরা এখন record_key এর সর্বজনীন অংশের পাশাপাশি সাইফারটেক্সট সংরক্ষণ করতে পারি। record_key এর ব্যক্তিগত অংশ এবং ব্যবহৃত message_key ভবিষ্যতে পড়ার জন্য আর প্রয়োজন নেই৷ পরে, অ্যাপ্লিকেশনটি master_key থেকে ডিক্রিপশন কী এবং record_key এর সঞ্চিত সর্বজনীন অংশ পুনরুদ্ধার করে। একটি স্থায়ী ভল্ট সিক্রেট এইভাবে অনেকগুলি আলাদাভাবে এনক্রিপ্ট করা মানগুলিকে ডিক্রিপ্ট করতে পারে, প্রতিটির নিজস্ব message_key প্রয়োজন হলে পুনরুদ্ধার করা হয়।
পাঠ্যটি লুকানো যথেষ্ট নয়: এটি পড়ার সময় আমাদের অবশ্যই টেম্পারিং সনাক্ত করতে হবে। এনক্রিপশন তাই একটি প্রমাণীকরণ ট্যাগ যোগ করে, একটি সংক্ষিপ্ত মান যা এনক্রিপ্ট করা ডেটার সাথে একসাথে চেক করা হয়। চেক ব্যর্থ হলে, আবেদন ফলাফল প্রত্যাখ্যান. এটি অবশ্যই সফলভাবে ডিক্রিপ্ট করা পাসওয়ার্ড হিসাবে এলোমেলো বা পরিবর্তিত পাঠ্য প্রদর্শন করবে না।
আমরা এমন একটি নির্মাণ বর্ণনা করেছি যেখানে একটি অপ্রতিসম জোড়া একটি ভাগ করা গোপনীয়তা স্থাপন করতে সাহায্য করে, যখন message_key বিষয়বস্তুগুলিকে এনক্রিপ্ট করে৷ এটিকে বলা হয় Hybrid Public Key Encryption, বা HPKE, এবং RFC 9180 এ উল্লেখ করা হয়েছে। Confidex গোপনে সম্মত হতে X25519 ব্যবহার করে, কীগুলি বের করতে HKDF-SHA256 এবং অখণ্ডতা যাচাইয়ের সাথে এনক্রিপশনের জন্য ChaCha20-Poly1305 ব্যবহার করে। এখানে, HKDF record_key এবং master_key জোড়া ব্যবহার করে সম্মত শেয়ার করা গোপনীয়তা নেয়; এটি Ed25519 seed প্রাপ্ত করা থেকে একটি পৃথক কাজ। RFC 5869 বর্ণনা করে HKDF।
পরবর্তী এনক্রিপশনের জন্য, অ্যাপ্লিকেশনটি একটি নতুন record_key এবং একটি নতুন HPKE প্রসঙ্গ তৈরি করে। message_key এবং nonce এর সংমিশ্রণ পুনঃব্যবহার করলে সাইফারের সুরক্ষা ভেঙে যায়। Confidex-এ, কী এবং nonce HPKE-এর ভিতরে প্রাপ্ত হয়, একটি বার্তার জন্য ব্যবহৃত হয় এবং তারপর প্রসঙ্গটি বাতিল করা হয়।
ChaCha20 নিজেই একটি 256-বিট message_key ব্যবহার করে। সরাসরি আক্রমণের অনুভূতি পেতে, কল্পনা করুন একটি কাল্পনিক সুপার কম্পিউটার প্রতি সেকেন্ডে এক বিলিয়ন বিলিয়ন প্রার্থী পরীক্ষা করছে। সম্ভাব্য 2²⁵⁶ কী অনুসন্ধান করতে প্রায় 1.8 × 10⁵¹ বছর সময় লাগবে। RFC 8439 অ্যালগরিদম এবং তার বিশ্লেষণ বর্ণনা করে।
একটি রেকর্ড
আমরা খুশি?
পাল্প ফিকশন
আমরা পাসওয়ার্ড সংরক্ষণ করেছি, কিন্তু একটি ওয়েবসাইটে লগ ইন করার জন্য সাধারণত একটি ব্যবহারকারীর নাম এবং একটি ঠিকানা প্রয়োজন হয়। কখনও কখনও তাদের পাশে আমাদের একটি নোটের প্রয়োজন হয়। যদি আমরা এই মানগুলিকে আলাদাভাবে সঞ্চয় করি, তবে অ্যাপ্লিকেশনটিকে অবশ্যই মনে রাখতে হবে যে তারা একসাথে রয়েছে। আসুন এই "কাগজগুলি" একটি খামে রাখি। আমরা ক্ষেত্রগুলিকে একটি সংগ্রহে একত্রিত করি এবং এটিকে একটি record বলি৷
একটি রেকর্ডে ক্ষেত্রগুলির যেকোনো সমন্বয় থাকতে পারে। অ্যাপ্লিকেশনটি সেগুলিকে একটি প্যাকেটে একত্রিত করে, এটিকে সংকুচিত করে এবং আমরা এইমাত্র বর্ণিত নির্মাণ ব্যবহার করে পুরোটিকে এনক্রিপ্ট করে। ক্ষেত্রের মান, নাম, প্রকার এবং ট্যাগ সবই সুরক্ষিত। ওয়েবসাইটের ঠিকানা পরিবর্তন করা, এমনকি একই পাসওয়ার্ড রেখেও, পুরো রেকর্ডের একটি নতুন সংস্করণ তৈরি করে, একটি নতুন record_key দিয়ে এনক্রিপ্ট করা হয়৷
হ্যাশ-চেইন
আপনার প্রজেক্টে কি ব্লকচেইন ব্যবহার করা উচিত? → না
XKCD 2267
যে কেউ secret_key জানেন তিনি আমাদের ভল্টের জন্য একটি এনক্রিপ্ট করা রেকর্ড প্রস্তুত করতে পারেন। এটিকে আমাদের হিসাবে গ্রহণ করা এড়াতে, অ্যাপ্লিকেশনটি signing_key দিয়ে প্রতিটি রেকর্ড সংস্করণে স্বাক্ষর করে। এই কী ব্যতীত, একজন বহিরাগত ব্যক্তি স্বাক্ষর সহ একটি সংস্করণ তৈরি করতে পারে না যা সার্ভার এবং অন্যান্য ডিভাইসগুলি গ্রহণ করবে।
এনক্রিপ্ট করা সংস্করণটির কিছু সহগামী তথ্য প্রয়োজন: এটি কোন ভল্ট এবং রেকর্ডের অন্তর্গত, কখন এটি পরিবর্তিত হয়েছে এবং কোন সংস্করণগুলি এটির আগে রয়েছে৷ এটি সর্বজনীন শিরোনাম গঠন করে। এটিতে পাসওয়ার্ড নেই, তবে এটির এখনও সুরক্ষা প্রয়োজন: অন্যথায় কেউ সাইফারটেক্সট স্পর্শ না করেই বস্তুর মালিকানা এবং সম্পর্ক পরিবর্তন করতে পারে। অ্যাপ্লিকেশনটি সাইফারটেক্সট সহ সঠিক শিরোনাম বাইটগুলিকে সাইন করে। স্বাক্ষরিত তথ্য পরিবর্তন স্বাক্ষর অকার্যকর হয়.
সার্ভারটি সিল করা পার্সেলের গুদামের মতো। এটি শিরোনাম, এনক্রিপ্ট করা বিষয়বস্তু এবং স্বাক্ষর দেখে, কিন্তু ভিতরে পাসওয়ার্ড নয়, এবং এটি জানে যে প্রাপক শহরে বিদ্যমান। এটি signing_key এর পিন করা সর্বজনীন অংশের বিপরীতে স্বাক্ষর পরীক্ষা করে এবং নতুন সংস্করণটি গ্রহণ করবে কিনা তা সিদ্ধান্ত নেয়। এটির কোনো মাস্টার পাসওয়ার্ড বা secret_key বা কোনো ব্যক্তিগত কী প্রয়োজন নেই৷ পড়ার সময়, ক্লায়েন্ট একই স্বাক্ষর চেক করে, তারপর ডিক্রিপশনের সময় আবার HPKE প্রমাণীকরণ ট্যাগ ব্যবহার করে বিষয়বস্তু এবং শিরোনামের মধ্যে বাঁধাই পরীক্ষা করে।
স্বাক্ষর সংস্করণগুলির মধ্যে লিঙ্কগুলিকেও রক্ষা করে। সঠিক হেডার এবং সাইফারটেক্সট বাইটের একটি SHA-256 হ্যাশ সংস্করণের শনাক্তকারী হয়ে ওঠে। পরবর্তী সংস্করণের হেডারে পূর্ববর্তী সংস্করণের শনাক্তকারী রয়েছে। যখন আমরা একটি ওয়েবসাইটের পাসওয়ার্ড পরিবর্তন করি, অ্যাপ্লিকেশনটি এই লিঙ্কটি দিয়ে একটি নতুন বস্তু তৈরি করে এবং স্বাক্ষর করে। পুরানো বস্তু এবং এর স্বাক্ষর অপরিবর্তিত থাকে। তাই নতুন সংস্করণের স্বাক্ষর সংরক্ষণ করার সময় পূর্বসূরীর প্রতিস্থাপন ব্যর্থ হবে। যদি দুটি ডিভাইস স্বাধীন পরিবর্তন করে, উভয় শাখাই টিকে থাকে; একটি মার্জড সংস্করণ উভয়ই উল্লেখ করতে পারে।
ব্লকচেইন মনে আছে? এটা আছে :-)।
পাবলিক হেডার আমাদেরকে ডিক্রিপ্ট না করেই লিঙ্ক চেক করতে দেয়, কিন্তু কিছু তথ্য দৃশ্যমান থাকে। সার্ভার শনাক্তকারী, সংস্করণ লিঙ্ক, ক্লায়েন্ট দ্বারা সরবরাহিত পরিবর্তনের সময়, ক্ষেত্রগুলির সংখ্যা এবং প্রতিটি ক্ষেত্রের মানের এনকোড করা আকার জানে। এনক্রিপশন রেকর্ডের বিষয়বস্তু লুকিয়ে রাখে, এই কাঠামোগত তথ্য নয়।
সিঙ্ক
"ডেটা ফাঁস নয়, একটি বিনামূল্যে বিতরণ করা ব্যাকআপ।"
ইন্টারনেট মেম।
বেশ কয়েকটি ডিভাইসে কাজ করার জন্য, আমাদের লক স্থানান্তর করতে হবে এবং তাদের মধ্যে ইতিহাস রেকর্ড করতে হবে। বস্তুর বিন্যাস পরিবর্তন হয় না: আমরা স্থানীয়ভাবে সংরক্ষিত একই এনক্রিপ্ট করা বাইট এবং স্বাক্ষর স্থানান্তর করি।
ম্যানুয়াল ট্রান্সফারের জন্য, অ্যাপ্লিকেশানটি একটি ZIP আর্কাইভ তৈরি করে যাতে লক, সমস্ত স্থানীয়ভাবে সঞ্চিত এনক্রিপ্ট করা রেকর্ড সংস্করণ এবং একটি স্বাক্ষরিত ফাইল তালিকা থাকে। পাসওয়ার্ড বা secret_key অন্তর্ভুক্ত নয়। অন্য ডিভাইসে, অ্যাপ্লিকেশনটি প্রথমে লকটি খোলে, তারপর স্বাক্ষর পরীক্ষা করে, রেকর্ডগুলি ডিক্রিপ্ট করে এবং একটি স্থানীয় ভল্ট কপি পুনরুদ্ধার করে। আমদানি এমন একটি ডিভাইসের উদ্দেশ্যে করা হয়েছে যেখানে এই ভল্টটি এখনও বিদ্যমান নেই; এটি একটি বিদ্যমান অনুলিপির সাথে ইতিহাসকে একত্রিত করে না।
একটি সিঙ্ক সার্ভার কাজের অনুলিপিগুলির মধ্যে পরিবর্তনগুলি বিনিময় করে৷ প্রথম আপলোডের সময়, এটি স্বাক্ষরিত লকটি পায়, স্বাক্ষর পরীক্ষা করে এবং signing_key-এর সর্বজনীন অংশ থেকে সর্বজনীন ভল্ট ঠিকানা গণনা করে৷ এটি তখন শিরোনাম থেকে এই কী এবং ভল্ট শনাক্তকারীকে মনে রাখে: এটি সার্ভারে ভল্ট নিবন্ধন করে। পরবর্তী পরিবর্তনগুলি অবশ্যই এই শনাক্তকারীর সাথে মেলে এবং একই কী থেকে একটি স্বাক্ষর বহন করবে৷
একটি নতুন ডিভাইসের ভল্ট ঠিকানা এবং secret_key প্রয়োজন, তাই অ্যাপ্লিকেশনটি তাদের একটি চেকসামের সাথে একটি স্থানান্তর কোডে একত্রিত করে৷ ব্যবহারকারী এই কোডটি ডিভাইসে স্থানান্তর করে এবং আলাদাভাবে মাস্টার পাসওয়ার্ড প্রবেশ করান; শুধুমাত্র সর্বজনীন ঠিকানা সার্ভারে পাঠানো হয়।
ডাউনলোড করা লক খোলার পরে, অ্যাপ্লিকেশনটি পুনরুদ্ধার করা কীগুলির সর্বজনীন অংশগুলিকে secret_key এবং হেডারের সাথে তুলনা করে এবং স্থানান্তর কোডের বিপরীতে গণনা করা ঠিকানা পরীক্ষা করে৷ এটি তারপর রেকর্ড চেক করতে signing_key এর যাচাইকৃত পাবলিক অংশ সংরক্ষণ করে।
সিঙ্ক্রোনাইজেশনের সময়, অ্যাপ্লিকেশনটি অনুপস্থিত সংস্করণগুলি নিয়ে আসে এবং এর পরিবর্তনগুলি আপলোড করে৷ সার্ভার স্বাক্ষর এবং পূর্ববর্তী সংস্করণগুলির লিঙ্কগুলি পরীক্ষা করে, গৃহীত বস্তুগুলি সঞ্চয় করে এবং সেগুলিকে অন্যান্য ডিভাইসে প্রেরণ করে৷ প্রাপ্ত ডেটা চেক করা, এটি ডিক্রিপ্ট করা এবং দ্বন্দ্ব সমাধান করা সবই ব্যবহারকারীর ডিভাইসে ঘটে।
নিবন্ধন কোন নাম, ইমেল ঠিকানা বা পৃথক পাসওয়ার্ডের জন্য জিজ্ঞাসা করে। সার্ভার সর্বজনীন ঠিকানা, স্বাক্ষর যাচাইকরণ কী, সর্বজনীন শিরোনাম, বস্তুর আকার এবং সংস্করণ লিঙ্কগুলি দেখে। এটি আইপি ঠিকানা এবং অনুরোধের সময়ও দেখে। মাস্টার পাসওয়ার্ড, secret_key, ব্যক্তিগত কী এবং প্লেইন টেক্সট রেকর্ড বিষয়বস্তু ব্যবহারকারীর ডিভাইসে থাকে। যে কেউ সর্বজনীন ঠিকানা জানেন তারা এনক্রিপ্ট করা বস্তুগুলি ডাউনলোড করতে পারেন, তবে সেগুলি পড়ার জন্য ব্যবহারকারীর গোপনীয়তা প্রয়োজন।
এই চেকগুলি নকল বস্তু শনাক্ত করে, কিন্তু প্রমাণ করে না যে সার্ভার সম্পূর্ণ ইতিহাস এবং এর সর্বশেষ অবস্থা দেখিয়েছে। এটি একটি শাখা লুকিয়ে রাখতে পারে যা ক্লায়েন্ট কখনও দেখেনি বা একটি সামঞ্জস্যপূর্ণ পুরানো ডেটাসেট ফেরত দিতে পারে। একটি স্বাক্ষর একটি পৃথক বস্তুর সত্যতা নিশ্চিত করে, সার্ভারের প্রতিক্রিয়ার সম্পূর্ণতা নয়। ব্যবহারকারী অন্য ডিভাইসে অনুপস্থিত পরিবর্তনগুলি লক্ষ্য করতে পারে, তবে একটি সামঞ্জস্যপূর্ণ পুরানো ইতিহাস hash-chain যাচাইকরণ পাস করবে৷
মাস্টার পাসওয়ার্ড পরিবর্তন
তাহলে, আপনার পবিত্রতা কি তার পাসওয়ার্ড পরিবর্তন করবেন?
হ্যাকার (1995)
মাস্টার পাসওয়ার্ড পরিবর্তন করা শুধুমাত্র লক পুনরায় এনক্রিপ্ট করে; ভিতরে master_key একই থাকে। রেকর্ড, তাদের স্বাক্ষর, secret_key এবং ভল্ট ঠিকানা তাই অপরিবর্তিত থাকে। নতুন লকটি একই signing_key দিয়ে স্বাক্ষরিত।
একটি পুরানো লক কপি এখনও পুরানো পাসওয়ার্ড এবং একই secret_key দিয়ে খোলে; পাসওয়ার্ড পরিবর্তন করা কীগুলিকে প্রত্যাহার করে না যা ইতিমধ্যে উন্মুক্ত করা হয়েছে।
সম্পূর্ণ ছবি
লকটি master_key রক্ষা করে, message_key রেকর্ড এনক্রিপ্ট করে এবং signing_key স্বাক্ষর তৈরি করে। ZIP আর্কাইভ এবং সার্ভার স্বাক্ষর সহ এনক্রিপ্ট করা বস্তু গ্রহণ করে।