KeyStore (Android): کلیدی تصورات، API اور کرپٹوگرافک اسٹوریج کا کام

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

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 TEE، StrongBox اور بائیومیٹرک تحفظ کے ساتھ کلید اسٹوریج کے لیے JCA فراہم کنندہ ہے
  • KeyGenParameterSpec کلید بناتے وقت الگورتھم، مقصد، digest، padding اور بائیومیٹرکس کی وضاحت کرتا ہے
  • Keymaster HAL Software، TEE اور StrongBox کی سطحوں پر ہارڈویئر کرپٹوگرافک آپریشنز کو نافذ کرتا ہے
  • Key Attestation (API 28+) سرور کو تصدیق کرنے دیتا ہے کہ کلید Android KeyStore کے ہارڈویئر ماحول میں بنائی گئی تھی
  • کلید کا عرفی نام ایک سٹرنگ ہے جس کے ذریعے ایپلیکیشن Keystore میں کلید تک رسائی حاصل کرتی ہے؛ ایک عرفی نام ایک کلید سے مطابقت رکھتا ہے

Android میں KeyStore کیا ہے؟

Android میں KeyStore کوئی علیحدہ ایپلیکیشن یا فائل نہیں ہے، بلکہ ایک کرپٹوگرافک فراہم کنندہ ہے جو java.security.KeyStore انٹرفیس کو نافذ کرتا ہے۔ یہ نجی کلیدوں، ہم آہنگ کلیدوں اور قابل اعتماد CA سرٹیفکیٹس کو ذخیرہ کرنے اور استعمال کرنے کے لیے ایک متحد API فراہم کرتا ہے۔ فراہم کنندہ “AndroidKeyStore” نام سے رجسٹرڈ ہے اور معیاری KeyStore.getInstance() کے ذریعے قابل رسائی ہے۔

Android KeyStore کا ارتقا

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 کے اندر کلیدوں کی طرف اشارہ کرتے ہیں۔

KeyStore کرپٹوگرافک فراہم کنندہ کے طور پر کیسے کام کرتا ہے؟

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 کی کلیدیں نہیں پڑھ سکتی۔

KeyStore کے طریقے اور ان کی خصوصیات

load(null) — KeyStore کی ابتدا۔ AndroidKeyStore کے لیے پیرامیٹر ہمیشہ null ہوتا ہے۔ setEntry — مخصوص KeyProtection (مقاصد، digest، padding) کے ساتھ کلید محفوظ کرتا ہے۔ getEntry — KeyStore.PrivateKeyEntry، SecretKeyEntry یا TrustedCertificateEntry حاصل کرتا ہے۔ containsAlias — چیک کرتا ہے کہ کلید موجود ہے یا نہیں۔ deleteEntry — کلید کو مستقل طور پر حذف کرتا ہے۔

kotlin
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
RSAKM 1.0+دستخط، خفیہ کاری18+
ECKM 1.0+ECDSA, ECDH18+
AESKM 2.0+ہم آہنگ خفیہ کاری23+
HMACKM 2.0+تصدیقی کوڈ23+
ChaCha20KM 3.0+سٹریم خفیہ کاری31+
X25519/Ed25519KM 3.0+کلید کا تبادلہ31+

کلید کی اقسام اور ان کی سیریلائزیشن

KeyStore.PrivateKeyEntry — ایک نجی کلید (برآمد نہ کی جا سکنے والی) اور سرٹیفکیٹ چین پر مشتمل ہے۔ KeyStore.SecretKeyEntry — ہم آہنگ کلیدوں کے لیے۔ KeyStore.TrustedCertificateEntry — قابل اعتماد CA سرٹیفکیٹس کے لیے۔ عوامی کلیدیں keyStore.getCertificate(alias).publicKey کے ذریعے برآمد کی جا سکتی ہیں۔

کلید بنانے اور استعمال کی مثالیں

آئیے ایک مکمل منظر نامہ دیکھتے ہیں: ڈیٹا خفیہ کاری کے لیے AES کلید بنانا اور بائیومیٹرک تحفظ کے ساتھ دستخط کے لیے EC کلید بنانا۔ دونوں کلیدیں ہارڈویئر سپورٹ کے ساتھ Android KeyStore کے اندر بنائی جاتی ہیں۔

خفیہ کاری کے لیے AES کلید بنانا

ایک AES کلید KeyGenParameterSpec کے ساتھ KeyGenerator کے ذریعے بنائی جاتی ہے۔ پیرامیٹرز: PURPOSE_ENCRYPT + PURPOSE_DECRYPT, BLOCK_MODE_GCM (تصدیق کے ساتھ تجویز کردہ طریقہ), ENCRYPTION_PADDING_NONE (GCM کے لیے padding کی ضرورت نہیں)۔

kotlin
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 آپریشن کی اجازت دیتا ہے۔

kotlin
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()
}

KeyStore اور ڈیوائس سیکیورٹی

Android KeyStore ہارڈویئر سطح کی سیکیورٹی ضمانتیں فراہم کرتا ہے جو سافٹ ویئر پر مبنی KeyStore (JKS, BKS) فراہم نہیں کر سکتے۔ کلیدیں SoC سطح پر محفوظ ہوتی ہیں، اور Android صارف کی جگہ پر مکمل کنٹرول بھی نجی کلید نکالنے کی اجازت نہیں دیتا۔

Key Attestation (Android 8.1+)

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) درج کرنے تک۔

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

Android KeyStore اور Bouncy Castle KeyStore میں کیا فرق ہے؟

Bouncy Castle (BKS) ایک سافٹ ویئر پر مبنی KeyStore ہے جو کلیدوں کو پاس ورڈ سے محفوظ فائل میں محفوظ کرتا ہے۔ Android KeyStore ہارڈویئر تنہائی TEE/StrongBox استعمال کرتا ہے۔ BKS کلیدیں روٹ رسائی سے نکالی جا سکتی ہیں، Android KeyStore کی کلیدیں نہیں۔ BKS CA سرٹیفکیٹس کے لیے موزوں ہے، Android KeyStore نجی کلیدوں کے لیے۔

کیا ایک کلید کو خفیہ کاری اور دستخط دونوں کے لیے استعمال کیا جا سکتا ہے؟

ہاں، اگر آپ بناتے وقت PURPOSE_ENCRYPT یا PURPOSE_DECRYPT یا PURPOSE_SIGN یا PURPOSE_VERIFY بتاتے ہیں۔ تاہم، بہترین عمل مختلف آپریشنز کے لیے علیحدہ کلیدیں بنانا ہے۔ یہ ایک کلید سے سمجھوتہ ہونے پر نقصان کو محدود کرتا ہے اور کم سے کم مراعات کے اصول پر عمل کرتا ہے۔

Android KeyStore میں کیسے پتہ چلے کہ کلید ہارڈویئر سے تعاون یافتہ ہے؟

android.security.keystore کے ذریعے دستیاب KeyStore.getKeyCharacteristics(alias) استعمال کریں۔ یہ طریقہ جھنڈوں کا ایک سیٹ واپس کرتا ہے: FLAG_HARDWARE — TEE میں کلید، FLAG_SECURE_ELEMENT — StrongBox میں کلید۔ اگر کوئی جھنڈا نہیں ہے تو کلید صرف سافٹ ویئر ہے۔

جب تمام بائیومیٹرک ٹیمپلیٹس ہٹا دیے جائیں تو کیا ہوتا ہے؟

setInvalidatedByBiometricEnrollment(true) کے ساتھ بنائی گئی تمام کلیدیں Keymaster کے ذریعے خود بخود باطل کر دی جائیں گی۔ استعمال کرنے کی کوشش پر، ایپلیکیشن کو KeyPermanentlyInvalidatedException ملے گا۔ ان کلیدوں سے خفیہ کردہ ڈیٹا مستقل طور پر ضائع ہو جائے گا۔

کیا Android KeyStore کلید بیک اپ کو سپورٹ کرتا ہے؟

ہارڈویئر کلیدیں (TEE/StrongBox میں) بیک اپ کو سپورٹ نہیں کرتیں — وہ ایک مخصوص ڈیوائس سے منسلک ہوتی ہیں۔ سافٹ ویئر پر مبنی کلیدیں Google Drive بیک اپ میں شامل کی جا سکتی ہیں۔ ڈیوائسز کے درمیان ڈیٹا منتقل کرنے کے لیے، سرور پر ڈیٹا کو خفیہ کریں اور نئی ڈیوائس پر ڈکرپٹ کریں۔

خلاصہ

  • Android KeyStore — TEE/StrongBox میں Keymaster HAL کے ذریعے ہارڈویئر سے الگ تھلگ کلید اسٹوریج کے لیے JCA فراہم کنندہ
  • KeyGenParameterSpec الگورتھم، سائز، مقاصد، digest، بائیومیٹرکس اور کلید کی وقت پر مبنی پابندیاں ترتیب دیتا ہے
  • RSA (KM 1.0+), EC (KM 1.0+), AES (KM 2.0+), ChaCha20 (KM 3.0+) — مختلف Keymaster سطحوں کے ساتھ ممکنہ الگورتھم
  • Key Attestation (API 28+) سرور کی طرف کو کلید کے ہارڈویئر ماخذ کی تصدیق کرنے دیتا ہے
  • CryptoObject کے ساتھ setUserAuthenticationRequired + BiometricPrompt کے ذریعے بائیومیٹرک کلید تحفظ
  • بائیومیٹرک تبدیلی پر کلید کو باطل کرنا شامل کردہ فنگر پرنٹس کے غیر مجاز استعمال کو روکتا ہے
  • Android ایپلیکیشنز میں ہارڈویئر تحفظ کے ساتھ کرپٹوگرافک کلیدیں بنانے اور ذخیرہ کرنے کے لیے Android KeyStore استعمال کریں

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

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

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

مزید پڑھیں