Android कीस्टोर सिस्टम

Android Keystore सिस्टम की मदद से, क्रिप्टोग्राफ़िक कुंजियों को कंटेनर में सेव किया जा सकता है, ताकि उन्हें डिवाइस से निकालना मुश्किल हो. कुंजियों को पासकोड के डिवाइस में सेव करने के बाद, उनका इस्तेमाल क्रिप्टोग्राफ़िक ऑपरेशन के लिए किया जा सकता है. हालांकि, पासकोड का डेटा एक्सपोर्ट नहीं किया जा सकता. साथ ही, पासकोड सिस्टम की मदद से यह तय किया जा सकता है कि कुंजियों का इस्तेमाल कब और कैसे किया जाए. जैसे, कुंजी के इस्तेमाल के लिए उपयोगकर्ता की पुष्टि करना या कुंजियों को सिर्फ़ कुछ क्रिप्टोग्राफ़िक मोड में इस्तेमाल करने की पाबंदी लगाना. ज़्यादा जानकारी के लिए, सुरक्षा से जुड़ी सुविधाएं सेक्शन देखें.

Android 4.0 (एपीआई लेवल 14) में पेश किए गए KeyChain एपीआई के साथ-साथ, Android 4.3 (एपीआई लेवल 18) में पेश की गई Android Keystore की सेवा देने वाली सुविधा, पासकोड सेव करने वाले सिस्टम का इस्तेमाल करती है. इस दस्तावेज़ में, Android Keystore सिस्टम का इस्तेमाल कब और कैसे करना है, इस बारे में बताया गया है.

सुरक्षा से जुड़ी सुविधाएं

Android कीस्टोर सिस्टम, पासकोड को दो तरीकों से बिना अनुमति के इस्तेमाल होने से बचाता है. सबसे पहले, यह ऐप्लिकेशन प्रोसेस और Android डिवाइस से मुख्य कॉन्टेंट को पूरी तरह से निकालने से रोकता है. इससे Android डिवाइस के बाहर से मुख्य कॉन्टेंट के गलत इस्तेमाल के जोखिम को कम किया जाता है. दूसरा, पासकोड सेव करने की सुविधा देने वाला सिस्टम, Android डिवाइस में पासकोड के गलत इस्तेमाल के जोखिम को कम करता है. ऐसा करने के लिए, यह सिस्टम ऐप्लिकेशन को उनकी कुंजियों के इस्तेमाल के लिए अनुमति देता है. साथ ही, ऐप्लिकेशन की प्रोसेस के बाहर उन पाबंदियों को लागू करता है.

डेटा निकालने से रोकना

Android Keystore की कुंजियों के पासकोड को निकालने से रोकने के लिए, सुरक्षा के दो उपाय अपनाए जाते हैं:

  • अहम कॉन्टेंट, कभी भी आवेदन करने की प्रोसेस में शामिल नहीं होता. जब कोई ऐप्लिकेशन, Android कीस्टोर की कुंजी का इस्तेमाल करके क्रिप्टोग्राफ़िक ऑपरेशन करता है, तो पर्दे के पीछे सादा टेक्स्ट, सिफर टेक्स्ट, और ऐसे मैसेज जिन्हें साइन या पुष्टि करनी है उन्हें एक सिस्टम प्रोसेस में भेजा जाता है. यह प्रोसेस, क्रिप्टोग्राफ़िक ऑपरेशन करती है. अगर ऐप्लिकेशन की प्रोसेस में छेड़छाड़ की जाती है, तो हमलावर ऐप्लिकेशन की कुंजियों का इस्तेमाल कर सकता है. हालांकि, वह कुंजी का मुख्य हिस्सा नहीं निकाल सकता. उदाहरण के लिए, Android डिवाइस के बाहर इसका इस्तेमाल करने के लिए.
  • मुख्य कॉन्टेंट, Android डिवाइस के सुरक्षित हार्डवेयर के साथ जुड़ा हो सकता है. जैसे, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) या सिक्योर एलिमेंट (एसई). जब किसी पासकोड के लिए यह सुविधा चालू होती है, तो उसका पासकोड, सुरक्षित हार्डवेयर के बाहर कभी भी नहीं दिखता. अगर Android OS हैक हो जाता है या हमलावर डिवाइस के इंटरनल स्टोरेज को पढ़ सकता है, तो हो सकता है कि वह Android डिवाइस पर किसी भी ऐप्लिकेशन की Android Keystore पासकोड का इस्तेमाल कर सके. हालांकि, वह उन्हें डिवाइस से निकाल नहीं सकता. यह सुविधा सिर्फ़ तब चालू होती है, जब डिवाइस का सुरक्षित हार्डवेयर, मुख्य एल्गोरिदम, ब्लॉक मोड, पैडिंग स्कीम, और डाइजेस्ट कुंजी के खास कॉम्बिनेशन के साथ काम करता है. साथ ही, कुंजी के साथ इस्तेमाल करने की अनुमति होती है.

    यह देखने के लिए कि किसी पासकोड के लिए यह सुविधा चालू है या नहीं, उस पासकोड के लिए KeyInfo पाएं. अगला चरण आपके ऐप्लिकेशन के टारगेट SDK वर्शन पर निर्भर करता है:

    • अगर आपका ऐप्लिकेशन, Android 10 (एपीआई लेवल 29) या उसके बाद के वर्शन को टारगेट करता है, तो getSecurityLevel() की रिटर्न वैल्यू देखें. KeyProperties.SecurityLevelEnum.TRUSTED_ENVIRONMENT या KeyProperties.SecurityLevelEnum.STRONGBOX से मैच करने वाली रिटर्न वैल्यू से पता चलता है कि पासकोड, सुरक्षित हार्डवेयर में सेव है.
    • अगर आपका ऐप्लिकेशन, Android 9 (एपीआई लेवल 28) या इससे पहले के वर्शन को टारगेट करता है, तो KeyInfo.isInsideSecurityHardware() की बूलियन रिटर्न वैल्यू की जांच करें.

हार्डवेयर सुरक्षा मॉड्यूल

Android 9 (एपीआई लेवल 28) या इसके बाद के वर्शन वाले डिवाइसों में, StrongBox Keymaster हो सकता है. यह Keymaster या Keymint HAL का एक ऐसा वर्शन है जो हार्डवेयर सुरक्षा मॉड्यूल जैसे सुरक्षित एलिमेंट में मौजूद होता है. हार्डवेयर के सुरक्षा मॉड्यूल, पासकोड सेव करने के कई अलग-अलग तरीकों का इस्तेमाल कर सकते हैं. इनमें TEE जैसे ऐसे तरीके शामिल हैं जिनमें लिनक्स कर्नेल के हैक होने पर भी पासकोड का पता नहीं चलता. वहीं, StrongBox में एम्बेड किए गए सुरक्षित एलिमेंट (eSE) या SoC पर मौजूद सुरक्षित प्रोसेसिंग यूनिट (iSE) जैसे डिवाइसों का इस्तेमाल किया जाता है.

इस मॉड्यूल में ये चीज़ें शामिल हैं:

  • अपना सीपीयू
  • सुरक्षित स्टोरेज
  • रैंडम नंबर जनरेटर
  • पैकेज में छेड़छाड़ और ऐप्लिकेशन को बिना अनुमति के साइडलोड करने से रोकने के लिए अन्य तरीके
  • सुरक्षित टाइमर
  • डिवाइस को फिर से चालू करने की सूचना वाला पिन या ऐसा ही कोई अन्य काम. उदाहरण के लिए, अलग-अलग कामों के लिए इस्तेमाल किया जाने वाला इनपुट/आउटपुट (GPIO)

कम बैटरी वाले StrongBox को लागू करने के लिए, एल्गोरिदम और कुंजी के साइज़ का एक सबसेट काम करता है:

  • आरएसए 2048
  • AES 128 और 256
  • ECDSA, ECDH P-256
  • HMAC-SHA256 (8 बाइट और 64 बाइट के बीच के कुंजी साइज़ के साथ काम करता है)
  • ट्रिपल डीईएस
  • लंबी अवधि के APDU
  • कुंजी को प्रमाणित करें
  • अपग्रेड के लिए, संशोधन H से जुड़ी सहायता

KeyStore क्लास का इस्तेमाल करके कुंजियां जनरेट या इंपोर्ट करते समय, setIsStrongBoxBacked() तरीके में true पास करके, StrongBox Keymaster में कुंजी सेव करने की प्राथमिकता दिखाई जाती है.

TEE की तुलना में, StrongBox थोड़ा धीमा और संसाधनों की कमी वाला है. इसका मतलब है कि यह एक साथ कम ऑपरेशन करता है. हालांकि, StrongBox, फ़िज़िकल और साइड-चैनल हमलों से बेहतर सुरक्षा की गारंटी देता है. अगर आपको ऐप्लिकेशन के संसाधनों के इस्तेमाल के बजाय, ज़्यादा सुरक्षा को प्राथमिकता देनी है, तो हमारा सुझाव है कि आप उन डिवाइसों पर StrongBox का इस्तेमाल करें जहां यह उपलब्ध है. अगर StrongBox उपलब्ध नहीं है, तो आपका ऐप्लिकेशन अहम कॉन्टेंट को स्टोर करने के लिए, हमेशा टीईई का इस्तेमाल कर सकता है.

कुंजी के इस्तेमाल की अनुमति

Android डिवाइस पर पासकोड का गलत इस्तेमाल होने से रोकने के लिए, Android Keystore की मदद से ऐप्लिकेशन, पासकोड जनरेट या इंपोर्ट करते समय, उनके इस्तेमाल के लिए अनुमति तय कर सकते हैं. पासकोड जनरेट करने या इंपोर्ट करने के बाद, उसके अनुमतियों को बदला नहीं जा सकता. इसके बाद, जब भी कुंजी का इस्तेमाल किया जाता है, तो Android Keystore अनुमतियां लागू करता है. यह सुरक्षा से जुड़ी एक बेहतर सुविधा है. आम तौर पर, यह सिर्फ़ तब काम की होती है, जब आपकी ज़रूरतों के मुताबिक, कुंजी जनरेट करने/इंपोर्ट करने के बाद (कुंजी जनरेट करने/इंपोर्ट करने से पहले या उसके दौरान नहीं) आपकी आवेदन प्रक्रिया में किसी तरह की छेड़छाड़ होने पर, कुंजी का गलत इस्तेमाल न किया जा सके.

पासकोड इस्तेमाल करने की अनुमतियों को इन कैटगरी में बांटा गया है:

  • क्रिप्टोग्राफ़ी: कुंजी का इस्तेमाल सिर्फ़ अनुमति वाले एल्गोरिदम, ऑपरेशन या मकसद (एन्क्रिप्ट, डिक्रिप्ट, हस्ताक्षर, पुष्टि) के साथ किया जा सकता है. इसके अलावा, पैडिंग स्कीम, ब्लॉक मोड या डाइजेस्ट के साथ भी इसका इस्तेमाल किया जा सकता है.
  • समयसीमा: पासकोड का इस्तेमाल सिर्फ़ तय समयसीमा के दौरान किया जा सकता है.
  • उपयोगकर्ता की पुष्टि करना: कुंजी का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता की पुष्टि हाल ही में हुई हो. कुंजी का इस्तेमाल करने के लिए, उपयोगकर्ता की पुष्टि करना ज़रूरी है लेख देखें.

उन कुंजियों के लिए अतिरिक्त सुरक्षा उपाय के तौर पर, जिनकी मुख्य सामग्री सुरक्षित हार्डवेयर में है (KeyInfo.isInsideSecurityHardware() या Android 10 (एपीआई लेवल 29) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, KeyInfo.getSecurityLevel() देखें), Android डिवाइस पर निर्भर करते हुए, कुंजी इस्तेमाल करने की कुछ अनुमतियां सुरक्षित हार्डवेयर से लागू की जा सकती हैं. सुरक्षित हार्डवेयर सामान्य रूप से क्रिप्टोग्राफ़िक और उपयोगकर्ता की पुष्टि करने की अनुमति लागू करता है. हालांकि, आम तौर पर सुरक्षित हार्डवेयर, समयसीमा के हिसाब से पुष्टि करने की अनुमतियों को लागू नहीं करता, क्योंकि आम तौर पर इसमें स्वतंत्र और सुरक्षित रीयल-टाइम घड़ी नहीं होती.

KeyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware() का इस्तेमाल करके, यह पता लगाया जा सकता है कि कुंजी के उपयोगकर्ता की पुष्टि करने की अनुमति, सुरक्षित हार्डवेयर से लागू की गई है या नहीं.

पासकोड और Android Keystore की सेवा देने वाली कंपनी में से किसी एक को चुनना

जब आपको सिस्टम के लिए क्रेडेंशियल चाहिए, तो KeyChain एपीआई का इस्तेमाल करें. जब कोई ऐप्लिकेशन KeyChain एपीआई के ज़रिए किसी क्रेडेंशियल का इस्तेमाल करने का अनुरोध करता है, तो उपयोगकर्ता सिस्टम से मिले यूज़र इंटरफ़ेस (यूआई) की मदद से यह चुन सकते हैं कि ऐप्लिकेशन, इंस्टॉल किए गए किन क्रेडेंशियल को ऐक्सेस कर सकता है. इससे कई ऐप्लिकेशन, उपयोगकर्ता की सहमति के साथ क्रेडेंशियल के एक ही सेट का इस्तेमाल कर सकते हैं.

Android कीसस्टोर प्रोवाइडर का इस्तेमाल करके, किसी ऐप्लिकेशन को अपने क्रेडेंशियल स्टोर करने की अनुमति दें. ये क्रेडेंशियल सिर्फ़ वह ऐप्लिकेशन ऐक्सेस कर सकता है. इससे ऐप्लिकेशन को ऐसे क्रेडेंशियल मैनेज करने में मदद मिलती है जिनका इस्तेमाल सिर्फ़ वे कर सकते हैं. साथ ही, इससे वे सुरक्षा से जुड़े फ़ायदे भी देते हैं जो KeyChain एपीआई, पूरे सिस्टम के क्रेडेंशियल के लिए उपलब्ध कराता है. इस तरीके में, उपयोगकर्ता को क्रेडेंशियल चुनने की ज़रूरत नहीं होती.

Android कीस्टोर की सेवा देने वाली कंपनी का इस्तेमाल करना

इस सुविधा का इस्तेमाल करने के लिए, Android 4.3 (एपीआई लेवल 18) में पेश किए गए AndroidKeyStore प्रोवाइडर के साथ-साथ, स्टैंडर्ड KeyStore और KeyPairGenerator या KeyGenerator क्लास का इस्तेमाल किया जाता है.

AndroidKeyStore को KeyStore टाइप के तौर पर रजिस्टर किया गया है, ताकि इसका इस्तेमाल KeyStore.getInstance(type) तरीके के साथ किया जा सके. साथ ही, इसे KeyPairGenerator.getInstance(algorithm, provider) और KeyGenerator.getInstance(algorithm, provider) तरीकों के साथ इस्तेमाल करने के लिए, प्रोवाइडर के तौर पर रजिस्टर किया गया है.

क्रिप्टोग्राफ़िक ऑपरेशन में ज़्यादा समय लग सकता है. इसलिए, ऐप्लिकेशन को अपने मुख्य थ्रेड पर AndroidKeyStore का इस्तेमाल करने से बचना चाहिए. इससे यह पक्का किया जा सकेगा कि ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) रिस्पॉन्सिव बना रहे. (StrictMode उन स्थानों को ढूंढने में आपकी सहायता कर सकता है जहां ऐसा नहीं होता है.)

नई निजी या गुप्त कुंजी जनरेट करना

PrivateKey वाला नया KeyPair जनरेट करने के लिए, आपको सर्टिफ़िकेट के शुरुआती X.509 एट्रिब्यूट की जानकारी देनी होगी. सर्टिफ़िकेट अथॉरिटी (सीए) के हस्ताक्षर वाले सर्टिफ़िकेट से, बाद में सर्टिफ़िकेट को बदलने के लिए, KeyStore.setKeyEntry() का इस्तेमाल किया जा सकता है.

कुंजी का जोड़ा जनरेट करने के लिए, KeyGenParameterSpec के साथ KeyPairGenerator का इस्तेमाल करें:

Kotlin

/*
 * Generate a new EC key pair entry in the Android Keystore by
 * using the KeyPairGenerator API. The private key can only be
 * used for signing or verification and only with SHA-256 or
 * SHA-512 as the message digest.
 */
val kpg: KeyPairGenerator = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC,
        "AndroidKeyStore"
)
val parameterSpec: KeyGenParameterSpec = KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
).run {
    setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
    build()
}

kpg.initialize(parameterSpec)

val kp = kpg.generateKeyPair()

Java

/*
 * Generate a new EC key pair entry in the Android Keystore by
 * using the KeyPairGenerator API. The private key can only be
 * used for signing or verification and only with SHA-256 or
 * SHA-512 as the message digest.
 */
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
        alias,
        KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
        .setDigests(KeyProperties.DIGEST_SHA256,
            KeyProperties.DIGEST_SHA512)
        .build());

KeyPair kp = kpg.generateKeyPair();

एन्क्रिप्ट (सुरक्षित) की गई कुंजियों को सुरक्षित हार्डवेयर में इंपोर्ट करना

Android 9 (एपीआई लेवल 28) और इसके बाद के वर्शन में, एएसएन.1-एन्क्रिप्ट की गई कुंजी के फ़ॉर्मैट का इस्तेमाल करके, एन्क्रिप्ट की गई कुंजियों को कीस्टोर में सुरक्षित तरीके से इंपोर्ट किया जा सकता है. इसके बाद, Keymaster, पासकोड कोड को डिक्रिप्ट कर देता है. इसलिए, डिवाइस की होस्ट मेमोरी में पासकोड का कॉन्टेंट कभी भी सादा टेक्स्ट के तौर पर नहीं दिखता. इस प्रोसेस से, पासकोड को डिक्रिप्ट करने के लिए, पासकोड की अतिरिक्त सुरक्षा मिलती है.

एन्क्रिप्ट की गई कुंजियों को पासकोड में सुरक्षित तरीके से इंपोर्ट करने के लिए, यह तरीका अपनाएं:

  1. ऐसा कुंजी का जोड़ा जनरेट करें जो PURPOSE_WRAP_KEY मकसद का इस्तेमाल करता हो. हमारा सुझाव है कि आप कुंजी के इस जोड़े के लिए भी पुष्टि करने की सुविधा जोड़ें.

  2. आपके भरोसेमंद सर्वर या मशीन पर, SecureKeyWrapper के लिए ASN.1 मैसेज जनरेट करें.

    रैपर में यह स्कीमा शामिल होता है:

       KeyDescription ::= SEQUENCE {
           keyFormat INTEGER,
           authorizationList AuthorizationList
       }
    
       SecureKeyWrapper ::= SEQUENCE {
           wrapperFormatVersion INTEGER,
           encryptedTransportKey OCTET_STRING,
           initializationVector OCTET_STRING,
           keyDescription KeyDescription,
           secureKey OCTET_STRING,
           tag OCTET_STRING
       }
    
  3. ASN.1 मैसेज को बाइट कलेक्शन के तौर पर पास करके, WrappedKeyEntry ऑब्जेक्ट बनाएं.

  4. इस WrappedKeyEntry ऑब्जेक्ट को, setEntry() के उस ओवरलोड में पास करें जो Keystore.Entry ऑब्जेक्ट स्वीकार करता है.

कीस्टोर एंट्री के साथ काम करें

AndroidKeyStore की सेवा देने वाली कंपनी को, सभी स्टैंडर्ड KeyStore एपीआई के ज़रिए ऐक्सेस किया जा सकता है.

एंट्री की सूची

aliases() तरीके को कॉल करके, पासकोड की सूची बनाएं:

Kotlin

/*
 * Load the Android KeyStore instance using the
 * AndroidKeyStore provider to list the currently stored entries.
 */
val ks: KeyStore = KeyStore.getInstance("AndroidKeyStore").apply {
   load(null)
}
val aliases: Enumeration<String> = ks.aliases()

Java

/*
 * Load the Android KeyStore instance using the
 * AndroidKeyStore provider to list the currently stored entries.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
Enumeration<String> aliases = ks.aliases();

डेटा पर हस्ताक्षर करना और उसकी पुष्टि करना

डेटा पर हस्ताक्षर करने के लिए, पासकोड सेव करने की जगह से KeyStore.Entry फ़ेच करें और Signature एपीआई का इस्तेमाल करें. जैसे, sign():

Kotlin

/*
 * Use a PrivateKey in the KeyStore to create a signature over
 * some data.
 */
val ks: KeyStore = KeyStore.getInstance("AndroidKeyStore").apply {
    load(null)
}
val entry: KeyStore.Entry = ks.getEntry(alias, null)
if (entry !is KeyStore.PrivateKeyEntry) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry")
    return null
}
val signature: ByteArray = Signature.getInstance("SHA256withECDSA").run {
    initSign(entry.privateKey)
    update(data)
    sign()
}

Java

/*
 * Use a PrivateKey in the KeyStore to create a signature over
 * some data.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (!(entry instanceof PrivateKeyEntry)) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry");
    return null;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initSign(((PrivateKeyEntry) entry).getPrivateKey());
s.update(data);
byte[] signature = s.sign();

इसी तरह, verify(byte[]) तरीके से डेटा की पुष्टि करने के लिए:

Kotlin

/*
 * Verify a signature previously made by a private key in the
 * KeyStore. This uses the X.509 certificate attached to the
 * private key in the KeyStore to validate a previously
 * generated signature.
 */
val ks = KeyStore.getInstance("AndroidKeyStore").apply {
    load(null)
}
val entry = ks.getEntry(alias, null) as? KeyStore.PrivateKeyEntry
if (entry == null) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry")
    return false
}
val valid: Boolean = Signature.getInstance("SHA256withECDSA").run {
    initVerify(entry.certificate)
    update(data)
    verify(signature)
}

Java

/*
 * Verify a signature previously made by a private key in the
 * KeyStore. This uses the X.509 certificate attached to the
 * private key in the KeyStore to validate a previously
 * generated signature.
 */
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (!(entry instanceof PrivateKeyEntry)) {
    Log.w(TAG, "Not an instance of a PrivateKeyEntry");
    return false;
}
Signature s = Signature.getInstance("SHA256withECDSA");
s.initVerify(((PrivateKeyEntry) entry).getCertificate());
s.update(data);
boolean valid = s.verify(signature);

पासकोड इस्तेमाल करने के लिए, उपयोगकर्ता की पुष्टि करना ज़रूरी है

AndroidKeyStore में कुंजी जनरेट या इंपोर्ट करते समय, आपके पास यह तय करने का विकल्प होता है कि कुंजी को इस्तेमाल करने की अनुमति सिर्फ़ तब दी गई है, जब उपयोगकर्ता की पुष्टि की गई हो. उपयोगकर्ता की पुष्टि, स्क्रीन लॉक के सुरक्षित क्रेडेंशियल (पैटर्न/पिन/पासवर्ड, बायोमेट्रिक क्रेडेंशियल) के सबसेट का इस्तेमाल करके की जाती है.

यह सुरक्षा की बेहतर सुविधा है. आम तौर पर, यह सिर्फ़ तब काम की होती है, जब आपकी ज़रूरतें ये हों कि कुंजी जनरेट करने/इंपोर्ट करने के बाद (कुंजी जनरेट करने/इंपोर्ट करने से पहले या उसके दौरान नहीं) आपकी ऐप्लिकेशन प्रोसेस से छेड़छाड़ करने पर, उपयोगकर्ता को कुंजी इस्तेमाल करने के लिए पुष्टि करने की ज़रूरत न पड़े.

जब किसी कुंजी का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब उपयोगकर्ता की पुष्टि हो चुकी हो, तो उसे इनमें से किसी एक मोड में काम करने के लिए कॉन्फ़िगर करने के लिए, setUserAuthenticationParameters() को कॉल किया जा सकता है:

समयावधि के लिए अधिकृत करें
उपयोगकर्ता के दिए गए क्रेडेंशियल का इस्तेमाल करके पुष्टि करने के बाद, सभी कुंजियों को इस्तेमाल करने की अनुमति मिल जाती है.
किसी खास क्रिप्टोग्राफ़िक ऑपरेशन के लिए अनुमति देना

किसी खास कुंजी से जुड़े हर ऑपरेशन के लिए, उपयोगकर्ता को अलग से अनुमति देनी होगी.

आपका ऐप्लिकेशन, BiometricPrompt के किसी इंस्टेंस पर authenticate() को कॉल करके, यह प्रोसेस शुरू करता है.

आपके पास हर पासकी के लिए, बेहतर बायोमेट्रिक क्रेडेंशियल, लॉक स्क्रीन क्रेडेंशियल या दोनों तरह के क्रेडेंशियल इस्तेमाल करने का विकल्प होता है. यह पता लगाने के लिए कि उपयोगकर्ता ने वे क्रेडेंशियल सेट अप किए हैं या नहीं जिन पर आपके ऐप्लिकेशन की पासकोड निर्भर करता है, canAuthenticate() को कॉल करें.

अगर कोई कुंजी सिर्फ़ बायोमेट्रिक क्रेडेंशियल के साथ काम करती है, तो नए बायोमेट्रिक डेटा को जोड़ने पर, कुंजी डिफ़ॉल्ट रूप से अमान्य हो जाती है. नए बायोमेट्रिक रिकॉर्ड जोड़े जाने पर, कुंजी को मान्य रखने के लिए कॉन्फ़िगर किया जा सकता है. ऐसा करने के लिए, false को setInvalidatedByBiometricEnrollment() में पास करें.

अपने ऐप्लिकेशन में बायोमेट्रिक ऑथेंटिकेशन की सुविधाएं जोड़ने के तरीके के बारे में ज़्यादा जानें. इसमें, बायोमेट्रिक ऑथेंटिकेशन डायलॉग दिखाने का तरीका भी शामिल है.

काम करने वाले एल्गोरिदम

ब्लॉग लेख

ICS में पासकोड स्टोर का ऐक्सेस एक करना ब्लॉग पोस्ट देखें.