Keystore (Android): یہ کیا ہے، فن تعمیر اور کام کے اصول

مصنف: IT Sectr اشاعت: 2026-03-14 مطالعے کا وقت: 10 منٹ

Android Keystore Android میں ایک نظامی میکانزم ہے جو خفیہ نگاری کی کنجیوں کو ہارڈویئر علیحدگی میں محفوظ طریقے سے ذخیرہ کرنے کے لیے ہے۔ نظام ARM TrustZone والے آلات پر Trusted Execution Environment (TEE) یا چپ کی سطح پر کنجیوں کے تحفظ کے لیے وقف کردہ Secure Element استعمال کرتا ہے۔ Android Open Source Project کے مطابق، Keystore محفوظ ماحول میں براہ راست کلید تخلیق کے ساتھ RSA، EC، AES اور HMAC الگورتھم کو سپورٹ کرتا ہے۔

اہم نکات

  • Android Keystore ایک KeyStore فراہم کنندہ ہے جو خفیہ نگاری کی کنجیوں کو Android صارف کی جگہ سے الگ کرتا ہے
  • کنجیاں TEE یا Secure Element کے اندر تخلیق ہوتی ہیں اور سادہ متن میں کبھی محفوظ ماحول نہیں چھوڑتیں
  • Android 9+ پیرامیٹرز کے ساتھ KeyGenParameterSpec.Builder شامل کرتا ہے: purpose، digest، padding، userAuthenticationRequired
  • بایومیٹرک کلید کے تحفظ کے لیے ہر آپریشن سے پہلے BiometricPrompt کے ذریعے صارف کی تصدیق درکار ہے
  • Keymaster HAL ایک ہارڈویئر تجریدی پرت ہے جو TEE یا Secure Element میں خفیہ نگاری کے آپریشنز کو نافذ کرتی ہے

Android Keystore کیا ہے؟

Android Keystore Android میں API 1 (Android 1.0) سے نافذ کردہ ایک خفیہ نگاری فراہم کنندہ ہے، لیکن مکمل ہارڈویئر سپورٹ Android 4.3 (API 18) سے ظاہر ہوا۔ Keystore نجی کنجیوں کے محفوظ ذخیرہ کے مسئلے کو حل کرتا ہے تاکہ آپریٹنگ سسٹم سے سمجھوتہ ہونے پر بھی حملہ آور سادہ متن میں کنجیاں نکال نہ سکے۔

Android پر KeyStore کا فن تعمیر

Android Keystore کا فن تعمیر تین سطحوں پر مشتمل ہے: ایپلیکیشن API (java.security.KeyStore)، نظام خدمت (keystore daemon)، اور ہارڈویئر سطح (Keymaster HAL)۔ ایپلیکیشن معیاری Java Cryptography Architecture (JCA) API کے ذریعے رسائی حاصل کرتی ہے، اور نظام خدمت TEE میں چلنے والے Keymaster کو درخواستیں روٹ کرتی ہے۔

کنجیوں کے ساتھ تمام خفیہ نگاری کے آپریشنز (دستخط، توڑنا) TEE یا Secure Element کے اندر انجام پاتے ہیں۔ کنجیاں کبھی محفوظ ماحول نہیں چھوڑتیں — ایپلیکیشن کو کلید کے حوالے کے لیے صرف ایک ہینڈل (عرف) ملتا ہے۔ یہ سافٹ ویئر KeyStores سے بنیادی فرق ہے، جہاں کنجیاں ممکنہ طور پر عمل کی یادداشت میں قابل رسائی ہوتی ہیں۔

Java KeyStore سے فرق

معیاری JKS (Java KeyStore) یا BKS (Bouncy Castle) پاس ورڈ سے محفوظ فائلوں میں کنجیاں ذخیرہ کرتے ہیں۔ Android Keystore کنجیوں کو ہارڈویئر علیحدگی میں ذخیرہ کرتا ہے، جہاں وہ روٹ صارف سے بھی محفوظ ہیں۔ JKS براہ راست فائل سسٹم تک رسائی کے لیے کمزور ہے؛ Android Keystore نہیں ہے۔

ایک اور فرق: Android Keystore میں، کنجیوں کے استعمال کے سخت پیرامیٹرز (purpose — صرف sign/verify/encrypt/decrypt) تخلیق کے وقت متعین ہوتے ہیں۔ بعد میں تبدیل نہیں کیے جا سکتے، جو کلید کے غلط استعمال کو روکتا ہے۔

Android Keystore کیسے کام کرتا ہے؟

نئی کلید بناتے وقت، ایپلیکیشن 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 کے اندر موجود ہے۔

kotlin
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 واپس کرتا ہے۔

kotlin
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 کی درخواست کرتا ہے
}

KeyStore ذخیرہ کی اقسام

Android دو کلید ذخیرہ طریقوں کو سپورٹ کرتا ہے: سافٹ ویئر (TEE کے بغیر آلات پر) اور ہارڈویئر (TEE یا Secure Element والے آلات پر)۔ طریقہ SoC کی صلاحیتوں اور Android ورژن پر منحصر ہے۔

سافٹ ویئر KeyStore (صرف سافٹ ویئر)

Trusted Execution Environment کے بغیر آلات پر (Android 4.3 سے پہلے یا سستے SoCs)، کنجیاں لاک اسکرین پاس ورڈ سے حاصل کردہ ماسٹر کلید کا استعمال کرتے ہوئے خفیہ کردہ ذخیرہ کی جاتی ہیں۔ یہ طریقہ کم محفوظ ہے — خفیہ نگاری کے آپریشنز کے دوران کنجیاں عمل کی یادداشت میں قابل رسائی ہوتی ہیں۔

تحفظ کی سطح AES-256-GCM کے ساتھ KeyStore فائل کی خفیہ کاری پر مبنی ہے۔ خفیہ کاری کی کلید صارف کے پاس ورڈ یا PIN سے Scrypt (زیادہ تکرار کی تعداد کے ساتھ PBKDF2) کے ذریعے تخلیق ہوتی ہے۔

ہارڈویئر KeyMaster (TEE/Secure Element)

جدید آلات پر، 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 3TEE (TrustZone)اعلیAPI 23+
Keymaster 4TEE + Secure I/Oبہت اعلیAPI 28+
StrongBoxہارڈویئر Secure Elementزیادہ سے زیادہAPI 28+، اختیاری

KeyStore API کے ساتھ کام کرنا

Android Keystore Java Cryptography Architecture (JCA) میں ضم ہے۔ فراہم کنندہ تک رسائی کے لیے معیاری KeyStore.getInstance("AndroidKeyStore") استعمال ہوتا ہے۔ API API 18 سے دستیاب ہے۔

KeyStore بنانا اور لوڈ کرنا

KeyStore.load(null) طریقہ ایپلیکیشن کا KeyStore کنٹینر لوڈ کرتا ہے۔ پاس ورڈ کی ضرورت نہیں — Android رسائی کنٹرول کے لیے ایپلیکیشن کا سیاق و سباق اور اس کا UID استعمال کرتا ہے۔ ہر ایپلیکیشن صرف اپنی اندراجات دیکھتی ہے جب تک کہ مشترکہ UID استعمال نہ کیا جائے۔

setEntry اور getEntry طریقے KeyStore.PrivateKeyEntry، SecretKeyEntry یا TrustedCertificateEntry کے ساتھ کام کرتے ہیں۔ ProtectionParameter پیرامیٹر Android Keystore کے لیے ہمیشہ null ہے (تحفظ نظام کی سطح پر نافذ ہے)۔

kotlin
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 کلید کی خصوصیات (ہارڈویئر/سافٹ ویئر، الگورتھم، مقاصد) کے بارے میں معلومات کے ساتھ ایک سرٹیفکیٹ پر دستخط کرتا ہے۔ سرور اس سرٹیفکیٹ کی تصدیق کر سکتا ہے کہ کلید ایک قابل اعتماد ماحول میں بنائی گئی تھی۔

اکثر پوچھے گئے سوالات

Android Keystore اور Java KeyStore میں کیا فرق ہے؟

Java KeyStore کنجیوں کو پاس ورڈ سے محفوظ فائل (JKS، BKS) میں ذخیرہ کرتا ہے۔ Android Keystore TEE یا Secure Element کے ذریعے ہارڈویئر علیحدگی استعمال کرتا ہے۔ Java KeyStore روٹ رسائی کے لیے کمزور ہے؛ Android Keystore نہیں، کیونکہ نجی کنجیاں کبھی محفوظ ماحول نہیں چھوڑتیں۔

کیا میں موجودہ کلید Android Keystore میں درآمد کر سکتا ہوں؟

ہاں، KeyProtection کے ساتھ KeyStore.setEntry کے ذریعے۔ تاہم، درآمد شدہ کلید میں ہارڈویئر تحفظ نہیں ہوگا — یہ ماسٹر کلید سے خفیہ کردہ سافٹ ویئر Keystore میں ذخیرہ ہوگی۔ زیادہ سے زیادہ تحفظ کے لیے، ہمیشہ Keystore کے اندر کنجیاں تخلیق کریں۔

کیسے جانچیں کہ آلہ ہارڈویئر KeyStore کو سپورٹ کرتا ہے؟

KeyChain.isBoundKeyAlgorithm استعمال کریں یا کلید تخلیق کے بعد KeyCharacteristics جانچیں۔ خصوصیات میں FLAG_HARDWARE کی موجودگی کا مطلب ہے کہ کلید TEE میں بنائی گئی تھی۔ آپ android.security.keystore.isHardwareBacked() بھی جانچ سکتے ہیں۔

ایپلیکیشن ان انسٹال ہونے پر کنجیوں کا کیا ہوتا ہے؟

جب ایپلیکیشن ان انسٹال ہوتی ہے، Android Keystore سے اس کی تمام کنجیاں ہٹا دیتا ہے۔ ڈیٹا ناقابل واپسی طور پر ضائع ہو جاتا ہے۔ دوبارہ انسٹال کرنے پر، ایپلیکیشن کو نئی کنجیاں تخلیق کرنی ہوں گی۔ TEE کے ذریعے کلید بیک اپ آرکیٹیکچرل وجوہات کی بنا پر ناممکن ہے۔

KeyStore ڈیبگنگ حملوں سے کیسے بچاتا ہے؟

مقفل آلے پر، Keymaster کوئی آپریشن نہیں کرتا۔ userAuthenticationRequired=true والی کنجیوں کو ہر بار بایومیٹرک تصدیق درکار ہوتی ہے۔ روٹ رسائی کے باوجود، حملہ آور براہ راست Keymaster کو کال نہیں کر سکتا — صرف Android Keystore سروس کے ذریعے۔

خلاصہ

  • Android Keystore TEE یا Secure Element کے ذریعے ہارڈویئر کلید علیحدگی کے ساتھ ایک JCA خفیہ نگاری فراہم کنندہ ہے
  • کنجیاں TrustZone کے اندر تخلیق ہوتی ہیں اور سادہ متن میں کبھی محفوظ ماحول نہیں چھوڑتیں
  • KeyGenParameterSpec کلید کے پیرامیٹرز متعین کرتا ہے: purpose، digest، padding، userAuthenticationRequired، keyValidity
  • Keymaster HAL تین سطحوں کو نافذ کرتا ہے: سافٹ ویئر، TEE (Keymaster 3/4)، اور StrongBox (ہارڈویئر Secure Element)
  • بایومیٹرک کلید تحفظ setUserAuthenticationRequired اور CryptoObject کے ساتھ BiometricPrompt کے ذریعے فراہم کیا جاتا ہے
  • Key Attestation (API 28+) سرور سائیڈ تصدیق کی اجازت دیتا ہے کہ کلید ہارڈویئر ماحول میں بنائی گئی تھی
  • Android ایپلیکیشنز میں دستخط، خفیہ کاری اور تصدیق کے لیے نجی کنجیاں ذخیرہ کرنے کے لیے Android Keystore استعمال کریں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں