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 कोई अलग एप्लिकेशन या फ़ाइल नहीं है, बल्कि एक क्रिप्टोग्राफ़िक प्रदाता है जो java.security.KeyStore इंटरफ़ेस को लागू करता है। यह निजी कुंजियों, सममित कुंजियों और विश्वसनीय CA प्रमाणपत्रों को संग्रहीत और उपयोग करने के लिए एक एकीकृत API प्रदान करता है। प्रदाता “AndroidKeyStore” नाम से पंजीकृत है और मानक KeyStore.getInstance() के माध्यम से सुलभ है।
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 के अंदर कुंजियों को इंगित करने वाले हैंडल तक।
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 की कुंजियाँ नहीं पढ़ सकता।
load(null) — KeyStore आरंभीकरण। पैरामीटर हमेशा AndroidKeyStore के लिए null होता है। setEntry — निर्दिष्ट KeyProtection (उद्देश्य, digest, padding) के साथ कुंजी सहेजता है। getEntry — KeyStore.PrivateKeyEntry, SecretKeyEntry या TrustedCertificateEntry प्राप्त करता है। containsAlias — जाँचता है कि कुंजी मौजूद है या नहीं। deleteEntry — कुंजी को स्थायी रूप से हटाता है।
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 |
|---|---|---|---|
| RSA | KM 1.0+ | हस्ताक्षर, एन्क्रिप्शन | 18+ |
| EC | KM 1.0+ | ECDSA, ECDH | 18+ |
| AES | KM 2.0+ | सममित एन्क्रिप्शन | 23+ |
| HMAC | KM 2.0+ | प्रमाणीकरण कोड | 23+ |
| ChaCha20 | KM 3.0+ | स्ट्रीम एन्क्रिप्शन | 31+ |
| X25519/Ed25519 | KM 3.0+ | कुंजी विनिमय | 31+ |
KeyStore.PrivateKeyEntry — इसमें निजी कुंजी (निर्यात योग्य नहीं) और प्रमाणपत्र श्रृंखला होती है। KeyStore.SecretKeyEntry — सममित कुंजियों के लिए। KeyStore.TrustedCertificateEntry — विश्वसनीय CA प्रमाणपत्रों के लिए। सार्वजनिक कुंजियाँ keyStore.getCertificate(alias).publicKey के माध्यम से निर्यात योग्य होती हैं।
आइए एक पूर्ण परिदृश्य देखें: डेटा एन्क्रिप्शन के लिए AES कुंजी जनरेट करना और बायोमेट्रिक सुरक्षा के साथ हस्ताक्षर के लिए EC कुंजी जनरेट करना। दोनों कुंजियाँ हार्डवेयर समर्थन के साथ Android KeyStore के अंदर बनाई जाती हैं।
AES कुंजी KeyGenParameterSpec के साथ KeyGenerator के माध्यम से बनाई जाती है। पैरामीटर: PURPOSE_ENCRYPT + PURPOSE_DECRYPT, BLOCK_MODE_GCM (प्रमाणीकरण के साथ अनुशंसित मोड), ENCRYPTION_PADDING_NONE (GCM के लिए padding की आवश्यकता नहीं)।
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 ऑपरेशन की अनुमति देता है।
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()
}
Android KeyStore हार्डवेयर-स्तरीय सुरक्षा गारंटी प्रदान करता है जो सॉफ़्टवेयर-आधारित KeyStore (JKS, BKS) प्रदान नहीं कर सकते। कुंजियाँ SoC स्तर पर सुरक्षित होती हैं, और Android उपयोगकर्ता स्थान पर पूर्ण नियंत्रण भी निजी कुंजी निकालने की अनुमति नहीं देता।
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) दर्ज होने तक।
अक्सर पूछे जाने वाले प्रश्न
Bouncy Castle (BKS) एक सॉफ़्टवेयर-आधारित KeyStore है जो कुंजियों को पासवर्ड-संरक्षित फ़ाइल में संग्रहीत करता है। Android KeyStore हार्डवेयर अलगाव TEE/StrongBox का उपयोग करता है। BKS कुंजियाँ रूट एक्सेस से निकाली जा सकती हैं, Android KeyStore की कुंजियाँ नहीं। BKS CA प्रमाणपत्रों के लिए उपयुक्त है, Android KeyStore निजी कुंजियों के लिए।
हाँ, यदि आप निर्माण के समय PURPOSE_ENCRYPT या PURPOSE_DECRYPT या PURPOSE_SIGN या PURPOSE_VERIFY निर्दिष्ट करते हैं। हालाँकि, सबसे अच्छा अभ्यास विभिन्न संचालनों के लिए अलग-अलग कुंजियाँ बनाना है। यह एक कुंजी से समझौता होने पर क्षति को सीमित करता है और न्यूनतम विशेषाधिकार सिद्धांत का पालन करता है।
android.security.keystore के माध्यम से उपलब्ध KeyStore.getKeyCharacteristics(alias) का उपयोग करें। विधि फ़्लैग का एक सेट लौटाती है: FLAG_HARDWARE — कुंजी TEE में, FLAG_SECURE_ELEMENT — कुंजी StrongBox में। यदि कोई फ़्लैग नहीं है, तो कुंजी केवल सॉफ़्टवेयर-आधारित है।
setInvalidatedByBiometricEnrollment(true) के साथ बनाई गई सभी कुंजियाँ Keymaster द्वारा स्वचालित रूप से अमान्य कर दी जाएँगी। उपयोग करने का प्रयास करने पर, एप्लिकेशन को KeyPermanentlyInvalidatedException प्राप्त होगा। इन कुंजियों से एन्क्रिप्ट किया गया डेटा स्थायी रूप से खो जाएगा।
हार्डवेयर कुंजियाँ (TEE/StrongBox में) बैकअप का समर्थन नहीं करतीं — वे एक विशिष्ट डिवाइस से बंधी होती हैं। सॉफ़्टवेयर-आधारित कुंजियाँ Google Drive बैकअप में शामिल की जा सकती हैं। डिवाइसों के बीच डेटा स्थानांतरित करने के लिए, सर्वर पर डेटा एन्क्रिप्ट करें और नए डिवाइस पर डिक्रिप्ट करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें