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 कुंजियों को हार्डवेयर आइसोलेशन में संग्रहीत करता है, जहाँ वे root उपयोगकर्ता से भी सुरक्षित हैं। 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

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

यह भी पढ़ें