আমি এখানে অ্যান্ড্রয়েড ম্যানুয়াল থেকে উদ্ধৃত করছি , কিন্তু:
বিঃদ্রঃ:
আমি যে উত্সটি ব্যবহার করেছি তা মার্শমেলোর সাথে সরাসরি প্রাসঙ্গিক নয় তবে ললিপপের সাথে প্রাসঙ্গিক।
টি এল: ডিআর
আমি এখনই ওপি'র প্রশ্নগুলিকে সম্বোধন করব। প্রযুক্তিগত বিবরণ অনুসরণ করা হবে।
ডিফল্ট এনক্রিপশন কী একটি হার্ডওয়্যার উৎস (একটি চিপ একটি 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-বাইট লবণ তৈরি করুন।
scrypt
32-বাইট ইন্টারমিডিয়েট কী 1 (আই কে 1) তৈরি করতে ব্যবহারকারীর পাসওয়ার্ড এবং লবণের জন্য প্রয়োগ করুন ।
- হার্ডওয়্যার-বেইন্ড প্রাইভেট কী (এইচবিকে) এর আকারের শূন্য বাইট সহ প্যাড আই কে 1। বিশেষত, আমরা প্যাড: 00 || আই কে 1 || 00..00; এক শূন্য বাইট, 32 আই কে 1 বাইট, 223 শূন্য বাইট।
- 256-বাইট আই কে 2 উত্পাদনের জন্য এইচবিকে দিয়ে আই-কে প্যাডড সাইন করুন।
- আবেদন করুন
scrypt
IK2 ও লবণ (ধাপ 2 হিসাবে একই লবণ) 32-বাইট IK3 উত্পাদন করতে।
- আই কে 3 এর প্রথম 16 বাইট কে কে হিসাবে এবং শেষ 16 বাইট আইভি হিসাবে ব্যবহার করুন।
- AES_CBC, কী KEK, এবং সূচনা ভেক্টর IV সহ ডিগ্রিকে এনক্রিপ্ট করুন।