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