এই পৃষ্ঠায় Android Keystore এর ক্রিপ্টোগ্রাফিক বৈশিষ্ট্য সম্পর্কে তথ্য রয়েছে, যা অন্তর্নিহিত KeyMint (অথবা Keymaster) বাস্তবায়ন দ্বারা সরবরাহ করা হয়েছে।
ক্রিপ্টোগ্রাফিক আদিম
কীস্টোর নিম্নলিখিত বিভাগগুলির ক্রিয়াকলাপ সরবরাহ করে:
- চাবি তৈরি, যার ফলে ব্যক্তিগত বা গোপন চাবি উপাদান তৈরি হয় যা শুধুমাত্র নিরাপদ পরিবেশের জন্য অ্যাক্সেসযোগ্য। ক্লায়েন্টরা নিম্নলিখিত উপায়ে চাবি তৈরি করতে পারেন:
- নতুন কী জেনারেশন
- এনক্রিপ্ট না করা কী উপাদান আমদানি
- এনক্রিপ্ট করা কী উপাদান আমদানি
- কী অ্যাটেস্টেশন: অ্যাসিমেট্রিক কী তৈরির মাধ্যমে কীপেয়ারের পাবলিক কী অংশ ধারণ করে একটি সার্টিফিকেট তৈরি করা হয়। এই সার্টিফিকেটটি ঐচ্ছিকভাবে কীটির মেটাডেটা এবং ডিভাইসের অবস্থা সম্পর্কে তথ্যও ধারণ করে, যা একটি বিশ্বস্ত রুটে ফিরে আসা একটি কী চেইন দ্বারা স্বাক্ষরিত হয়।
- ক্রিপ্টোগ্রাফিক অপারেশন:
- প্রতিসম এনক্রিপশন এবং ডিক্রিপশন (AES, 3DES)
- অসমমিতিক ডিক্রিপশন (RSA)
- অসমমিতিক স্বাক্ষর (ECDSA, RSA)
- সিমেট্রিক সাইনিং এবং ভেরিফিকেশন (HMAC)
- অসমমিতিক কী চুক্তি (ECDH)
মনে রাখবেন যে Keystore এবং KeyMint অ্যাসিমেট্রিক কীগুলির জন্য পাবলিক কী অপারেশন পরিচালনা করে না।
প্রোটোকল উপাদান, যেমন উদ্দেশ্য, মোড এবং প্যাডিং, সেইসাথে অ্যাক্সেস নিয়ন্ত্রণ সীমাবদ্ধতা , নির্দিষ্ট করা হয় যখন কী তৈরি বা আমদানি করা হয় এবং স্থায়ীভাবে কী-এর সাথে আবদ্ধ থাকে, নিশ্চিত করে যে কীটি অন্য কোনও উপায়ে ব্যবহার করা যাবে না।
উপরের তালিকা ছাড়াও, KeyMint (পূর্বে Keymaster) বাস্তবায়নগুলি আরও একটি পরিষেবা প্রদান করে, কিন্তু এটি API হিসাবে প্রকাশ করা হয় না: র্যান্ডম নম্বর জেনারেশন। এটি অভ্যন্তরীণভাবে কী জেনারেশন, ইনিশিয়ালাইজেশন ভেক্টর (IV), র্যান্ডম প্যাডিং এবং সুরক্ষিত প্রোটোকলের অন্যান্য উপাদানগুলির জন্য ব্যবহৃত হয় যার জন্য র্যান্ডমনেস প্রয়োজন।
প্রয়োজনীয় আদিম
সমস্ত KeyMint বাস্তবায়ন প্রদান করে:
- আরএসএ
- ২০৪৮, ৩০৭২, এবং ৪০৯৬-বিট কী সাপোর্ট
- পাবলিক এক্সপোনেন্ট F4 (2^16+1) এর জন্য সমর্থন
- RSA স্বাক্ষরের জন্য প্যাডিং মোড:
- আরএসএএসএসএ-পিএসএস (
PaddingMode::RSA_PSS) - RSASSA-PKCS1-v1_5 (
PaddingMode::RSA_PKCS1_1_5_SIGN)
- আরএসএএসএসএ-পিএসএস (
- RSA স্বাক্ষরের জন্য ডাইজেস্ট মোড:
- SHA-256 সম্পর্কে
- RSA এনক্রিপশন/ডিক্রিপশনের জন্য প্যাডিং মোড:
- প্যাডেড নেই
- RSAES-OAEP (
PaddingMode::RSA_OAEP) - RSAES-PKCS1-v1_5 (
PaddingMode::RSA_PKCS1_1_5_ENCRYPT)
- ইসিডিএসএ
- যথাক্রমে NIST P-224, P-256, P-384, এবং P-521 বক্ররেখা ব্যবহার করে 224, 256, 384, এবং 521-বিট কী সমর্থন সমর্থিত।
- ECDSA এর জন্য ডাইজেস্ট মোড:
- কোনও ডাইজেস্ট নেই (অবঞ্চিত, ভবিষ্যতে সরানো হবে)
- SHA-256 সম্পর্কে
- AES সম্পর্কে
- ১২৮ এবং ২৫৬-বিট কী সমর্থিত
- CBC , CTR, ECB, এবং GCM। GCM বাস্তবায়ন ৯৬ বিটের চেয়ে ছোট বা ৯৬ বিট ছাড়া অন্য কোনও দৈর্ঘ্যের ট্যাগ ব্যবহারের অনুমতি দেয় না।
- প্যাডিং মোড
PaddingMode::NONEএবংPaddingMode::PKCS7CBC এবং ECB মোডের জন্য সমর্থিত। প্যাডিং ছাড়া, ইনপুট ব্লক আকারের একাধিক না হলে CBC বা ECB মোড এনক্রিপশন ব্যর্থ হয়।
- HMAC SHA-256 , কমপক্ষে 32 বাইট পর্যন্ত যেকোনো কী আকার সহ।
KeyMint বাস্তবায়নের জন্য SHA1 এবং SHA2 পরিবারের অন্যান্য সদস্যদের (SHA-224, SHA384 এবং SHA512) জোরালোভাবে সুপারিশ করা হয়। হার্ডওয়্যার KeyMint বাস্তবায়ন যদি সেগুলি সরবরাহ না করে তবে Keystore সফ্টওয়্যারে সেগুলি সরবরাহ করে।
অন্যান্য সিস্টেমের সাথে আন্তঃকার্যক্ষমতার জন্য কিছু প্রিমিটিভও সুপারিশ করা হয়:
- RSA-এর জন্য ছোট কী আকার
- RSA-এর জন্য নির্বিচারে পাবলিক এক্সপোনেন্ট
কী অ্যাক্সেস নিয়ন্ত্রণ
হার্ডওয়্যার-ভিত্তিক কীগুলি যা ডিভাইস থেকে কখনই বের করা যায় না, যদি আক্রমণকারী ইচ্ছামত ব্যবহার করতে পারে তবে খুব বেশি সুরক্ষা প্রদান করে না (যদিও এগুলি এক্সফিল্ট্রেটেড কীগুলির চেয়ে বেশি নিরাপদ)। সুতরাং, কীস্টোরের অ্যাক্সেস নিয়ন্ত্রণ প্রয়োগ করা অত্যন্ত গুরুত্বপূর্ণ।
অ্যাক্সেস নিয়ন্ত্রণগুলিকে ট্যাগ/মান জোড়ার "অনুমোদন তালিকা" হিসাবে সংজ্ঞায়িত করা হয়। অথরাইজেশন ট্যাগগুলি 32-বিট পূর্ণসংখ্যা এবং মানগুলি বিভিন্ন ধরণের। কিছু ট্যাগ একাধিক মান নির্দিষ্ট করার জন্য পুনরাবৃত্তি করা যেতে পারে। একটি ট্যাগ পুনরাবৃত্তি করা যেতে পারে কিনা তা KeyMint HAL ইন্টারফেসে নির্দিষ্ট করা হয়। যখন একটি কী তৈরি করা হয়, তখন কলার একটি অনুমোদন তালিকা নির্দিষ্ট করে। KeyMint বাস্তবায়ন কিছু অতিরিক্ত তথ্য নির্দিষ্ট করার জন্য তালিকাটি পরিবর্তন করে, যেমন কীটিতে রোলব্যাক সুরক্ষা আছে কিনা, এবং একটি "চূড়ান্ত" অনুমোদন তালিকা ফেরত দেয়, যা ফেরত দেওয়া কী ব্লবে এনকোড করা হয়। চূড়ান্ত অনুমোদন তালিকা পরিবর্তন করা হলে যেকোনো ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপের জন্য কী ব্যবহার করার যেকোনো প্রচেষ্টা ব্যর্থ হয়।
Keymaster 2 এবং তার আগের সংস্করণগুলির জন্য, সম্ভাব্য ট্যাগগুলির সেট keymaster_authorization_tag_t গণনায় সংজ্ঞায়িত করা হয়েছে এবং স্থায়ীভাবে স্থির করা হয়েছে (যদিও এটি বাড়ানো যেতে পারে)। নামগুলির পূর্বে KM_TAG যুক্ত করা হয়েছিল। ট্যাগ আইডির উপরের চারটি বিট টাইপ নির্দেশ করতে ব্যবহৃত হয়।
কীমাস্টার 3 KM_TAG উপসর্গটি Tag:: এ পরিবর্তন করেছে।
সম্ভাব্য প্রকারগুলির মধ্যে রয়েছে:
ENUM : অনেক ট্যাগের মান গণনার মাধ্যমে সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ, TAG::PURPOSE এর সম্ভাব্য মানগুলি enum keymaster_purpose_t এ সংজ্ঞায়িত করা হয়।
ENUM_REP : ENUM মতোই, তবে ট্যাগটি অনুমোদনের তালিকায় পুনরাবৃত্তি করা যেতে পারে। পুনরাবৃত্তি একাধিক অনুমোদিত মান নির্দেশ করে। উদাহরণস্বরূপ, একটি এনক্রিপশন কীতে সম্ভবত KeyPurpose::ENCRYPT এবং KeyPurpose::DECRYPT থাকে।
যখন KeyMint একটি কী তৈরি করে, তখন কলার কীটির জন্য একটি অনুমোদন তালিকা নির্দিষ্ট করে। অতিরিক্ত সীমাবদ্ধতা যোগ করার জন্য এই তালিকাটি Keystore এবং KeyMint দ্বারা সংশোধন করা হয় এবং অন্তর্নিহিত KeyMint বাস্তবায়ন চূড়ান্ত অনুমোদন তালিকাটিকে ফেরত দেওয়া কীব্লব-এ এনকোড করে। এনকোড করা অনুমোদন তালিকাটি ক্রিপ্টোগ্রাফিকভাবে কীব্লবের সাথে আবদ্ধ থাকে, যাতে অনুমোদন তালিকা (ক্রম সহ) পরিবর্তন করার যেকোনো প্রচেষ্টার ফলে একটি অবৈধ কীব্লব তৈরি হয় যা ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপের জন্য ব্যবহার করা যায় না।
হার্ডওয়্যার বনাম সফ্টওয়্যার প্রয়োগ
সকল সুরক্ষিত হার্ডওয়্যার বাস্তবায়নে একই বৈশিষ্ট্য থাকে না। বিভিন্ন পদ্ধতি সমর্থন করার জন্য, কীমাস্টার যথাক্রমে সুরক্ষিত এবং অ-সুরক্ষিত ওয়ার্ল্ড অ্যাক্সেস কন্ট্রোল এনফোর্সমেন্ট, অথবা হার্ডওয়্যার এবং সফ্টওয়্যার এনফোর্সমেন্টের মধ্যে পার্থক্য করে।
KeyMint API-তে KeyCharacteristics ধরণের securityLevel ক্ষেত্রে এটি প্রকাশ করা হয়। সুরক্ষিত হার্ডওয়্যারটি কী প্রয়োগ করতে পারে তার উপর ভিত্তি করে উপযুক্ত সুরক্ষা স্তর সহ KeyCharacteristics এ অনুমোদন স্থাপনের জন্য দায়ী। এই তথ্যটি অসমমিত কীগুলির জন্য প্রত্যয়ন রেকর্ডেও প্রকাশিত হয়: hardwareEnforced তালিকায় SecurityLevel::TRUSTED_ENVIRONMENT বা SecurityLevel::STRONGBOX জন্য মূল বৈশিষ্ট্যগুলি এবং softwareEnforced তালিকায় SecurityLevel::SOFTWARE বা SecurityLevel::KEYSTORE এর বৈশিষ্ট্যগুলি প্রদর্শিত হয়।
উদাহরণস্বরূপ, একটি কী ব্যবহার করার সময় তারিখ এবং সময়ের ব্যবধানের সীমাবদ্ধতা সাধারণত নিরাপদ পরিবেশ দ্বারা প্রয়োগ করা হয় না, কারণ এটির তারিখ এবং সময়ের তথ্যে বিশ্বাসযোগ্য অ্যাক্সেস নেই। ফলস্বরূপ, Tag::ORIGINATION_EXPIRE_DATETIME এর মতো অনুমোদনগুলি Android-এ Keystore দ্বারা প্রয়োগ করা হয় এবং এতে SecurityLevel::KEYSTORE থাকবে।
কী এবং তাদের অনুমোদন হার্ডওয়্যার দ্বারা সমর্থিত কিনা তা নির্ধারণ সম্পর্কে আরও তথ্যের জন্য, কী প্রত্যয়ন দেখুন।
ক্রিপ্টোগ্রাফিক বার্তা নির্মাণ অনুমোদন
সংশ্লিষ্ট কী ব্যবহার করে ক্রিয়াকলাপের ক্রিপ্টোগ্রাফিক বৈশিষ্ট্য নির্ধারণ করতে নিম্নলিখিত ট্যাগগুলি ব্যবহার করা হয়:
-
Tag::ALGORITHM -
Tag::KEY_SIZE -
Tag::BLOCK_MODE -
Tag::PADDING -
Tag::CALLER_NONCE -
Tag::DIGEST -
Tag::MGF_DIGEST
নিম্নলিখিত ট্যাগগুলি পুনরাবৃত্তিযোগ্য, যার অর্থ হল একাধিক মান একটি একক কী-এর সাথে যুক্ত করা যেতে পারে:
-
Tag::BLOCK_MODE -
Tag::PADDING -
Tag::DIGEST -
Tag::MGF_DIGEST
ব্যবহৃত মানটি অপারেশনের সময় নির্দিষ্ট করা হয়।
উদ্দেশ্য
কীগুলির উদ্দেশ্যের একটি নির্দিষ্ট সেট থাকে, যা Tag::PURPOSE ট্যাগের সাথে এক বা একাধিক অনুমোদন এন্ট্রি হিসাবে প্রকাশ করা হয়, যা কীভাবে সেগুলি ব্যবহার করা যেতে পারে তা নির্ধারণ করে। উদ্দেশ্যগুলি KeyPurpose.aidl এ সংজ্ঞায়িত করা হয়েছে।
মনে রাখবেন যে উদ্দেশ্যমূলক মূল্যবোধের কিছু সমন্বয় নিরাপত্তা সমস্যা তৈরি করে। উদাহরণস্বরূপ, একটি RSA কী যা এনক্রিপ্ট এবং স্বাক্ষর উভয়ের জন্যই ব্যবহার করা যেতে পারে, একজন আক্রমণকারীকে স্বাক্ষর তৈরি করার জন্য ইচ্ছামত ডেটা ডিক্রিপ্ট করতে সিস্টেমকে রাজি করাতে সাহায্য করে।
কী আমদানি
কীমাস্টার শুধুমাত্র X.509 ফর্ম্যাটে পাবলিক কী রপ্তানি এবং আমদানি সমর্থন করে:
- DER-এনকোডেড PKCS#8 ফর্ম্যাটে অসমমিতিক কী জোড়া (পাসওয়ার্ড-ভিত্তিক এনক্রিপশন ছাড়াই)
- কাঁচা বাইট হিসেবে প্রতিসম কী
আমদানি করা কীগুলিকে নিরাপদে তৈরি করা কী থেকে আলাদা করা যায় তা নিশ্চিত করার জন্য, Tag::ORIGIN উপযুক্ত কী অনুমোদনের তালিকায় অন্তর্ভুক্ত করা হয়। উদাহরণস্বরূপ, যদি একটি কী সুরক্ষিত হার্ডওয়্যারে তৈরি করা হয়, তাহলে Tag::ORIGIN মান KeyOrigin::GENERATED মূল বৈশিষ্ট্যগুলির hw_enforced তালিকায় পাওয়া যায়, যেখানে সুরক্ষিত হার্ডওয়্যারে আমদানি করা একটি কী এর মান KeyOrigin::IMPORTED থাকে।
ব্যবহারকারী প্রমাণীকরণ
সিকিউর কীমিন্ট বাস্তবায়ন ব্যবহারকারীর প্রমাণীকরণ বাস্তবায়ন করে না, বরং অন্যান্য বিশ্বস্ত অ্যাপের উপর নির্ভর করে যারা এটি করে। এই অ্যাপগুলি যে ইন্টারফেসটি প্রয়োগ করে তার জন্য, গেটকিপার পৃষ্ঠাটি দেখুন।
ব্যবহারকারীর প্রমাণীকরণের প্রয়োজনীয়তা দুটি ট্যাগের মাধ্যমে নির্দিষ্ট করা হয়। প্রথম সেটটি নির্দেশ করে যে কোন প্রমাণীকরণ পদ্ধতিগুলি কী ব্যবহারের অনুমতি দেয়:
-
Tag::USER_SECURE_IDএকটি 64-বিট সাংখ্যিক মান রয়েছে যা একটি সুরক্ষিত প্রমাণীকরণ টোকেনে প্রদত্ত সুরক্ষিত ব্যবহারকারী আইডি নির্দিষ্ট করে যা কী ব্যবহার আনলক করার জন্য। যদি পুনরাবৃত্তি হয়, তাহলে কীটি ব্যবহার করা যেতে পারে যদি কোনও মান একটি সুরক্ষিত প্রমাণীকরণ টোকেনে প্রদত্ত থাকে।
দ্বিতীয় সেটটি নির্দেশ করে যে ব্যবহারকারীকে কখন এবং কখন প্রমাণীকরণ করতে হবে। যদি এই ট্যাগগুলির কোনওটিই উপস্থিত না থাকে, কিন্তু Tag::USER_SECURE_ID থাকে, তাহলে কীটির প্রতিটি ব্যবহারের জন্য প্রমাণীকরণ প্রয়োজন।
-
Tag::NO_AUTHENTICATION_REQUIREDনির্দেশ করে যে কোনও ব্যবহারকারীর প্রমাণীকরণের প্রয়োজন নেই, যদিও কী-তে অ্যাক্সেস এখনও মালিকানাধীন অ্যাপের (এবং এটি যে কোনও অ্যাপকে অ্যাক্সেস দেয়) মধ্যে সীমাবদ্ধ। -
Tag::AUTH_TIMEOUTহল একটি সাংখ্যিক মান যা সেকেন্ডের মধ্যে নির্দিষ্ট করে যে, কী ব্যবহারের অনুমোদনের জন্য ব্যবহারকারীর প্রমাণীকরণ কতটা তাজা হওয়া প্রয়োজন। টাইমআউটগুলি রিবুটগুলিকে ক্রস করে না; রিবুট করার পরে, সমস্ত প্রমাণীকরণ অবৈধ হয়ে যায়। টাইমআউটটি একটি বড় মানে সেট করা যেতে পারে যা নির্দেশ করে যে প্রতি বুটে একবার প্রমাণীকরণ প্রয়োজন (2^32 সেকেন্ড হল ~136 বছর; সম্ভবত অ্যান্ড্রয়েড ডিভাইসগুলি এর চেয়ে বেশিবার রিবুট করা হয়)।
একটি আনলক করা ডিভাইস প্রয়োজন
Tag::UNLOCKED_DEVICE_REQUIRED সহ কীগুলি কেবলমাত্র ডিভাইসটি আনলক থাকা অবস্থায় ব্যবহারযোগ্য। বিস্তারিত অর্থের জন্য, KeyProtection.Builder#setUnlockedDeviceRequired(boolean) দেখুন।
UNLOCKED_DEVICE_REQUIRED Keystore দ্বারা প্রয়োগ করা হয়, KeyMint দ্বারা নয়। যাইহোক, Android 12 এবং উচ্চতর সংস্করণে, Keystore ডিভাইসটি লক থাকা অবস্থায় UNLOCKED_DEVICE_REQUIRED কীগুলিকে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত করে যাতে নিশ্চিত করা যায় যে, বেশিরভাগ ক্ষেত্রে, ডিভাইসটি লক থাকা অবস্থায় Keystore-এর ক্ষতি হলেও সেগুলি ব্যবহার করা যাবে না।
এই বিভাগে বর্ণিত সমস্ত ক্রিপ্টোগ্রাফি এবং র্যান্ডম নম্বর জেনারেশন BoringSSL ব্যবহার করে, যেখানে KeyMint-এর ব্যবহার স্পষ্টভাবে উল্লেখ করা হয়েছে তা ছাড়া। সমস্ত গোপনীয়তা আর প্রয়োজন না হলে শূন্য করা হয়।
আনলকডডিভাইসপ্রয়োজনীয় সুপার কী
UNLOCKED_DEVICE_REQUIRED কীগুলিকে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত করার জন্য, Keystore তাদের ডাটাবেসে সংরক্ষণ করার আগে সেগুলিকে "superencrypts" করে। যখন সম্ভব হয়, তখন এটি ডিভাইসটি লক থাকা অবস্থায় সুপারএনক্রিপশন কীগুলিকে (super keys) সুরক্ষিত করে যাতে কেবলমাত্র একটি সফল ডিভাইস আনলকের মাধ্যমেই সেগুলি পুনরুদ্ধার করা যায়। ("superencryption" শব্দটি ব্যবহার করা হয় কারণ এনক্রিপশনের এই স্তরটি KeyMint ইতিমধ্যেই সমস্ত কীতে প্রয়োগ করে এমন এনক্রিপশনের স্তরের পাশাপাশি প্রয়োগ করা হয়।)
প্রতিটি ব্যবহারকারীর (প্রোফাইল সহ) দুটি সুপার কী থাকে যা UNLOCKED_DEVICE_REQUIRED এর সাথে যুক্ত:
- UnlockedDeviceRequired সিমেট্রিক সুপার কী। এটি একটি AES‑256‑GCM কী। এটি
UNLOCKED_DEVICE_REQUIREDকীগুলিকে এনক্রিপ্ট করে যা ব্যবহারকারীর জন্য ডিভাইসটি আনলক করার সময় আমদানি করা, তৈরি করা বা ব্যবহৃত হয়। - UnlockedDeviceRequired অ্যাসিমেট্রিক সুপার কী। এটি একটি ECDH P‑521 কী জোড়া। এটি
UNLOCKED_DEVICE_REQUIREDকীগুলিকে এনক্রিপ্ট করে যা ব্যবহারকারীর জন্য ডিভাইস লক থাকা অবস্থায় আমদানি করা বা তৈরি করা হয়। আরও বিস্তারিত জানার জন্য, ডিভাইস লক থাকা অবস্থায় কী সংরক্ষণ করা দেখুন।
সুপার কী তৈরি এবং সুরক্ষিত করা
যখন একজন ব্যবহারকারী তৈরি করা হয়, তখন Keystore ব্যবহারকারীর UnlockedDeviceRequired সুপার কী তৈরি করে এবং ব্যবহারকারীর সিন্থেটিক পাসওয়ার্ড দ্বারা এনক্রিপ্ট করা (পরোক্ষভাবে) তাদের ডাটাবেসে সংরক্ষণ করে:
- সিস্টেম সার্ভারটি SP800‑108 KDF ব্যবহার করে ব্যবহারকারীর সিন্থেটিক পাসওয়ার্ড থেকে ব্যবহারকারীর Keystore পাসওয়ার্ডটি গ্রহণ করে।
- সিস্টেম সার্ভার ব্যবহারকারীর কীস্টোর পাসওয়ার্ড কীস্টোরে পাঠায়।
- কীস্টোর ব্যবহারকারীর সুপার কী তৈরি করে।
- প্রতিটি ব্যবহারকারীর সুপার কীগুলির জন্য:
- কীস্টোর একটি এলোমেলো লবণ তৈরি করে।
- Keystore ব্যবহারকারীর Keystore পাসওয়ার্ড এবং HKDF-SHA256 ব্যবহার করে সল্ট থেকে একটি AES-256-GCM কী তৈরি করে।
- কীস্টোর এই AES-256-GCM কী ব্যবহার করে সুপার কী-এর গোপন অংশ এনক্রিপ্ট করে।
- কীস্টোর এনক্রিপ্টেড সুপার কী এবং এর সল্টটি তার ডাটাবেসে সংরক্ষণ করে। যদি এটি একটি অসমমিতিক কী হয়, তাহলে কীটির পাবলিক অর্ধেকটিও এনক্রিপ্ট না করে সংরক্ষণ করা হয়।
এই পদ্ধতিটি ব্যবহারকারীর সিন্থেটিক পাসওয়ার্ড জানা গেলে, যেমন যখন ব্যবহারকারীর সঠিক পিন, প্যাটার্ন বা পাসওয়ার্ড প্রবেশ করানো হয়, তখন এই সুপার কীগুলি ডিক্রিপ্ট করার অনুমতি দেয়।
Keystore এই সুপার কীগুলিকে মেমোরিতে ক্যাশে করে, যার ফলে এটি UNLOCKED_DEVICE_REQUIRED কীগুলিতে কাজ করতে পারে। তবে, এটি কেবলমাত্র ব্যবহারকারীর জন্য ডিভাইসটি আনলক থাকা অবস্থায় এই কীগুলির গোপন অংশগুলি ক্যাশে করার চেষ্টা করে। যখন ব্যবহারকারীর জন্য ডিভাইসটি লক করা থাকে, তখন Keystore সম্ভব হলে এই সুপার কীগুলির গোপন অংশগুলির ক্যাশে করা কপিটি শূন্য করে দেয়। বিশেষ করে, যখন ব্যবহারকারীর জন্য ডিভাইসটি লক করা থাকে, তখন Keystore ব্যবহারকারীর UnlockedDeviceRequired সুপার কীগুলির জন্য তিনটি সুরক্ষা স্তরের একটি নির্বাচন করে এবং প্রয়োগ করে:
- যদি ব্যবহারকারীর কাছে কেবল পিন, প্যাটার্ন বা পাসওয়ার্ড সক্রিয় থাকে, তাহলে কীস্টোর তার ক্যাশেড সুপার কীগুলির গোপন অংশগুলিকে শূন্য করে দেয়। এর ফলে সুপার কীগুলি কেবলমাত্র ডাটাবেসের এনক্রিপ্ট করা কপির মাধ্যমে পুনরুদ্ধারযোগ্য হয় যা কেবল পিন, প্যাটার্ন বা পাসওয়ার্ড সমতুল্য দ্বারা ডিক্রিপ্ট করা যেতে পারে।
- যদি ব্যবহারকারীর শুধুমাত্র ক্লাস 3 ("শক্তিশালী") বায়োমেট্রিক্স এবং পিন, প্যাটার্ন, বা পাসওয়ার্ড সক্ষম থাকে, তাহলে Keystore PIN, প্যাটার্ন, বা পাসওয়ার্ড সমতুল্যের বিকল্প হিসেবে ব্যবহারকারীর নথিভুক্ত ক্লাস 3 বায়োমেট্রিক্স (সাধারণত ফিঙ্গারপ্রিন্ট) দ্বারা সুপার কীগুলি পুনরুদ্ধার করার ব্যবস্থা করে। এটি করার জন্য, এটি একটি নতুন AES-256-GCM কী তৈরি করে, এটি দিয়ে সুপার কীগুলির গোপন অংশগুলি এনক্রিপ্ট করে, AES-256-GCM কীটি KeyMint-এ একটি বায়োমেট্রিক-বাউন্ড কী হিসাবে আমদানি করে যার জন্য শেষ 15 সেকেন্ডের মধ্যে বায়োমেট্রিক প্রমাণীকরণ সফল হতে হবে এবং এই সমস্ত কীগুলির প্লেইনটেক্সট কপিগুলিকে শূন্য করে।
- যদি ব্যবহারকারীর ক্লাস ১ ("সুবিধাজনক") বায়োমেট্রিক, ক্লাস ২ ("দুর্বল") বায়োমেট্রিক, অথবা সক্রিয় আনলক ট্রাস্ট এজেন্ট সক্ষম থাকে, তাহলে কীস্টোর সুপার কীগুলিকে প্লেইনটেক্সটে ক্যাশে রাখে। এই ক্ষেত্রে,
UNLOCKED_DEVICE_REQUIREDকীগুলির জন্য ক্রিপ্টোগ্রাফিক সুরক্ষা প্রদান করা হয় না। ব্যবহারকারীরা এই আনলক পদ্ধতিগুলি সক্ষম না করে এই কম নিরাপদ ফলব্যাক এড়াতে পারেন। এই বিভাগগুলির মধ্যে সবচেয়ে সাধারণ আনলক পদ্ধতিগুলি হল অনেক ডিভাইসে ফেস আনলক এবং একটি জোড়া স্মার্টওয়াচ দিয়ে আনলক করা।
যখন ব্যবহারকারীর জন্য ডিভাইসটি আনলক করা হয়, তখন Keystore সম্ভব হলে ব্যবহারকারীর UnlockedDeviceRequired সুপার কীগুলি পুনরুদ্ধার করে। PIN, প্যাটার্ন, বা পাসওয়ার্ড সমতুল্য আনলকের জন্য, এটি ডাটাবেসে সংরক্ষিত এই কীগুলির অনুলিপি ডিক্রিপ্ট করে। অন্যথায়, এটি বায়োমেট্রিক-বাউন্ড কী দিয়ে এনক্রিপ্ট করা এই কীগুলির একটি অনুলিপি সংরক্ষণ করেছে কিনা তা পরীক্ষা করে এবং যদি তাই হয় তবে তা ডিক্রিপ্ট করার চেষ্টা করে। এটি কেবল তখনই সফল হয় যদি ব্যবহারকারী শেষ 15 সেকেন্ডের মধ্যে একটি ক্লাস 3 বায়োমেট্রিক দিয়ে সফলভাবে প্রমাণীকরণ করে, যা KeyMint (Keystore নয়) দ্বারা প্রয়োগ করা হয়েছে।
ডিভাইস লক থাকা অবস্থায় কী সংরক্ষণ করা
কীস্টোর ব্যবহারকারীদের ডিভাইসটি লক থাকা অবস্থায় UNLOCKED_DEVICE_REQUIRED কীগুলি আমদানি এবং জেনারেট করার অনুমতি দেয়। এটি একটি হাইব্রিড এনক্রিপশন স্কিম ব্যবহার করে যাতে ডিভাইসটি পরে আনলক করা হলেই কেবল সেগুলি ডিক্রিপ্ট করা যায়:
- এনক্রিপশন (ডিভাইস লক থাকা অবস্থায় একটি
UNLOCKED_DEVICE_REQUIREDকী আমদানি বা তৈরি করা):- কীস্টোর একটি নতুন ক্ষণস্থায়ী ECDH P‑521 কী জোড়া তৈরি করে।
- এই ক্ষণস্থায়ী কী জোড়ার প্রাইভেট কী এবং UnlockedDeviceRequired অ্যাসিমেট্রিক সুপার কী-এর পাবলিক অর্ধেকের মধ্যে ECDH কী চুক্তি করে কীস্টোর একটি ভাগ করা গোপনীয়তা তৈরি করে।
- কীস্টোর একটি এলোমেলো লবণ তৈরি করে।
- Keystore HKDF-SHA256 ব্যবহার করে শেয়ার্ড সিক্রেট এবং সল্ট থেকে একটি AES-256-GCM কী তৈরি করে।
- Keystore এই AES‑256‑GCM কী ব্যবহার করে
UNLOCKED_DEVICE_REQUIREDকী এনক্রিপ্ট করে। - কীস্টোর তার ডাটাবেসে এনক্রিপ্ট করা
UNLOCKED_DEVICE_REQUIREDকী, লবণ এবং ক্ষণস্থায়ী কী জোড়ার পাবলিক অর্ধেক সংরক্ষণ করে।
- ডিক্রিপশন (ডিভাইসটি আনলক থাকা অবস্থায় তৈরি
UNLOCKED_DEVICE_REQUIREDকী ব্যবহার করে):- কীস্টোর তার ডাটাবেস থেকে এনক্রিপ্ট করা
UNLOCKED_DEVICE_REQUIREDকী, সল্ট এবং ক্ষণস্থায়ী কী জোড়ার পাবলিক অর্ধেক লোড করে। - কীস্টোর ক্ষণস্থায়ী কী জোড়ার পাবলিক অর্ধেক এবং আনলকডডিভাইসরিকুয়ার্ড অ্যাসিমেট্রিক সুপার কী-এর প্রাইভেট অর্ধেকের মধ্যে ECDH কী চুক্তি করে একটি ভাগ করা গোপনীয়তা তৈরি করে। ডিভাইসটি আনলক করা থাকায় প্রাইভেট কীটি উপলব্ধ।
- Keystore HKDF‑SHA256 ব্যবহার করে শেয়ার্ড সিক্রেট এবং সল্ট থেকে একটি AES‑256‑GCM কী তৈরি করে। এই AES‑256‑GCM কীটি এনক্রিপশনের সময় প্রাপ্ত কীটির মতোই।
- কীস্টোর AES‑256‑GCM কী ব্যবহার করে
UNLOCKED_DEVICE_REQUIREDকী ডিক্রিপ্ট করে। - Keystore UnlockedDeviceRequired সিমেট্রিক সুপার কী ব্যবহার করে
UNLOCKED_DEVICE_REQUIREDকী পুনরায় এনক্রিপ্ট করে। এটি কীটির নিরাপত্তা বৈশিষ্ট্যগুলিকে প্রভাবিত করে না, তবে এটি পরে আরও দ্রুত অ্যাক্সেস করার অনুমতি দেয়।
- কীস্টোর তার ডাটাবেস থেকে এনক্রিপ্ট করা
এই বৈশিষ্ট্যটির মাধ্যমে ডিভাইসটি লক থাকা অবস্থায় অ্যাপগুলি ডেটা সংরক্ষণ করতে পারে, যাতে ডিভাইসটি আনলক থাকা অবস্থায়ই এটি ডিক্রিপ্ট করা যায়। এটি করার জন্য, অ্যাপগুলিকে এই পদক্ষেপগুলি অনুসরণ করতে হবে:
- কীস্টোরের বাইরে একটি AES‑256‑GCM কী তৈরি করুন।
- AES‑256‑GCM কী ব্যবহার করে ডেটা এনক্রিপ্ট করুন।
-
setUnlockedDeviceRequired(true)কী সুরক্ষা সেট ব্যবহার করে Keystore-এ AES‑256‑GCM কী আমদানি করুন। - চাবির মূল কপিটি শূন্য করুন।
ডিভাইসটি আনলক থাকা অবস্থায় ডেটা ডিক্রিপ্ট করতে, কীস্টোরে আমদানি করা কীটি ব্যবহার করুন।
ক্লায়েন্ট বাইন্ডিং
ক্লায়েন্ট বাইন্ডিং, একটি নির্দিষ্ট ক্লায়েন্ট অ্যাপের সাথে একটি কী-এর সংযোগ, একটি ঐচ্ছিক ক্লায়েন্ট আইডি এবং কিছু ঐচ্ছিক ক্লায়েন্ট ডেটা ( যথাক্রমে Tag::APPLICATION_ID এবং Tag::APPLICATION_DATA ) এর মাধ্যমে সম্পন্ন হয়। Keystore এই মানগুলিকে অস্বচ্ছ ব্লব হিসাবে বিবেচনা করে, শুধুমাত্র নিশ্চিত করে যে কী তৈরি/আমদানি করার সময় উপস্থাপিত একই ব্লবগুলি প্রতিটি ব্যবহারের জন্য উপস্থাপিত হয় এবং বাইট-টু-বাইট অভিন্ন হয়। KeyMint দ্বারা ক্লায়েন্ট বাইন্ডিং ডেটা ফেরত দেওয়া হয় না। কী ব্যবহার করার জন্য কলকারীকে এটি জানতে হবে।
এই বৈশিষ্ট্যটি অ্যাপগুলিতে উন্মুক্ত নয়।
মেয়াদ শেষ
Keystore তারিখ অনুসারে কী ব্যবহার সীমাবদ্ধ করার সমর্থন করে। কী-এর বৈধতার শুরু এবং কী-এর মেয়াদ শেষ হওয়ার বিষয়টি একটি কী-এর সাথে যুক্ত হতে পারে এবং বর্তমান তারিখ/সময় বৈধ সীমার বাইরে থাকলে Keymaster কী ক্রিয়াকলাপ সম্পাদন করতে অস্বীকৃতি জানায়। কী-এর বৈধতার পরিসর Tag::ACTIVE_DATETIME , Tag::ORIGINATION_EXPIRE_DATETIME , এবং Tag::USAGE_EXPIRE_DATETIME ট্যাগ দিয়ে নির্দিষ্ট করা হয়। "origination" এবং "usage" এর মধ্যে পার্থক্যটি কীটি একটি নতুন ciphertext/signature/etc. "originate" করতে, নাকি একটি বিদ্যমান ciphertext/signature/etc. "ব্যবহার" করতে ব্যবহৃত হচ্ছে তার উপর ভিত্তি করে। মনে রাখবেন যে এই পার্থক্যটি অ্যাপগুলিতে প্রকাশিত হয় না।
Tag::ACTIVE_DATETIME , Tag::ORIGINATION_EXPIRE_DATETIME , এবং Tag::USAGE_EXPIRE_DATETIME ট্যাগগুলি ঐচ্ছিক। যদি ট্যাগগুলি অনুপস্থিত থাকে, তাহলে ধরে নেওয়া হয় যে প্রশ্নবিদ্ধ কীটি সর্বদা বার্তাগুলি ডিক্রিপ্ট/যাচাই করার জন্য ব্যবহার করা যেতে পারে।
যেহেতু ওয়াল-ক্লক টাইম অ-সুরক্ষিত বিশ্ব দ্বারা সরবরাহ করা হয়, তাই মেয়াদোত্তীর্ণ-সম্পর্কিত ট্যাগগুলি সফ্টওয়্যার-প্রয়োগকৃত তালিকায় থাকে।
বিশ্বাসের বন্ধনের মূল
Keystore-এর জন্য কীগুলিকে একটি বিশ্বাসের মূলের সাথে আবদ্ধ করতে হয়, যা স্টার্টআপের সময় KeyMint সুরক্ষিত হার্ডওয়্যারে সরবরাহ করা একটি বিটস্ট্রিং, বিশেষ করে বুটলোডার দ্বারা। এই বিটস্ট্রিংটি KeyMint দ্বারা পরিচালিত প্রতিটি কী-এর সাথে ক্রিপ্টোগ্রাফিকভাবে আবদ্ধ।
ট্রাস্টের মূল হলো বুট ইমেজে স্বাক্ষর এবং ডিভাইসের লক অবস্থা যাচাই করার জন্য ব্যবহৃত পাবলিক কী। যদি পাবলিক কী পরিবর্তন করে অন্য সিস্টেম ইমেজ ব্যবহার করা হয় অথবা লক অবস্থা পরিবর্তন করা হয়, তাহলে পূর্ববর্তী সিস্টেম দ্বারা তৈরি KeyMint-সুরক্ষিত কীগুলির কোনওটিই ব্যবহারযোগ্য হবে না, যদি না পূর্ববর্তী ট্রাস্টের মূলটি পুনরুদ্ধার করা হয় এবং সেই কী দ্বারা স্বাক্ষরিত একটি সিস্টেম বুট করা হয়। লক্ষ্য হল সফ্টওয়্যার-প্রয়োগকৃত কী অ্যাক্সেস নিয়ন্ত্রণের মান বৃদ্ধি করা, যাতে আক্রমণকারী-ইনস্টল করা অপারেটিং সিস্টেমের জন্য KeyMint কী ব্যবহার করা অসম্ভব হয়ে পড়ে।
স্বতন্ত্র কী
কিছু KeyMint সুরক্ষিত হার্ডওয়্যার এনক্রিপ্ট করা কী উপাদানের পরিবর্তে অভ্যন্তরীণভাবে কী উপাদান সংরক্ষণ এবং হ্যান্ডেলগুলি ফেরত দিতে পারে। অথবা এমন কিছু ক্ষেত্রেও থাকতে পারে যেখানে অন্য কোনও অ-সুরক্ষিত বা সুরক্ষিত ওয়ার্ল্ড সিস্টেম উপাদান উপলব্ধ না হওয়া পর্যন্ত কীগুলি ব্যবহার করা যাবে না। KeyMint HAL কলারকে TAG::STANDALONE ট্যাগের মাধ্যমে একটি কী "স্বতন্ত্র" করার অনুরোধ করার অনুমতি দেয়, যার অর্থ হল ব্লব এবং চলমান KeyMint সিস্টেম ছাড়া অন্য কোনও সংস্থানের প্রয়োজন হয় না। একটি কী স্বতন্ত্র কিনা তা দেখার জন্য একটি কী-এর সাথে যুক্ত ট্যাগগুলি পরীক্ষা করা যেতে পারে। বর্তমানে, শুধুমাত্র দুটি মান সংজ্ঞায়িত করা হয়েছে:
-
KeyBlobUsageRequirements::STANDALONE -
KeyBlobUsageRequirements::REQUIRES_FILE_SYSTEM
এই বৈশিষ্ট্যটি অ্যাপগুলিতে উন্মুক্ত নয়।
বেগ
যখন এটি তৈরি করা হয়, তখন সর্বোচ্চ ব্যবহারের বেগ TAG::MIN_SECONDS_BETWEEN_OPS দিয়ে নির্দিষ্ট করা যেতে পারে। যদি কোনও অপারেশন TAG::MIN_SECONDS_BETWEEN_OPS সেকেন্ডের কম আগে করা হয়, তাহলে TrustZone বাস্তবায়নগুলি সেই কী দিয়ে ক্রিপ্টোগ্রাফিক ক্রিয়াকলাপ সম্পাদন করতে অস্বীকার করে।
বেগ সীমা বাস্তবায়নের সহজ পদ্ধতি হল কী আইডি এবং শেষ-ব্যবহারের টাইমস্ট্যাম্পের একটি টেবিল। এই টেবিলটি সীমিত আকারের, তবে কমপক্ষে ১৬টি এন্ট্রি ধারণ করে। যদি টেবিলটি পূর্ণ থাকে এবং কোনও এন্ট্রি আপডেট বা বাতিল করা না যায়, তাহলে সুরক্ষিত হার্ডওয়্যার বাস্তবায়ন "নিরাপদভাবে ব্যর্থ হয়", এবং কোনও একটি এন্ট্রির মেয়াদ শেষ না হওয়া পর্যন্ত সমস্ত বেগ-সীমাবদ্ধ কী অপারেশন প্রত্যাখ্যান করতে পছন্দ করে। রিবুট করার সময় সমস্ত এন্ট্রির মেয়াদ শেষ হওয়া গ্রহণযোগ্য।
TAG::MAX_USES_PER_BOOT ব্যবহার করে প্রতি বুটে কী ব্যবহার সীমিত করা যেতে পারে। এর জন্য একটি ট্র্যাকিং টেবিলেরও প্রয়োজন, যাতে কমপক্ষে চারটি কী থাকে এবং এটি নিরাপদেও ব্যর্থ হয়। মনে রাখবেন যে অ্যাপগুলি প্রতি-বুট সীমিত কী তৈরি করতে পারে না। এই বৈশিষ্ট্যটি Keystore এর মাধ্যমে প্রকাশ করা হয় না এবং সিস্টেম ক্রিয়াকলাপের জন্য সংরক্ষিত।
এই বৈশিষ্ট্যটি অ্যাপগুলিতে উন্মুক্ত নয়।
র্যান্ডম নম্বর জেনারেটর রি-সিডিং
যেহেতু সুরক্ষিত হার্ডওয়্যার কী ম্যাটেরিয়াল এবং ইনিশিয়ালাইজেশন ভেক্টর (IV) এর জন্য এলোমেলো সংখ্যা তৈরি করে, এবং যেহেতু হার্ডওয়্যার এলোমেলো সংখ্যা জেনারেটর সবসময় সম্পূর্ণরূপে বিশ্বাসযোগ্য নাও হতে পারে, তাই KeyMint HAL একটি ইন্টারফেস প্রদান করে যা ক্লায়েন্টকে অতিরিক্ত এনট্রপি প্রদান করতে দেয়, যা জেনারেট করা এলোমেলো সংখ্যার সাথে মিশ্রিত হয়।
প্রাথমিক বীজ উৎস হিসেবে একটি হার্ডওয়্যার র্যান্ডম-নম্বর জেনারেটর ব্যবহার করুন। বহিরাগত API এর মাধ্যমে প্রদত্ত বীজ তথ্য সংখ্যা উৎপাদনের জন্য ব্যবহৃত র্যান্ডমনেসের একমাত্র উৎস হতে পারে না। অধিকন্তু, ব্যবহৃত মিক্সিং অপারেশনের জন্য নিশ্চিত করা প্রয়োজন যে র্যান্ডম আউটপুট অপ্রত্যাশিত, যদি বীজ উৎসগুলির মধ্যে কোনও একটি অপ্রত্যাশিত হয়।