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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں