Android Keystore হল Android-এ একটি সিস্টেম মেকানিজম যা ক্রিপ্টোগ্রাফিক কীগুলিকে হার্ডওয়্যার আইসোলেশনে নিরাপদে সংরক্ষণ করার জন্য। সিস্টেমটি ARM TrustZone সহ ডিভাইসগুলিতে Trusted Execution Environment (TEE) বা চিপ স্তরে কীগুলি সুরক্ষিত করার জন্য ডেডিকেটেড Secure Element ব্যবহার করে। Android Open Source Project-এর মতে, Keystore সুরক্ষিত পরিবেশে সরাসরি কী জেনারেশন সহ RSA, EC, AES এবং HMAC অ্যালগরিদম সমর্থন করে।
মূল পয়েন্ট
Android Keystore হল Android-এ API 1 (Android 1.0) থেকে বাস্তবায়িত একটি ক্রিপ্টোগ্রাফিক প্রদানকারী, কিন্তু সম্পূর্ণ হার্ডওয়্যার সমর্থন Android 4.3 (API 18) থেকে উপস্থিত হয়েছে। Keystore প্রাইভেট কীগুলির নিরাপদ স্টোরেজের সমস্যা সমাধান করে যাতে অপারেটিং সিস্টেমের সাথে আপস করা হলেও আক্রমণকারী প্লেইনটেক্সটে কীগুলি বের করতে না পারে।
Android Keystore আর্কিটেকচার তিনটি স্তর নিয়ে গঠিত: অ্যাপ্লিকেশন API (java.security.KeyStore), সিস্টেম সার্ভিস (keystore daemon), এবং হার্ডওয়্যার স্তর (Keymaster HAL)। অ্যাপ্লিকেশনটি স্ট্যান্ডার্ড Java Cryptography Architecture (JCA) API-এর মাধ্যমে অ্যাক্সেস করে এবং সিস্টেম সার্ভিস TEE-তে চলমান Keymaster-এ অনুরোধ রুট করে।
কীগুলির সাথে সমস্ত ক্রিপ্টোগ্রাফিক অপারেশন (স্বাক্ষর, ডিক্রিপশন) TEE বা Secure Element-এর ভিতরে সঞ্চালিত হয়। কীগুলি কখনও সুরক্ষিত পরিবেশ ছেড়ে যায় না — অ্যাপ্লিকেশনটি কী উল্লেখ করার জন্য শুধুমাত্র একটি হ্যান্ডেল (উপনাম) পায়। এটি সফ্টওয়্যার KeyStores থেকে একটি মৌলিক পার্থক্য, যেখানে কীগুলি প্রক্রিয়া মেমরিতে সম্ভাব্যভাবে অ্যাক্সেসযোগ্য।
স্ট্যান্ডার্ড JKS (Java KeyStore) বা BKS (Bouncy Castle) পাসওয়ার্ড-সুরক্ষিত ফাইলগুলিতে কীগুলি সংরক্ষণ করে। Android Keystore কীগুলিকে হার্ডওয়্যার আইসোলেশনে সংরক্ষণ করে, যেখানে তারা রুট ব্যবহারকারী থেকেও সুরক্ষিত। JKS সরাসরি ফাইল সিস্টেম অ্যাক্সেসের জন্য ঝুঁকিপূর্ণ; Android Keystore নয়।
আরেকটি পার্থক্য: Android Keystore-এ, কীগুলির কঠোর ব্যবহারের প্যারামিটার (purpose — শুধু sign/verify/encrypt/decrypt) জেনারেশনের সময় নির্দিষ্ট করা হয়। সেগুলি পরে পরিবর্তন করা যায় না, যা কী-এর অপব্যবহার রোধ করে।
নতুন কী তৈরি করার সময়, অ্যাপ্লিকেশন KeyGenParameterSpec সহ KeyPairGenerator বা KeyGenerator কল করে, যাতে ভবিষ্যতের কী-এর সমস্ত প্যারামিটার থাকে। সিস্টেম Keymaster HAL-এ অনুরোধ পাঠায়, যা TEE-এর ভিতরে কী জেনারেট করে এবং একটি হ্যান্ডেল ফেরত দেয়।
KeyGenParameterSpec.Builder পদ্ধতি বাধ্যতামূলক প্যারামিটার গ্রহণ করে: Keystore-এ কী-এর নাম, উদ্দেশ্য (PURPOSE_SIGN, PURPOSE_ENCRYPT), অ্যালগরিদম (RSA, EC, AES)। অতিরিক্ত: digest (SHA-256), padding (PKCS7), userAuthenticationRequired (বায়োমেট্রিক্স), keyValidityStart/End (সময় সীমাবদ্ধতা)।
প্যারামিটার সেট করার পর, KeyPairGenerator.generateKeyPair() একটি KeyPair ফেরত দেয়, যেখানে PrivateKey হল একটি অবজেক্ট যা Keymaster-এর কাছে অপারেশন ডেলিগেট করে। পাবলিক কী বের করা যায়, প্রাইভেট কী নয়। এটি শুধুমাত্র TEE-এর ভিতরে বিদ্যমান।
import java.security.KeyPairGenerator
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
fun generateKey(alias: String) {
val spec = KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
).setDigests(KeyProperties.DIGEST_SHA256)
.setSignaturePaddings(KeyProperties.SIGN_PADDING_RSA_PKCS1)
.setUserAuthenticationRequired(true)
.build()
val kpGen = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
kpGen.initialize(spec)
kpGen.generateKeyPair()
}
ECDSA বা RSA-PSS-এর জন্য Signature স্ট্যান্ডার্ড API-এর মাধ্যমে তৈরি হয়: Signature.getInstance(algorithm).initSign(privateKey)। স্বাক্ষর অপারেশন TEE-তে সঞ্চালিত হয়: অ্যাপ্লিকেশন ডেটা পাঠায়, Keymaster হার্ডওয়্যারে স্বাক্ষর করে এবং স্বাক্ষর ফেরত দেয়। কী এবং ডেটা শেয়ার্ড মেমরিতে মিশ্রিত হয় না।
বায়োমেট্রিক সুরক্ষার জন্য, স্বাক্ষর করার আগে ব্যবহারকারীকে BiometricPrompt-এর মাধ্যমে প্রমাণীকরণ করতে হবে। সফল প্রমাণীকরণ ছাড়া, Keymaster অপারেশন সম্পাদন করে না এবং CryptoAuthenticationException ফেরত দেয়।
import java.security.KeyStore
import java.security.Signature
import androidx.biometric.BiometricPrompt
fun signWithBiometric(alias: String) {
val ks = KeyStore.getInstance("AndroidKeyStore")
ks.load(null)
val entry = ks.getEntry(alias, null) as KeyStore.PrivateKeyEntry
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(entry.privateKey)
// BiometricPrompt CryptoObject(signature) সহ FaceID/PIN অনুরোধ করে
}
Android দুটি কী স্টোরেজ মোড সমর্থন করে: সফ্টওয়্যার (TEE ছাড়া ডিভাইসে) এবং হার্ডওয়্যার (TEE বা Secure Element সহ ডিভাইসে)। মোড SoC ক্ষমতা এবং Android সংস্করণের উপর নির্ভর করে।
Trusted Execution Environment ছাড়া ডিভাইসগুলিতে (Android 4.3-এর আগে বা বাজেট SoCs), কীগুলি লক স্ক্রিন পাসওয়ার্ড থেকে প্রাপ্ত মাস্টার কী ব্যবহার করে এনক্রিপ্টেড সংরক্ষণ করা হয়। এই মোডটি কম নিরাপদ — ক্রিপ্টোগ্রাফিক অপারেশনের সময় কীগুলি প্রক্রিয়া মেমরিতে অ্যাক্সেসযোগ্য।
সুরক্ষা স্তর AES-256-GCM ব্যবহার করে KeyStore ফাইল এনক্রিপশনের উপর ভিত্তি করে। এনক্রিপশন কী ব্যবহারকারীর পাসওয়ার্ড বা PIN থেকে Scrypt (উচ্চ সংখ্যক পুনরাবৃত্তি সহ PBKDF2) এর মাধ্যমে জেনারেট হয়।
আধুনিক ডিভাইসগুলিতে, TEE (ARM TrustZone)-তে Keymaster 4.x ব্যবহার করা হয়। কীগুলি একচেটিয়াভাবে TrustZone-এর ভিতরে জেনারেট, সংরক্ষণ এবং ব্যবহার করা হয়। এমনকি Linux কার্নেলেরও প্রাইভেট কীগুলিতে অ্যাক্সেস নেই — শুধুমাত্র Keymaster HAL অপারেশন করতে পারে।
Secure Element (যেমন Samsung Knox-এ eSE বা Google Pixel 3+-এ StrongBox) নিজস্ব প্রসেসর এবং মেমরি সহ একটি পৃথক চিপ। এটি Common Criteria EAL 4+ প্রত্যয়িত এবং শারীরিক ছেদ-ছাড় থেকে সুরক্ষা সহ সর্বোচ্চ স্তরের সুরক্ষা প্রদান করে।
| ধরন | স্টোরেজ অবস্থান | সুরক্ষা স্তর | API থেকে উপলব্ধ |
|---|---|---|---|
| সফ্টওয়্যার | ফাইল /data/misc/keystore | মধ্যম (AES-256) | API 1+ |
| Keymaster 3 | TEE (TrustZone) | উচ্চ | API 23+ |
| Keymaster 4 | TEE + Secure I/O | খুব উচ্চ | API 28+ |
| StrongBox | হার্ডওয়্যার Secure Element | সর্বোচ্চ | API 28+, ঐচ্ছিক |
Android Keystore Java Cryptography Architecture (JCA)-তে একীভূত। প্রদানকারী অ্যাক্সেস করতে স্ট্যান্ডার্ড KeyStore.getInstance("AndroidKeyStore") ব্যবহার করা হয়। API API 18 থেকে উপলব্ধ।
KeyStore.load(null) পদ্ধতি অ্যাপ্লিকেশনের KeyStore কন্টেইনার লোড করে। পাসওয়ার্ডের প্রয়োজন নেই — Android অ্যাক্সেস নিয়ন্ত্রণের জন্য অ্যাপ্লিকেশন প্রসঙ্গ এবং এর UID ব্যবহার করে। প্রতিটি অ্যাপ্লিকেশন শুধুমাত্র নিজস্ব এন্ট্রি দেখে যদি না শেয়ার্ড UID ব্যবহার করা হয়।
setEntry এবং getEntry পদ্ধতিগুলি KeyStore.PrivateKeyEntry, SecretKeyEntry বা TrustedCertificateEntry-এর সাথে কাজ করে। ProtectionParameter প্যারামিটার Android Keystore-এর জন্য সর্বদা null (সুরক্ষা সিস্টেম স্তরে বাস্তবায়িত)।
import java.security.KeyStore
import java.security.cert.Certificate
import android.security.keystore.KeyProtection
fun storeSecretKey(alias: String, key: SecretKey) {
val ks = KeyStore.getInstance("AndroidKeyStore")
ks.load(null)
val prot = KeyProtection.Builder(
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
).setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setUserAuthenticationRequired(true)
.build()
ks.setEntry(alias, KeyStore.SecretKeyEntry(key), prot)
}
KeyCharacteristics ব্যবহার করে, আপনি নির্ধারণ করতে পারেন কী কোন পরিবেশে সংরক্ষিত: সফ্টওয়্যার KeyStore, TEE, বা StrongBox। getKeyCharacteristics() পদ্ধতি ফ্ল্যাগের একটি সেট ফেরত দেয়: FLAG_HARDWARE (keymaster), FLAG_SECURE_ELEMENT (StrongBox), FLAG_TRUSTED_USER_PRESENCE_REQUIRED (বায়োমেট্রিক্স)।
Android Keystore তিনটি বিভাগে বিভক্ত ক্রিপ্টোগ্রাফিক অ্যালগরিদমের একটি বিস্তৃত পরিসর সমর্থন করে: অ্যাসিমেট্রিক, সিমেট্রিক এবং MAC। নির্দিষ্ট অ্যালগরিদমের জন্য সমর্থন Keymaster HAL সংস্করণের উপর নির্ভর করে।
RSA (1024–4096 বিট) — স্বাক্ষর (PKCS1, PSS) এবং এনক্রিপশন (OAEP, PKCS1) এর জন্য। EC (P-224, P-256, P-384, P-521) — ECDSA স্বাক্ষর এবং ECDH কী চুক্তির জন্য। AES (128, 256 বিট) — CBC, CTR, GCM মোডে সিমেট্রিক এনক্রিপশনের জন্য। HMAC (SHA1, SHA256, SHA512) — বার্তা প্রমাণীকরণের জন্য।
প্রতিটি কী-র জন্য, সম্ভাব্য অপারেশন সীমাবদ্ধ করতে setPurposes নির্দিষ্ট করা হয়। PURPOSE_SIGN সহ RSA কী এনক্রিপশনের জন্য ব্যবহার করা যায় না, এমনকি আক্রমণকারীর API অ্যাক্সেস থাকলেও। এটি হার্ডওয়্যার স্তরে কী ব্যবহার প্রয়োগ।
Keymaster-এ ব্যর্থ বায়োমেট্রিক প্রমাণীকরণ প্রচেষ্টার একটি কাউন্টার অন্তর্ভুক্ত রয়েছে। নির্দিষ্ট সংখ্যক ব্যর্থতার পর (setInvalidatedByBiometricEnrollment এর মাধ্যমে কনফিগারযোগ্য), কী অনুপলব্ধ হয়ে যায় এবং মুছে ফেলা/পুনর্জেনারেশন প্রয়োজন। যখন সমস্ত বায়োমেট্রিক টেমপ্লেট সরানো হয়, userAuthenticationRequired=true সহ সমস্ত কী স্বয়ংক্রিয়ভাবে অবৈধ হয়ে যায়।
Key Attestation (Android 8.1+)ও সমর্থিত: অ্যাপ্লিকেশনের অনুরোধে, Keymaster কী-এর বৈশিষ্ট্য (হার্ডওয়্যার/সফ্টওয়্যার, অ্যালগরিদম, উদ্দেশ্য) সম্পর্কে তথ্য সহ একটি সার্টিফিকেট স্বাক্ষর করে। সার্ভার এই সার্টিফিকেট যাচাই করতে পারে যে কী একটি বিশ্বস্ত পরিবেশে তৈরি করা হয়েছে তা নিশ্চিত করতে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Java KeyStore পাসওয়ার্ড-সুরক্ষিত ফাইলে (JKS, BKS) কীগুলি সংরক্ষণ করে। Android Keystore TEE বা Secure Element-এর মাধ্যমে হার্ডওয়্যার আইসোলেশন ব্যবহার করে। Java KeyStore রুট অ্যাক্সেসের জন্য ঝুঁকিপূর্ণ; Android Keystore নয়, কারণ প্রাইভেট কীগুলি কখনও সুরক্ষিত পরিবেশ ছেড়ে যায় না।
হ্যাঁ, KeyProtection সহ KeyStore.setEntry-এর মাধ্যমে। তবে, আমদানি করা কী-তে হার্ডওয়্যার সুরক্ষা থাকবে না — এটি মাস্টার কী দিয়ে এনক্রিপ্টেড সফ্টওয়্যার Keystore-এ সংরক্ষণ করা হবে। সর্বোচ্চ সুরক্ষার জন্য, সর্বদা Keystore-এর ভিতরে কীগুলি জেনারেট করুন।
KeyChain.isBoundKeyAlgorithm ব্যবহার করুন বা কী জেনারেশনের পর KeyCharacteristics পরীক্ষা করুন। বৈশিষ্ট্যগুলিতে FLAG_HARDWARE-এর উপস্থিতি মানে কী TEE-তে তৈরি হয়েছে। আপনি android.security.keystore.isHardwareBacked()-ও পরীক্ষা করতে পারেন।
যখন অ্যাপ্লিকেশন আনইনস্টল করা হয়, Android Keystore থেকে তার সমস্ত কী সরিয়ে ফেলে। ডেটা অপরিবর্তনীয়ভাবে হারিয়ে যায়। পুনরায় ইনস্টল করলে, অ্যাপ্লিকেশনটিকে নতুন কী জেনারেট করতে হবে। TEE-এর মাধ্যমে কী ব্যাকআপ আর্কিটেকচারাল কারণে অসম্ভব।
লক করা ডিভাইসে, Keymaster কোনো অপারেশন করে না। userAuthenticationRequired=true সহ কীগুলির প্রতিবার বায়োমেট্রিক নিশ্চিতকরণ প্রয়োজন। রুট অ্যাক্সেস থাকলেও, আক্রমণকারী সরাসরি Keymaster কল করতে পারে না — শুধুমাত্র Android Keystore সার্ভিসের মাধ্যমে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন