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