KeyStore (Android) হল Java Cryptography Architecture (JCA) ক্রিপ্টোগ্রাফিক প্রদানকারীর একটি বাস্তবায়ন যা হার্ডওয়্যার বিচ্ছিন্নতা ক্ষমতা সহ নিরাপদ কী স্টোরেজের জন্য Android-এ একীভূত। Android 4.3 (API 18) থেকে, KeyStore Keymaster HAL-এর মাধ্যমে হার্ডওয়্যার কী সমর্থন করে, এবং Android 9 (API 28) থেকে, ডেডিকেটেড Secure Element-এ কী-গুলির জন্য StrongBox Keymaster সমর্থন করে। Android সুরক্ষা ডকুমেন্টেশন অনুসারে, “AndroidKeyStore” প্রদানকারী স্ট্যান্ডার্ড Bouncy Castle বা OpenSSL KeyStore প্রতিস্থাপন করে, অননুমোদিত কী নিষ্কাশনের বিরুদ্ধে সিস্টেম-স্তরের সুরক্ষা প্রদান করে।
মূল পয়েন্ট
Android-এ KeyStore কোনো পৃথক অ্যাপ্লিকেশন বা ফাইল নয়, বরং একটি ক্রিপ্টোগ্রাফিক প্রদানকারী যা java.security.KeyStore ইন্টারফেস বাস্তবায়ন করে। এটি প্রাইভেট কী, সিমেট্রিক কী এবং বিশ্বস্ত CA সার্টিফিকেট সংরক্ষণ ও ব্যবহারের জন্য একটি ইউনিফাইড API প্রদান করে। প্রদানকারীটি “AndroidKeyStore” নামে নিবন্ধিত এবং স্ট্যান্ডার্ড KeyStore.getInstance() এর মাধ্যমে অ্যাক্সেসযোগ্য।
Android 4.3-এর আগে, ক্রিপ্টোগ্রাফিক অপারেশন Bouncy Castle-এর মাধ্যমে সম্পাদিত হত। Android 4.3 Keymaster HAL 1.0 চালু করে, যা ARM TrustZone-এ TEE ব্যবহার সক্ষম করে। Android 6.0 (API 23) হার্ডওয়্যার-সমর্থিত ফিঙ্গারপ্রিন্ট প্রমাণীকরণ সহ Keymaster 2.0 যোগ করে। Android 9 (API 28) ডেডিকেটেড Secure Element-এর জন্য Keymaster 4.0 এবং StrongBox Keymaster চালু করে।
Keymaster-এর প্রতিটি সংস্করণ নতুন ক্ষমতা যোগ করে এবং কী বিচ্ছিন্নতা উন্নত করে। আধুনিক ডিভাইসগুলিকে (2022+) Google Mobile Services সার্টিফিকেশনের জন্য Keymaster 4.0 সমর্থন করতে হবে, যা সমস্ত Android অ্যাপ্লিকেশনের জন্য TEE প্রাপ্যতা নিশ্চিত করে।
Android KeyStore তিনটি স্তর নিয়ে গঠিত: Java API (KeyStore, KeyPairGenerator), সিস্টেম প্রক্রিয়া keystore (C++, সিস্টেম সার্ভিস হিসাবে চলে), এবং Keymaster HAL (TEE বা Secure Element-এ লাইব্রেরি)। অ্যাপ্লিকেশন API কল করে, keystore সার্ভিস অনুরোধটি Keymaster-এ রুট করে এবং অপারেশনটি নিরাপদ পরিবেশে সম্পাদিত হয়।
সমস্ত প্রাইভেট কী TEE-তে সংরক্ষিত থাকে এবং ব্যবহারকারী স্পেস থেকে পড়া যায় না। এমনকি সিস্টেম keystore সার্ভিসেরও র কী-তে অ্যাক্সেস নেই — শুধুমাত্র Keymaster-এর ভিতরে কী-গুলি নির্দেশকারী হ্যান্ডেলগুলিতে।
Android KeyStore স্ট্যান্ডার্ড JCA সার্ভিস প্রদানকারী ইন্টারফেস বাস্তবায়ন করে। যখন কোনো অ্যাপ্লিকেশন Cipher.getInstance(“RSA/ECB/PKCS1Padding”, “AndroidKeyStore”) কল করে, Android সুরক্ষা প্রদানকারী চেইনের মাধ্যমে অপারেশনটি Keymaster-এ ডেলিগেট করে: Java → JNI → keystore সার্ভিস → Keymaster HAL।
AndroidKeyStore প্রদানকারী প্রক্রিয়া শুরু হলে স্বয়ংক্রিয়ভাবে নিবন্ধিত হয়। এর অগ্রাধিকার Bouncy Castle বা Conscrypt-এর চেয়ে বেশি। তাই প্রদানকারী উল্লেখ না করে KeyStore.getInstance() কল করলে অধিকাংশ ক্ষেত্রে AndroidKeyStore ফিরে আসে। স্পষ্ট আহ্বানের জন্য, KeyStore.getInstance(“AndroidKeyStore”) ব্যবহার করুন।
প্রত্যেক Android অ্যাপ্লিকেশনের KeyStore-এ একটি পৃথক কন্টেইনার থাকে। একই UID (shared userId) বিশিষ্ট অ্যাপ্লিকেশনগুলি নির্দিষ্ট কী-তে ভাগ করা অ্যাক্সেস রাখতে পারে, কিন্তু স্ট্যান্ডার্ড সেটআপ নিশ্চিত করে যে অ্যাপ্লিকেশন A অ্যাপ্লিকেশন B-এর কী পড়তে পারে না।
load(null) — KeyStore আরম্ভকরণ। প্যারামিটার সর্বদা AndroidKeyStore-এর জন্য null। setEntry — নির্দিষ্ট KeyProtection (উদ্দেশ্য, digest, padding) সহ কী সংরক্ষণ করে। getEntry — KeyStore.PrivateKeyEntry, SecretKeyEntry বা TrustedCertificateEntry পুনরুদ্ধার করে। containsAlias — কী বিদ্যমান কিনা পরীক্ষা করে। deleteEntry — কী স্থায়ীভাবে মুছে ফেলে।
import java.security.KeyStore
import java.security.KeyPairGenerator
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
object KeyStoreManager {
private val keyStore by lazy {
KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
}
fun createRsaKey(alias: String) {
val spec = KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
).setKeySize(2048)
.setDigests(KeyProperties.DIGEST_SHA256)
.setSignaturePaddings(KeyProperties.SIGN_PADDING_RSA_PKCS1)
.build()
val kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
kpg.initialize(spec)
kpg.generateKeyPair()
}
}
Android KeyStore ক্রিপ্টোগ্রাফিক অ্যালগোরিদমের একটি বিস্তৃত সেট সমর্থন করে, যা ডিভাইসে Keymaster HAL সংস্করণের উপর নির্ভর করে পরিবর্তিত হয়। ডেভেলপার তৈরি করার চেষ্টা করার সময় KeyGenParameterSpec.Builder-এর মাধ্যমে সমর্থিত অ্যালগোরিদমের তালিকা পেতে পারেন — অসামঞ্জস্যপূর্ণ প্যারামিটার InvalidAlgorithmParameterException নিক্ষেপ করে।
RSA (1024–4096 বিট) — স্বাক্ষর (SHA-1/SHA-256/SHA-384/SHA-512 সহ PKCS1, PSS) এবং এনক্রিপশন (SHA-1/SHA-256 সহ OAEP) এর জন্য। EC (P-224, P-256, P-384, P-521) — ECDSA স্বাক্ষর এবং ECDH কী চুক্তির জন্য। X25519 এবং Ed25519 — Android 12 (API 31) থেকে আধুনিক ক্রিপ্টোগ্রাফিক প্রোটোকলের জন্য।
অসমমিত কী-গুলির জন্য, সর্বদা Keymaster-এর ভিতরে জেনারেট করুন, কখনও প্রাইভেট কী আমদানি করবেন না। আমদানি করা প্রাইভেট কীগুলি হার্ডওয়্যার-সুরক্ষিত নয় — এগুলি সফ্টওয়্যার স্তরে সংরক্ষিত থাকে এবং অ্যাপ্লিকেশন প্রক্রিয়া আপোস করা হলে দুর্বল হয়।
AES (128, 256 বিট) — CBC, CTR, GCM মোডে সমমিত এনক্রিপশনের জন্য। HMAC (SHA-1, SHA-256, SHA-512) — বার্তা প্রমাণীকরণের জন্য। ChaCha20 (Android 12+) — Poly1305 প্রমাণীকরণ সহ উচ্চ-কর্মক্ষমতা স্ট্রিম এনক্রিপশনের জন্য।
| অ্যালগোরিদম | Keymaster | উদ্দেশ্য | API |
|---|---|---|---|
| RSA | KM 1.0+ | স্বাক্ষর, এনক্রিপশন | 18+ |
| EC | KM 1.0+ | ECDSA, ECDH | 18+ |
| AES | KM 2.0+ | সমমিত এনক্রিপশন | 23+ |
| HMAC | KM 2.0+ | প্রমাণীকরণ কোড | 23+ |
| ChaCha20 | KM 3.0+ | স্ট্রিম এনক্রিপশন | 31+ |
| X25519/Ed25519 | KM 3.0+ | কী বিনিময় | 31+ |
KeyStore.PrivateKeyEntry — একটি প্রাইভেট কী (রপ্তানি অযোগ্য) এবং সার্টিফিকেট চেইন ধারণ করে। KeyStore.SecretKeyEntry — সমমিত কী-গুলির জন্য। KeyStore.TrustedCertificateEntry — বিশ্বস্ত CA সার্টিফিকেটের জন্য। পাবলিক কীগুলি keyStore.getCertificate(alias).publicKey এর মাধ্যমে রপ্তানি করা যায়।
আসুন একটি সম্পূর্ণ পরিস্থিতি দেখি: ডেটা এনক্রিপশনের জন্য AES কী তৈরি এবং বায়োমেট্রিক সুরক্ষা সহ স্বাক্ষরের জন্য EC কী তৈরি। উভয় কী Android KeyStore-এর ভিতরে হার্ডওয়্যার সমর্থন সহ তৈরি করা হয়।
একটি AES কী KeyGenParameterSpec সহ KeyGenerator-এর মাধ্যমে তৈরি করা হয়। প্যারামিটার: PURPOSE_ENCRYPT + PURPOSE_DECRYPT, BLOCK_MODE_GCM (প্রমাণীকরণ সহ প্রস্তাবিত মোড), ENCRYPTION_PADDING_NONE (GCM-এর জন্য padding প্রয়োজন নেই)।
import javax.crypto.KeyGenerator
import javax.crypto.Cipher
import javax.crypto.spec.GCMParameterSpec
fun generateAndEncrypt(alias: String, plainText: ByteArray): ByteArray {
val spec = KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
).setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.setKeySize(256)
.build()
val kg = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
kg.initialize(spec)
kg.generateKey()
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipher.init(Cipher.ENCRYPT_MODE, getKeyFromStore(alias))
return cipher.doFinal(plainText)
}
userAuthenticationRequired=true সহ একটি EC কী প্রতিটি স্বাক্ষর অপারেশনের আগে ব্যবহারকারী প্রমাণীকরণ প্রয়োজন। এর জন্য Signature অবজেক্ট ধারণকারী CryptoObject সহ BiometricPrompt ব্যবহার করা হয়। সফল বায়োমেট্রিক যাচাইয়ের পরে, Keymaster অপারেশন অনুমতি দেয়।
fun createBiometricSignKey(alias: String) {
val spec = KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_SIGN
).setAlgorithmParameterSpec(
ECGenParameterSpec("secp256r1")
).setDigests(KeyProperties.DIGEST_SHA256)
.setUserAuthenticationRequired(true)
.setInvalidatedByBiometricEnrollment(true)
.build()
val kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_EC,
"AndroidKeyStore"
)
kpg.initialize(spec)
kpg.generateKeyPair()
}
Android KeyStore হার্ডওয়্যার-স্তরের সুরক্ষা গ্যারান্টি প্রদান করে যা সফ্টওয়্যার-ভিত্তিক KeyStore (JKS, BKS) প্রদান করতে পারে না। কীগুলি SoC স্তরে সুরক্ষিত থাকে, এবং Android ব্যবহারকারী স্পেসে সম্পূর্ণ নিয়ন্ত্রণও প্রাইভেট কী নিষ্কাশনের অনুমতি দেয় না।
Key Attestation একটি প্রক্রিয়া যা অ্যাপ্লিকেশনকে (এবং সার্ভারকে) যাচাই করতে দেয় যে কী কোন পরিবেশে তৈরি হয়েছিল। Android Keystore একটি সার্টিফিকেট স্বাক্ষর করে যাতে কী বৈশিষ্ট্যের তালিকা থাকে: অ্যালগোরিদম, আকার, উদ্দেশ্য, হার্ডওয়্যার-সমর্থিত (True/False), উৎপত্তি (GENERATED, IMPORTED)। সার্ভার Google রুট সার্টিফিকেট পর্যন্ত সার্টিফিকেট চেইন যাচাই করে।
এটি আর্থিক অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ: সার্ভার প্রয়োজন করতে পারে যে কী হার্ডওয়্যার পরিবেশে (Hardware-Backed = True) তৈরি হয়েছে এবং সফ্টওয়্যার Keystore-এ তৈরি কী প্রত্যাখ্যান করতে পারে। Key Attestation আক্রমণ প্রতিরোধ করে যেখানে আক্রমণকারী Keystore-কে এমুলেটর দিয়ে প্রতিস্থাপন করে।
setInvalidatedByBiometricEnrollment(true) মানে বায়োমেট্রিক টেমপ্লেট পরিবর্তন বা সরানো হলে Keymaster স্বয়ংক্রিয়ভাবে কী মুছে ফেলবে। এটি আক্রমণ থেকে সুরক্ষা যেখানে আক্রমণকারী বিদ্যমান অ্যাকাউন্টে তার ফিঙ্গারপ্রিন্ট যোগ করে। নতুন ফিঙ্গারপ্রিন্ট যোগ করার পর, পুরানো কীগুলি অ্যাক্সেসযোগ্য হয়ে যায় না।
ব্যর্থ বায়োমেট্রিক প্রমাণীকরণ প্রচেষ্টার কাউন্টার Keymaster দ্বারা পরিচালিত হয়। maxBiometricAttempt (নির্মাতা দ্বারা কনফিগারযোগ্য, সাধারণত 5) পরে, Keymaster বায়োমেট্রিক কী সহ সমস্ত অপারেশন 30 সেকেন্ডের জন্য ব্লক করে। 10টি ব্যর্থ প্রচেষ্টার পরে — ডিভাইস পাসওয়ার্ড (গোপন PIN) প্রবেশ না করা পর্যন্ত।
সচরাচর জিজ্ঞাসা
Bouncy Castle (BKS) একটি সফ্টওয়্যার-ভিত্তিক KeyStore যা পাসওয়ার্ড-সুরক্ষিত ফাইলে কী সংরক্ষণ করে। Android KeyStore হার্ডওয়্যার বিচ্ছিন্নতা TEE/StrongBox ব্যবহার করে। BKS কী রুট অ্যাক্সেস দিয়ে নিষ্কাশন করা যায়, Android KeyStore-এর কী নয়। BKS CA সার্টিফিকেটের জন্য উপযুক্ত, Android KeyStore প্রাইভেট কী-গুলির জন্য।
হ্যাঁ, যদি আপনি তৈরি করার সময় PURPOSE_ENCRYPT বা PURPOSE_DECRYPT বা PURPOSE_SIGN বা PURPOSE_VERIFY নির্দিষ্ট করেন। তবে, সর্বোত্তম অনুশীলন হল বিভিন্ন অপারেশনের জন্য পৃথক কী তৈরি করা। এটি একটি কী আপোস হলে ক্ষতি সীমাবদ্ধ করে এবং ন্যূনতম সুবিধার নীতি অনুসরণ করে।
android.security.keystore-এর মাধ্যমে উপলব্ধ KeyStore.getKeyCharacteristics(alias) ব্যবহার করুন। পদ্ধতিটি ফ্ল্যাগের একটি সেট ফেরত দেয়: FLAG_HARDWARE — কী TEE-তে, FLAG_SECURE_ELEMENT — কী StrongBox-এ। কোনো ফ্ল্যাগ না থাকলে, কীটি কেবল সফ্টওয়্যার-ভিত্তিক।
setInvalidatedByBiometricEnrollment(true) দিয়ে তৈরি সমস্ত কী Keymaster দ্বারা স্বয়ংক্রিয়ভাবে অকার্যকর হয়ে যাবে। ব্যবহারের চেষ্টা করলে, অ্যাপ্লিকেশন KeyPermanentlyInvalidatedException পাবে। এই কী দিয়ে এনক্রিপ্ট করা ডেটা স্থায়ীভাবে হারিয়ে যাবে।
হার্ডওয়্যার কী (TEE/StrongBox-এ) ব্যাকআপ সমর্থন করে না — এগুলি একটি নির্দিষ্ট ডিভাইসের সাথে আবদ্ধ। সফ্টওয়্যার-ভিত্তিক কী Google Drive ব্যাকআপে অন্তর্ভুক্ত করা যেতে পারে। ডিভাইসের মধ্যে ডেটা স্থানান্তর করতে, সার্ভারে ডেটা এনক্রিপ্ট করুন এবং নতুন ডিভাইসে ডিক্রিপ্ট করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন