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) ने Keymaster 4.0 और समर्पित Secure Element के लिए 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 बिट) — हस्ताक्षर (PKCS1, PSS SHA-1/SHA-256/SHA-384/SHA-512 के साथ) और एन्क्रिप्शन (OAEP SHA-1/SHA-256 के साथ) के लिए। 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें