আমি এখানে অ্যান্ড্রয়েড ম্যানুয়াল থেকে উদ্ধৃত করছি , কিন্তু:
বিঃদ্রঃ:
আমি যে উত্সটি ব্যবহার করেছি তা মার্শমেলোর সাথে সরাসরি প্রাসঙ্গিক নয় তবে ললিপপের সাথে প্রাসঙ্গিক।
টি এল: ডিআর
আমি এখনই ওপি'র প্রশ্নগুলিকে সম্বোধন করব। প্রযুক্তিগত বিবরণ অনুসরণ করা হবে।
ডিফল্ট এনক্রিপশন কী একটি হার্ডওয়্যার উৎস (একটি চিপ একটি TPM টি অনুরূপ) এবং AOSP ডিফল্ট পাসওয়ার্ড হিসাবে সংজ্ঞায়িত করা থেকে আসে default_passwordমধ্যে cryptfs.cসোর্স ফাইল নিচে দেখুন।
হ্যাঁ, কেবল ডিফল্ট নয়, যেকোন পাসওয়ার্ডকে কী হিসাবে তৈরি করা হয় এবং টিপিএম-এর মতো চিপে সংরক্ষণ করা হয়, এটি একটি টিইই ("বিশ্বস্ত এক্সিকিউশন এনভায়রনমেন্ট" এর জন্য সংক্ষিপ্ত, আরও বিশদ জন্য নীচে দেখুন)।
ডিওআরটির এসসির চিপগুলিতে ইউআরটি / জেটিএগ অ্যাক্সেস সহ একটি হ্যাকার প্রযুক্তিগতভাবে টিইই কীতে অ্যাক্সেস পেতে পারে বা কোনও কাস্টম কার্নেল এই হ্যাকারের কাছে এই তথ্য ফাঁস করতে পারে। ষড়যন্ত্র তত্ত্বগুলিতে কয়েকটি 3-বর্ণ এজেন্সিগুলি সম্ভাব্য এই অনিরাপদ কার্নেলগুলি উত্পাদন ডিভাইসে ব্যবহার করার জন্য OEM এর সাথে অংশীদার হতে পারে, তবে আমি এটির দ্বারা অনেক স্টোর রাখব না। আবার, আরও তথ্যের জন্য এই উত্তরের শেষ বিভাগটি দেখুন।
হ্যাকারটিকে কীটিতে অ্যাক্সেস পাওয়া থেকে বিরত করার একমাত্র বিষয় হ'ল এটি করার জন্য নিখুঁত পরিশ্রমের প্রয়োজন।
- ফার্মওয়্যারটির (চেকসামিং) হ্যাশ চেক করা ( গুগলের দ্বারা "ভেরিফায়েড বুট" নামে পরিচিত ) প্রকৃতপক্ষে ডিফল্টরূপে ললিপপ এবং তার উপরে করা হয় (এবং এটি জেলিবিয়ান ৪.৩ এর পরে পাওয়া যায়) নামে পরিচিত একটি কার্নেল মডিউল দ্বারা
dm-verity। তবে এটি এনক্রিপশন স্থিতির থেকে পৃথক।
উত্স: এওএসপি সুরক্ষা গাইড এখানে ।
- কাস্টম পাসওয়ার্ড সহ সিস্টেমটি ডিক্রিপ্ট করার সাথে জড়িত প্রক্রিয়া সম্পর্কে নীচে দেখুন। আমি কেবল এখানে আপনাকে বলব যে ব্যবহারকারীর পাসওয়ার্ড এনক্রিপশন কী তৈরি এবং ব্যবহার উভয় ক্ষেত্রেই জড়িত।
সংক্ষিপ্ত বিবরণ
প্রথম বুট করার পরে, ডিভাইসটি এলোমেলোভাবে উত্পাদিত 128-বিট মাস্টার কী তৈরি করে এবং তারপরে এটি একটি ডিফল্ট পাসওয়ার্ড এবং সঞ্চিত লবণের সাথে হ্যাশ করে। ডিফল্ট পাসওয়ার্ডটি হ'ল: "ডিফল্ট_প্যাসওয়ার্ড" তবে ফলস্বরূপ হ্যাশ একটি টিইই (যেমন ট্রাস্টজোন) এর মাধ্যমে স্বাক্ষরিত হয়, যা মাস্টার কীটি এনক্রিপ্ট করার জন্য স্বাক্ষরের একটি হ্যাশ ব্যবহার করে।
আপনি অ্যান্ড্রয়েড ওপেন সোর্স প্রোজেক্ট cryptfs.c ফাইলে সংজ্ঞায়িত ডিফল্ট পাসওয়ার্ড খুঁজে পেতে পারেন ।
যখন ব্যবহারকারী ডিভাইসে পিন / পাস বা পাসওয়ার্ড সেট করে, কেবল 128-বিট কী পুনরায় এনক্রিপ্ট করা এবং সংরক্ষণ করা হবে। (উদাহরণস্বরূপ, ব্যবহারকারীর পিন / পাস / প্যাটার্নের পরিবর্তনগুলি ইউজারডাটা পার্টিশনের পুনরায় এনক্রিপশন ঘটায় না))
ডিফল্ট এনক্রিপশন সহ একটি এনক্রিপ্ট ডিভাইস শুরু করা
আপনি কোনও পাসওয়ার্ড ছাড়াই কোনও এনক্রিপ্টড ডিভাইস বুট করার পরে এটি ঘটে। অ্যান্ড্রয়েড 5.0 ডিভাইসগুলি প্রথম বুটে এনক্রিপ্ট করা আছে বলে কোনও সেট পাসওয়ার্ড থাকা উচিত নয় এবং তাই এটি ডিফল্ট এনক্রিপশন অবস্থা।
- কোনও পাসওয়ার্ড ছাড়াই এনক্রিপ্ট করা / ডেটা সনাক্ত করুন
অ্যান্ড্রয়েড ডিভাইস এনক্রিপ্ট করা হয়েছে তা সনাক্ত করুন / ডেটা মাউন্ট করা যায়নি এবং পতাকাগুলির মধ্যে একটি encryptableবা forceencryptসেট রয়েছে।
voldসেট vold.decryptকরে trigger_default_encryption, যা defaultcryptoপরিষেবা শুরু করে । trigger_default_encryption/ ডেটা পাসওয়ার্ড সহ বা ছাড়া এনক্রিপ্ট করা হয়েছে কিনা তা দেখতে এনক্রিপশন প্রকারটি পরীক্ষা করে।
- ডিক্রিপ্ট / ডেটা
dm-cryptব্লক ডিভাইসে ডিভাইস তৈরি করে যাতে ডিভাইসটি ব্যবহারের জন্য প্রস্তুত।
- মাউন্ট / ডেটা
voldতারপরে ডিক্রিপ্ট করা আসল / ডেটা পার্টিশন মাউন্ট করে নতুন পার্টিশন প্রস্তুত করে। এটা তোলে সম্পত্তি সেট করে vold.post_fs_data_doneকরতে 0এবং তারপর সেট করে vold.decryptকরতে trigger_post_fs_data। এটি init.rcএর post-fs-dataকমান্ডগুলি চালিত করে। তারা কোনও প্রয়োজনীয় ডিরেক্টরি বা লিঙ্ক তৈরি করবে এবং তারপরে সেট vold.post_fs_data_doneহবে 1।
একবার voldযে সম্পত্তি জনের মধ্যে 1 জন সূচিত, এটা সম্পত্তি সেট করে vold.decryptহবে: trigger_restart_framework। এটি init.rcক্লাসে mainআবার পরিষেবা শুরু করার এবং বুট হওয়ার পরে প্রথমবারের জন্য লেট_স্টার্ট ক্লাসে পরিষেবা শুরু করার কারণ ঘটায় ।
- কাঠামো শুরু করুন
এখন ফ্রেমওয়ার্কটি ডিক্রিপ্টেড / ডেটা ব্যবহার করে এর সমস্ত পরিষেবা বুট করে এবং সিস্টেমটি ব্যবহারের জন্য প্রস্তুত।
ডিফল্ট এনক্রিপশন ছাড়াই একটি এনক্রিপ্ট করা ডিভাইস শুরু করা
আপনি যখন কোনও পাসওয়ার্ডযুক্ত কোনও এনক্রিপ্ট করা ডিভাইস বুট করেন তখন এটিই ঘটে। ডিভাইসের পাসওয়ার্ড পিন, প্যাটার্ন বা পাসওয়ার্ড হতে পারে।
- একটি পাসওয়ার্ড সহ এনক্রিপ্ট ডিভাইস সনাক্ত করুন
ফ্ল্যাগের কারণে অ্যান্ড্রয়েড ডিভাইস এনক্রিপ্ট করা হয়েছে তা সনাক্ত করুন ro.crypto.state = "encrypted"
voldসেট vold.decryptকরে trigger_restart_min_frameworkকারণ / ডেটা পাসওয়ার্ড সহ এনক্রিপ্ট করা আছে।
- মাউন্ট tmpfs
initপরামিতিগুলির সাথে / ডেটার জন্য প্রদত্ত প্রাথমিক মাউন্ট বিকল্পগুলি সংরক্ষণ করতে পাঁচটি বৈশিষ্ট্য সেট করে init.rc। voldক্রিপ্টো ম্যাপিং সেট আপ করতে এই বৈশিষ্ট্যগুলি ব্যবহার করে:
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags (এএসসিআইআই 8-অঙ্কের হেক্স নম্বর 0x এর আগে)
- পাসওয়ার্ডের জন্য অনুরোধ জানাতে ফ্রেমওয়ার্ক শুরু করুন
ফ্রেমওয়ার্কটি শুরু হয়ে যায় এবং vold.decryptসেট হয়ে যায় তা দেখে trigger_restart_min_framework। এটি ফ্রেমওয়ার্কটি জানায় যে এটি কোনও tmpfs /dataডিস্কে বুট হচ্ছে এবং এটির ব্যবহারকারীর পাসওয়ার্ড পাওয়া দরকার।
তবে প্রথমে এটি নিশ্চিত করা দরকার যে ডিস্কটি সঠিকভাবে এনক্রিপ্ট করা হয়েছে। এটা তোলে কমান্ড পাঠায় cryptfs cryptocompleteকরতে vold। voldএনক্রিপশন সফলভাবে সম্পন্ন হলে 0, অভ্যন্তরীণ ত্রুটি -1 অথবা এনক্রিপশন সফলভাবে সম্পন্ন না হলে -2 প্রদান করে। পতাকাটির voldজন্য ক্রিপ্টো মেটাডেটা দেখে এটি নির্ধারণ করে CRYPTO_ENCRYPTION_IN_PROGRESS। যদি এটি সেট করা থাকে তবে এনক্রিপশন প্রক্রিয়াটি বাধাগ্রস্ত হয়েছিল এবং ডিভাইসে কোনও ব্যবহারযোগ্য ডেটা নেই।
যদি voldকোনও ত্রুটি ফেরায়, ইউআইয়ের উচিত ডিভাইসটি রিবুট এবং ফ্যাক্টরি-রিসেট করার জন্য ব্যবহারকারীকে একটি বার্তা প্রদর্শিত হবে এবং ব্যবহারকারীকে এটি করতে টিপতে একটি বোতাম দেওয়া উচিত।
- পাসওয়ার্ড সহ তথ্য ডিক্রিপ্ট করুন
একবার cryptfs cryptocompleteসফল হয়ে গেলে ফ্রেমওয়ার্কটি ডিস্কের পাসওয়ার্ড চেয়ে একটি ইউআই প্রদর্শন করে। UI 'তে চেকের কমান্ড পাঠিয়ে পাসওয়ার্ড cryptfs checkpwকরতে vold। যদি পাসওয়ার্ডটি সঠিক হয় (যা /dataঅস্থায়ী স্থানে ডিক্রিপ্টটি সফলভাবে মাউন্ট করার মাধ্যমে নির্ধারিত হয় , তবে এটি আনমাউন্ট করে), ভল্ডটি সম্পত্তিটিতে ডিক্রিপ্টড ব্লক ডিভাইসের নাম সংরক্ষণ করে ro.crypto.fs_crypto_blkdevএবং 0 কে ইউআইতে ফিরিয়ে দেয়। যদি পাসওয়ার্ডটি ভুল হয় তবে এটি ইউআই -1 এ ফিরে আসে।
- কাঠামো বন্ধ করুন
ইউআই একটি ক্রিপ্টো বুট গ্রাফিক রাখে এবং তারপরে কমান্ড সহ ভলডকে কল করে cryptfs restart। voldসম্পত্তি সেট করে vold.decryptকরতে trigger_reset_mainহয়, যা ঘটায় init.rcকরতে class_reset main। এটি mainশ্রেণিতে সমস্ত পরিষেবা বন্ধ করে দেয়, যা tmpfs /dataআনমাউন্ট করার অনুমতি দেয় ।
- মাউন্ট / ডেটা
voldতারপরে ডিক্রিপ্ট করা আসল /dataপার্টিশন মাউন্ট করে এবং নতুন পার্টিশন প্রস্তুত করে (এটি কখনই মোছার বিকল্পটি এনক্রিপ্ট করা না থাকলে প্রস্তুত করা যায় না, যা প্রথম প্রকাশে সমর্থিত নয়)। এটা তোলে সম্পত্তি সেট করে vold.post_fs_data_doneকরতে 0এবং তারপর সেট করে vold.decryptকরতে trigger_post_fs_data। এটি init.rcচালানোর কারণ হয় post-fs-data commands। তারা কোনও প্রয়োজনীয় ডিরেক্টরি বা লিঙ্ক তৈরি করবে এবং তারপরে সেট vold.post_fs_data_doneহবে 1। একবার voldদেখেন 1যে সম্পত্তি, এটা সম্পত্তি সেট করে vold.decryptকরতে trigger_restart_framework। এটি init.rcক্লাসে mainআবার পরিষেবা শুরু করার এবং late_startবুট করার পরে প্রথমবারের জন্য ক্লাসে পরিষেবা শুরু করার কারণ করে।
- পূর্ণ কাঠামো শুরু করুন
এখন ফ্রেমওয়ার্কটি ডিক্রিপ্টেড / ডেটা ফাইল সিস্টেম ব্যবহার করে এর সমস্ত পরিষেবা বুট করে এবং সিস্টেমটি ব্যবহারের জন্য প্রস্তুত।
এনক্রিপ্ট করা কী সংরক্ষণ করা হচ্ছে
এনক্রিপ্ট করা কীটি ক্রিপ্টো মেটাডেটাতে সঞ্চিত। বিশ্বস্ত এক্সিকিউশন এনভায়রনমেন্টের (টিইই) স্বাক্ষর করার ক্ষমতা ব্যবহার করে হার্ডওয়্যার ব্যাকিং প্রয়োগ করা হয়। পূর্বে, আমরা scryptব্যবহারকারীর পাসওয়ার্ড এবং সঞ্চিত লবণ প্রয়োগ করে উত্পন্ন কী দ্বারা মাস্টার কী এনক্রিপ্ট করেছি ।
অফ-বাক্স আক্রমণগুলির বিরুদ্ধে কীটি আরও দৃ res়রূপে তৈরি করতে, আমরা সঞ্চিত TEE কী দিয়ে ফলাফল কীটিতে স্বাক্ষর করে এই অ্যালগরিদম প্রসারিত করি। তারপরে স্বাক্ষরটি এর পরে আরও একটি প্রয়োগের মাধ্যমে উপযুক্ত দৈর্ঘ্যের কীতে রূপান্তরিত হয় scrypt। এই কীটি তখন মাস্টার কীটি এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহৃত হয়। এই কীটি সঞ্চয় করতে:
- এলোমেলো 16-বাইট ডিস্ক এনক্রিপশন কী (ডিই কে) এবং 16-বাইট লবণ তৈরি করুন।
scrypt32-বাইট ইন্টারমিডিয়েট কী 1 (আই কে 1) তৈরি করতে ব্যবহারকারীর পাসওয়ার্ড এবং লবণের জন্য প্রয়োগ করুন ।
- হার্ডওয়্যার-বেইন্ড প্রাইভেট কী (এইচবিকে) এর আকারের শূন্য বাইট সহ প্যাড আই কে 1। বিশেষত, আমরা প্যাড: 00 || আই কে 1 || 00..00; এক শূন্য বাইট, 32 আই কে 1 বাইট, 223 শূন্য বাইট।
- 256-বাইট আই কে 2 উত্পাদনের জন্য এইচবিকে দিয়ে আই-কে প্যাডড সাইন করুন।
- আবেদন করুন
scryptIK2 ও লবণ (ধাপ 2 হিসাবে একই লবণ) 32-বাইট IK3 উত্পাদন করতে।
- আই কে 3 এর প্রথম 16 বাইট কে কে হিসাবে এবং শেষ 16 বাইট আইভি হিসাবে ব্যবহার করুন।
- AES_CBC, কী KEK, এবং সূচনা ভেক্টর IV সহ ডিগ্রিকে এনক্রিপ্ট করুন।