Android Keystore — একটি ক্রিপ্টোগ্রাফিক প্রোভাইডার যা এনক্রিপশন কী জেনারেট করে এবং বিচ্ছিন্ন এক্সিকিউশন এনভায়রনমেন্টে (TEE) সংরক্ষণ করে, যা অপারেটিং সিস্টেমের কাছেও অগম্য। AOSP Security Documentation (2025) অনুসারে, Google Play-এর টপ-100 Android অ্যাপের 80%-এর বেশি টোকেন সুরক্ষা এবং ডেটা এনক্রিপশনের জন্য Keystore ব্যবহার করে। Android Keystore বোঝা Android-এ নিরাপদ কী স্টোরেজের জন্য অত্যন্ত গুরুত্বপূর্ণ।
মূল বিষয়
Android Keystore — Android প্ল্যাটফর্মের একটি সিস্টেম কম্পোনেন্ট যা সুরক্ষিত পরিবেশে ক্রিপ্টোগ্রাফিক কী জেনারেট, সংরক্ষণ এবং ব্যবহারের জন্য API প্রদান করে। সফটওয়্যার ক্রিপ্টোগ্রাফিক লাইব্রেরি (Bouncy Castle, Conscrypt) থেকে ভিন্ন, Keystore গ্যারান্টি দেয় যে প্রাইভেট কী কখনো বিচ্ছিন্ন এক্সিকিউশন এলাকা ছেড়ে যায় না।
Keystore Android 4.3 (API 18)-এ RSA সাপোর্ট সহ একটি সফটওয়্যার প্রোভাইডার হিসেবে আবির্ভূত হয়। Android 6.0 (API 23) থেকে শুরু করে, Keystore Keymaster Hardware Abstraction Layer (HAL)-এর মাধ্যমে হার্ডওয়্যার সাপোর্ট পায়, যা সামঞ্জস্যপূর্ণ ডিভাইসে ক্রিপ্টোগ্রাফিক অপারেশন Trusted Execution Environment (TEE)-তে ডেলিগেট করে। Android Compatibility Definition Document (2025) অনুসারে, Android 9+ থাকা সব ডিভাইসের জন্য TEE বা StrongBox-এর মাধ্যমে হার্ডওয়্যার Keystore সাপোর্ট বাধ্যতামূলক।
Keystore-এ কীগুলি উপনাম (alias) দ্বারা চিহ্নিত হয় — একটি স্ট্রিং যা কী তৈরি বা লোড করার সময় পাস করা হয়। Keystore কী-এর কাঁচা মেটেরিয়াল পাওয়ার অনুমতি দেয় না: Keystore-এ তৈরি কীগুলির জন্য getEncoded() মেথড null রিটার্ন করে। এটি সফটওয়্যার কী থেকে মৌলিক পার্থক্য — আক্রমণকারী ডিভাইসের সম্পূর্ণ নিয়ন্ত্রণ পেলেও প্রাইভেট কী বের করতে পারে না।
Keystore Android-এর অন্যান্য সুরক্ষা ব্যবস্থার সাথে ইন্টিগ্রেটেড: বায়োমেট্রিক অথেনটিকেশন (BiometricPrompt), ফাইল-লেভেল এনক্রিপশন (File-Based Encryption) এবং SafetyNet/Play Integrity ভেরিফিকেশন ফাংশন। কিছু শর্তে কীগুলি স্বয়ংক্রিয় মুছে ফেলার জন্য কনফিগার করা যেতে পারে: পাসকোড সরানোর সময়, নতুন ফিঙ্গারপ্রিন্ট যোগ করার সময় বা মেয়াদ শেষে।
Android Keystore-এর আর্কিটেকচারে তিনটি ইমপ্লিমেন্টেশন লেভেল অন্তর্ভুক্ত, যা হার্ডওয়্যার সুরক্ষার ডিগ্রিতে ভিন্ন। লেভেল ডিভাইসের হার্ডওয়্যারের ক্ষমতার উপর নির্ভর করে।
TEE (Trusted Execution Environment) — একটি বিচ্ছিন্ন এলাকা যা একই প্রসেসরে মূল OS-এর সমান্তরালে কাজ করে। TEE ARM TrustZone প্রযুক্তি ব্যবহার করে, যা প্রসেসরের ফিজিক্যাল কোরকে দুটি ভার্চুয়ালে বিভক্ত করে: Normal World (Android) এবং Secure World (TEE)। Secure World-এর কোডের সেই মেমোরি এবং পেরিফেরালে অ্যাক্সেস থাকে যা Normal World থেকে অগম্য।
যখন অ্যাপ Keystore-এর মাধ্যমে ক্রিপ্টোগ্রাফিক অপারেশন কল করে, অনুরোধ Keymaster HAL-এর মাধ্যমে TEE-তে পাঠানো হয়, যেখানে অপারেশন হার্ডওয়্যার দ্বারা এক্সিকিউট হয়। ফলাফল অ্যাপে ফেরত আসে, কিন্তু প্রাইভেট কী TEE-এর সুরক্ষিত মেমোরিতে থাকে। TEE GlobalPlatform TEE Protection Profile-এর সাথে সামঞ্জস্যপূর্ণ সার্টিফাইড এবং TrustZone সাপোর্টিং প্রসেসরযুক্ত Android 9+ ডিভাইসের জন্য বাধ্যতামূলক প্রয়োজন।
TEE AES/GCM (128, 256 বিট), RSA (2048, 4096 বিট), EC (P-256, P-384, P-521) এবং HMAC-SHA256 অ্যালগরিদম সাপোর্ট করে। TEE-এর পারফরম্যান্স সফটওয়্যার ক্রিপ্টোগ্রাফি (20–40% কম) থেকে কম, কিন্তু সাধারণ অপারেশনের (JWT স্বাক্ষর, সেশন কী ডিক্রিপশন) জন্য বিলম্ব 10–50 ms-এর বেশি নয়।
StrongBox — একটি ডেডিকেটেড সিকিউরিটি চিপ, যা মূল প্রসেসর থেকে শারীরিকভাবে আলাদা। TEE-এর বিপরীতে, যা Android-এর সাথে প্রসেসর সময় ভাগ করে, StrongBox-এর নিজস্ব CPU, RAM, True Random Number Generator (TRNG) এবং সুরক্ষিত স্টোরেজ (One-Time Programmable memory) থাকে। StrongBox Common Criteria EAL 4+ এবং Secure IC Protection Profile-এ সার্টিফাইড।
StrongBox Android 9+ থাকা ডিভাইসে উপলব্ধ যদি সংশ্লিষ্ট চিপ থাকে (যেমন, Google Pixel-এ Titan M, Samsung Galaxy-তে Knox)। ডেভেলপার KeyGenParameterSpec-এ setIsStrongBoxBacked(true) ফ্ল্যাগের মাধ্যমে StrongBox সক্রিয় করে। হার্ডওয়্যার সাপোর্টের অভাবে ফ্ল্যাগ উপেক্ষিত হয় এবং Keystore TEE-তে সুইচ করে।
StrongBox-এর সীমাবদ্ধতা: সীমিত অ্যালগরিদম সেট (AES-256, EC P-256, HMAC-SHA256) সাপোর্ট করে, অপারেশন কিউ — একবারে সর্বোচ্চ একটি, অপারেশনের সংখ্যা — চিপ রিসোর্স দ্বারা সীমিত। StrongBox উচ্চ-লোড পরিস্থিতির জন্য উদ্দিষ্ট নয় — ঘন ঘন অপারেশনের জন্য TEE ব্যবহার করুন এবং StrongBox শুধুমাত্র গুরুত্বপূর্ণ কীগুলির (মাস্টার এনক্রিপশন কী, স্বাক্ষর কী) জন্য ব্যবহার করুন।
Software-based Keystore — সফটওয়্যার ইমপ্লিমেন্টেশন যা TEE বা StrongBox হার্ডওয়্যার সাপোর্ট ছাড়া ডিভাইসে ব্যবহার করা হয়। কীগুলি ফাইল সিস্টেমে এনক্রিপ্টেড আকারে সংরক্ষিত হয়, কিন্তু প্রাইভেট কী অস্থায়ীভাবে RAM-এ ডিক্রিপ্ট করা যেতে পারে। সফটওয়্যার Keystore কম নিরাপদ — রুট অ্যাক্সেসওয়ালা আক্রমণকারী মেমোরিতে কী ইন্টারসেপ্ট করতে পারে।
Android 12 (API 31) থেকে শুরু করে, Google সব নতুন ডিভাইসের জন্য হার্ডওয়্যার Keystore সাপোর্ট বাধ্যতামূলক করে। Android 9–11 থাকা ডিভাইসে বাজেট মডেলে সফটওয়্যার Keystore থাকতে পারে। ডেভেলপার KeyStore.getKeyCharacteristics()-এর মাধ্যমে সুরক্ষার স্তর পরীক্ষা করতে পারে — SECURITY_LEVEL_TRUSTED_ENVIRONMENT বা SECURITY_LEVEL_STRONGBOX অ্যাট্রিবিউট হার্ডওয়্যার সুরক্ষা নিশ্চিত করে।
Android Keystore ক্রিপ্টোগ্রাফিক অ্যালগরিদমের বিস্তৃত সেট সাপোর্ট করে, যা কী প্রকারের ভিত্তিতে শ্রেণিতে বিভক্ত। অ্যালগরিদম নির্বাচন পারফরম্যান্স, সামঞ্জস্যতা এবং সুরক্ষা স্তরকে প্রভাবিত করে।
AES (Advanced Encryption Standard) — ডিভাইসে ডেটা সুরক্ষার জন্য সিমেট্রিক এনক্রিপশন। প্রস্তাবিত মোড: AES/GCM/NoPadding (256 বিট)। GCM অথেনটিকেটেড এনক্রিপশন (AEAD) প্রদান করে — এনক্রিপ্টেড ডেটার অখণ্ডতা পরীক্ষা। GCM-এর জন্য IV (Initialization Vector) সাইজ: 12 বাইট। AES/ECB ব্যবহার করবেন না — এটি যথাযথ সুরক্ষা প্রদান করে না।
RSA (Rivest–Shamir–Adleman) — সেশন কী সুরক্ষা এবং ডিজিটাল স্বাক্ষরের জন্য অ্যাসিমেট্রিক এনক্রিপশন। প্রস্তাবিত সাইজ: 2048 বা 4096 বিট। মোড: RSA/ECB/PKCS1Padding (এনক্রিপশন) এবং RSA/ECB/PKCS1Sign (স্বাক্ষর)। RSA 1024 পুরানো বলে বিবেচিত এবং নতুন অ্যাপ্লিকেশনের জন্য প্রস্তাবিত নয় (NIST SP 800-131A Rev. 2)।
EC (Elliptic Curve) — স্বাক্ষর এবং কী বিনিময়ের জন্য উপবৃত্তাকার বক্ররেখার উপর অ্যাসিমেট্রিক ক্রিপ্টোগ্রাফি। সমর্থিত বক্ররেখা: secp256r1 (P-256, বাধ্যতামূলক), secp384r1 (P-384) এবং secp521r1 (P-521)। EC উল্লেখযোগ্যভাবে ছোট কী সাইজে RSA-এর সমান সুরক্ষা প্রদান করে। P-256 অধিকাংশ পরিস্থিতির জন্য প্রস্তাবিত: এটি সব ডিভাইসে সমর্থিত এবং 128-বিট সুরক্ষা স্তর প্রদান করে।
HMAC (Hash-based Message Authentication Code) — বার্তার সিমেট্রিক অথেনটিকেশন। সমর্থিত হ্যাশ ফাংশন: SHA-256, SHA-384, SHA-512। HMAC ডেটা অখণ্ডতা এবং প্রামাণিকতা পরীক্ষার জন্য ব্যবহৃত হয়, যেমন, webhook অনুরোধ যাচাই বা কনফিগারেশন অখণ্ডতা পরীক্ষার জন্য।
সব অ্যালগরিদম KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true)-এর মাধ্যমে বায়োমেট্রিক অথেনটিকেশনের সাথে বাঁধা যেতে পারে। Android 11+-এ setUserAuthenticationParameters() ফ্ল্যাগ উপলব্ধ যা টাইমআউট (সেকেন্ডে) নির্দিষ্ট করে, যার সময় কী বায়োমেট্রিক অথেনটিকেশনের পরে পুনরায় অনুরোধ ছাড়া উপলব্ধ থাকে।
Android Keystore-এর সাথে Kotlin-এ ব্যবহারিক উদাহরণ দেখুন: AES কী জেনারেশন, ডেটা এনক্রিপশন এবং স্বাক্ষরের জন্য অ্যাসিমেট্রিক জোড়া তৈরি করা।
উদাহরণ বায়োমেট্রিক অথেনটিকেশনের সাথে বাঁধা 256-বিট AES/GCM কী তৈরি করে। কী getEncoded()-এর মাধ্যমে এক্সপোর্টের জন্য অনুপলব্ধ।
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyStore
private val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
fun generateAesKey(alias: String) {
val spec = KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_ENCRYPT or
KeyProperties.PURPOSE_DECRYPT
)
.setKeySize(256)
.setBlockModes(KeyProperties.KEY_BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setUserAuthenticationRequired(true)
.setInvalidatedByBiometricEnrollment(true)
.build()
val generator = KeyGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_AES,
"AndroidKeyStore"
)
generator.init(spec)
generator.generateKey()
}
উদাহরণ Android Keystore থেকে কী ব্যবহার করে ডেটা এনক্রিপ্ট করে। Cipher উপনাম থেকে কী পায়, AES/GCM এনক্রিপশন শুরু করে এবং IV-সহ এনক্রিপ্টেড ডেটা রিটার্ন করে।
fun encryptData(alias: String, plaintext: ByteArray): ByteArray {
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val secretKey = keyStore.getKey(alias, null) as SecretKey
cipher.init(Cipher.ENCRYPT_MODE, secretKey)
val iv = cipher.getIV()
val encrypted = cipher.doFinal(plaintext)
// IV + এনক্রিপ্টেড ডেটা
return iv + encrypted
}
fun decryptData(alias: String, ciphertextWithIv: ByteArray): ByteArray {
val iv = ciphertextWithIv.copyOfRange(0, 12)
val encrypted = ciphertextWithIv.copyOfRange(12, ciphertextWithIv.size)
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val secretKey = keyStore.getKey(alias, null) as SecretKey
val spec = GCMParameterSpec(128, iv)
cipher.init(Cipher.DECRYPT_MODE, secretKey, spec)
return cipher.doFinal(encrypted)
}
উদাহরণ Keystore-এ StrongBox-এর সাথে বাঁধা RSA-2048 কী জোড়া তৈরি করে। প্রাইভেট কী স্বাক্ষরের জন্য ব্যবহৃত হয়, পাবলিক কী getEncoded()-এর মাধ্যমে এক্সপোর্ট করা যেতে পারে।
fun generateRsaKeyPair(alias: String) {
val spec = KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_SIGN or
KeyProperties.PURPOSE_VERIFY
)
.setKeySize(2048)
.setSignaturePaddings(
KeyProperties.SIGNATURE_PADDING_RSA_PKCS1
)
.setDigests(KeyProperties.DIGEST_SHA256)
.setIsStrongBoxBacked(true)
.build()
val pair = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
).apply { init(spec) }
.generateKeyPair()
// পাবলিক কী এক্সপোর্ট করা যেতে পারে
val publicKey = pair.public // X509EncodedKeySpec
}
Android Keystore-এর কার্যকর ব্যবহার নিয়ম মেনে চলা প্রয়োজন যা পারফরম্যান্স বজায় রেখে সর্বোচ্চ সুরক্ষা নিশ্চিত করে।
KeyGenParameterSpec ন্যূনতম প্রয়োজনীয় প্যারামিটার দিয়ে ব্যবহার করুন: শুধুমাত্র সেই purpose, block modes এবং paddings নির্দিষ্ট করুন যা প্রকৃতপক্ষে ব্যবহৃত হয়। অতিরিক্ত প্যারামিটার (যেমন, শুধুমাত্র স্বাক্ষরের জন্য ব্যবহৃত কী-র জন্য PURPOSE_ENCRYPT) অপ্রয়োজনীয় আক্রমণ ভেক্টর তৈরি করে। Android স্বাক্ষরের জন্য ডাইজেস্ট স্পষ্টভাবে নির্দিষ্ট করার পরামর্শ দেয় — SHA256 ন্যূনতম গ্রহণযোগ্য স্তর (SHA1 পুরানো হয়েছে)।
গুরুত্বপূর্ণ অপারেশনের জন্য বায়োমেট্রিক্সের সাথে কী বাঁধুন: setUserAuthenticationRequired(true) গ্যারান্টি দেয় যে কী শুধুমাত্র বায়োমেট্রিক অথেনটিকেশনের পর ব্যবহার করা যাবে। Android 11+-এ একটি সেশনের মধ্যে প্রতিটি অপারেশনের জন্য বায়োমেট্রিক্স অনুরোধ না করতে টাইমআউট (প্রস্তাবিত 30–60 সেকেন্ড) সহ setUserAuthenticationParameters() ব্যবহার করুন। setInvalidatedByBiometricEnrollment(true) নতুন ফিঙ্গারপ্রিন্ট বা মুখ যোগ করলে স্বয়ংক্রিয়ভাবে কী সরিয়ে দেয় — এটি পুরানো বায়োমেট্রিক ডেটার মাধ্যমে অ্যাক্সেস প্রতিরোধ করে।
ইনিশিয়ালাইজেশন পর্যায়ে সুরক্ষা স্তর পরীক্ষা করুন: SECURITY_LEVEL নির্ধারণ করতে KeyStore.getKeyCharacteristics() ব্যবহার করুন। যদি ডিভাইস শুধুমাত্র সফটওয়্যার Keystore (SECURITY_LEVEL_SOFTWARE) সাপোর্ট করে, সিদ্ধান্ত নিন: হয় কার্যকারিতা প্রত্যাখ্যান করুন বা অতিরিক্ত এনক্রিপশন (যেমন, ইউজার পাসওয়ার্ডের মাধ্যমে কী র্যাপিং) ব্যবহার করুন। StrongBox-এর উপর নির্ভর করবেন না যদি এটি গ্যারান্টিড না হয় — সর্বদা setIsStrongBoxBacked(true) ফ্ল্যাগ নির্দিষ্ট করুন এবং getKeyCharacteristics-এর মাধ্যমে ফলাফল পরীক্ষা করুন।
নির্ধারিত সময়সূচিতে কী আপডেট করুন: ক্রিপ্টোগ্রাফিক কীগুলির প্রস্তাবিত জীবনকাল থাকে। NIST SP 800-57 AES কী প্রতি 1–2 বছরে, RSA/EC জোড়া প্রতি 2–3 বছরে পরিবর্তনের পরামর্শ দেয়। কী রোটেশন মেকানিজম প্রয়োগ করুন: অ্যাপ লঞ্চে কী তৈরির তারিখ (KeyGenParameterSpec.Builder.setKeyValidityStart/End) পরীক্ষা করুন এবং মেয়াদ শেষে নতুন কী জেনারেট করুন। পুরানো কী দিয়ে এনক্রিপ্ট করা পুরানো ডেটা ডিক্রিপ্ট এবং নতুন কী দিয়ে পুনরায় এনক্রিপ্ট করতে হবে।
বড় ডেটার জন্য Keystore ব্যবহার করবেন না: Keystore কী সংরক্ষণের (কয়েকশ বাইট) জন্য, বড় ফাইল এনক্রিপ্ট করার জন্য নয়। ডেটা এনক্রিপশনের জন্য স্কিম ব্যবহার করুন: একটি র্যান্ডম AES কী (DEK — Data Encryption Key) জেনারেট করুন, ডেটা এই কী দিয়ে এনক্রিপ্ট করুন এবং DEK-কে Keystore কী (KEK — Key Encryption Key) দিয়ে এনক্রিপ্ট করুন। Android EncryptedSharedPreferences এই একই স্কিম ব্যবহার করে: মাস্টার কী Keystore-এ, ডেটা — AES-256 GCM।
সচরাচর জিজ্ঞাসিত প্রশ্ন
না, Android Keystore এমনভাবে ডিজাইন করা হয়েছে যে প্রাইভেট কী কখনো TEE বা StrongBox ছেড়ে যায় না। Keystore-এ তৈরি কীগুলির জন্য getEncoded() মেথড null রিটার্ন করে। কী শুধুমাত্র Cipher, Signature বা Mac API-এর মাধ্যমে ব্যবহার করা যেতে পারে — কাঁচা মেটেরিয়াল উপলব্ধ নয়।
TEE (TrustZone) — একই প্রসেসরে ভার্চুয়াল আইসোলেশন, সময় বিভাজন ব্যবহার করে। StrongBox — নিজস্ব CPU এবং মেমোরি সহ আলাদা চিপ। StrongBox বেশি নিরাপদ (Common Criteria EAL 4+), কিন্তু ধীর এবং কম অ্যালগরিদম সাপোর্ট করে। TEE ঘন ঘন অপারেশনের জন্য উপযুক্ত, StrongBox — গুরুত্বপূর্ণ কীগুলির জন্য।
setIsStrongBoxBacked(true) ফ্ল্যাগ সহ কী জেনারেশনের পরে KeyStore.getKeyCharacteristics() ব্যবহার করুন। SECURITY_LEVEL_STRONGBOX অ্যাট্রিবিউট হার্ডওয়্যার সাপোর্ট নিশ্চিত করে। যদি ডিভাইস StrongBox সাপোর্ট না করে, Keystore ত্রুটি ছাড়াই TEE-তে সুইচ করে — সুরক্ষা স্তর স্পষ্টভাবে পরীক্ষা করা প্রয়োজন।
Keystore-এ কীগুলি ডিভাইস থেকে অ্যাপ মুছে ফেলার সময় স্বয়ংক্রিয়ভাবে মুছে যায়। Android 10+-এ কীগুলি থাকতে পারে যদি অ্যাপের ম্যানিফেস্টে allowBackup=true ফ্ল্যাগ থাকে, কিন্তু পুনরায় ইনস্টলের পরে সেগুলি অনুপলব্ধ হবে। ক্লিন ইনস্টলে কী পুনরায় জেনারেট করার পরামর্শ দেওয়া হয়।
না, Android Keystore নির্দিষ্ট ডিভাইসের হার্ডওয়্যারের সাথে আবদ্ধ। একটি ডিভাইসের TEE-তে জেনারেট করা কী অন্য ডিভাইসে স্থানান্তর করা যায় না। ক্রস-প্ল্যাটফর্ম এনক্রিপশনের জন্য স্কিম ব্যবহার করুন: Keystore ডিভাইসে কী রক্ষা করে, এবং সেশন কীগুলি অ্যাসিমেট্রিক এনক্রিপশন ব্যবহার করে সুরক্ষিত API-এর মাধ্যমে প্রেরিত হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন