Authentication

Android में उपयोगकर्ता पुष्टि करने वाले एजेंट का कॉन्सेप्ट है. इनका इस्तेमाल डिवाइस को अनलॉक करने और क्रिप्टोग्राफ़िक कुंजियों का ऐक्सेस पाने के लिए किया जाता है. इसमें ये कॉम्पोनेंट शामिल हैं:

  • क्रिप्टोग्राफ़िक कुंजी का स्टोरेज और सेवा देने वाली कंपनी. Android कीस्टोर, ऐप्लिकेशन के लिए हार्डवेयर की मदद से, डेटा एन्क्रिप्ट (सुरक्षित) करने की सेवाएं देता है. फ़्रेमवर्क लेवल पर, Android Keystore सिस्टम को keystore2 सिस्टम सेवा से मदद मिलती है. यह सुविधा, वेंडर के हिसाब से लागू किए गए KeyMint (पहले इसे Keymaster कहा जाता था) पर आधारित है. इससे यह पक्का होता है कि पासकोड को सिर्फ़ हार्डवेयर के साथ काम करने वाले सुरक्षित एनवायरमेंट में ऐक्सेस किया जा सकता है. जैसे, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) या सेक्योर एलिमेंट (एसई).
  • उपयोगकर्ता पुष्टि करने वाले टूल. उपयोगकर्ता की पुष्टि हो गई है. Android, पुष्टि करने के लिए इन कॉम्पोनेंट का इस्तेमाल करता है:
    • टीईई में पिन, पैटर्न या पासवर्ड की पुष्टि करने के लिए गेटकीपर.
    • (ज़रूरी नहीं) सुरक्षित एलिमेंट में पिन, पैटर्न या पासवर्ड की पुष्टि करने के लिए, Weaver.
    • फ़िंगरप्रिंट की पुष्टि करने के लिए फ़िंगरप्रिंट.
    • बायोमेट्रिक ऑथेंटिकेशन के अन्य तरीके. Android 9 या इसके बाद के वर्शन वाले डिवाइसों पर, फ़िंगरप्रिंट और अन्य बायोमेट्रिक्स के लिए, BiometricPrompt को एक इंटिग्रेशन पॉइंट के तौर पर इस्तेमाल किया जा सकता है.
    ये कॉम्पोनेंट, हार्डवेयर पर आधारित पुष्टि करने वाले टोकन (AuthTokens) का इस्तेमाल करके, keystore2 सेवा के साथ अपनी पुष्टि की स्थिति की जानकारी देते हैं .

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

आम तौर पर, वेंडर के लागू होने की प्रोसेस को भी दो हिस्सों में बांटा जाता है. ये हिस्से, वेंडर के हिसाब से अलग-अलग तरीके से कनेक्ट होते हैं :

  • HAL सेवा, Android सिस्टम प्रोसेस के तौर पर काम करती है. यह Android सिस्टम से बाइंडर के अनुरोध पाती है.
  • भरोसेमंद ऐप्लिकेशन (टीए), सुरक्षित एनवायरमेंट में चलता है और असल सुरक्षित ऑपरेशन करता है.

सेट अप

फ़ैक्ट्री रीसेट के बाद डिवाइस को पहली बार चालू करने पर, सभी पुष्टि करने वाले टूल, उपयोगकर्ता से क्रेडेंशियल डालने के लिए तैयार हो जाते हैं. उपयोगकर्ता को शुरुआत में, Gatekeeper (या उपलब्ध होने पर Weaver) के साथ पिन, पैटर्न या पासवर्ड डालकर रजिस्टर करना होगा. इस शुरुआती रजिस्ट्रेशन से, उपयोगकर्ता के लिए 64-बिट का एक सुरक्षित आइडेंटिफ़ायर (एसआईडी) जनरेट होता है. यह आइडेंटिफ़ायर, उपयोगकर्ता के लिए आइडेंटिफ़ायर के तौर पर काम करता है. साथ ही, उपयोगकर्ता के क्रिप्टोग्राफ़िक कॉन्टेंट के लिए बाइंडिंग टोकन के तौर पर भी काम करता है. यह उपयोगकर्ता एसआईडी, क्रिप्टोग्राफ़िक तरीके से उपयोगकर्ता के पासवर्ड से जुड़ा होता है. Gatekeeper से पुष्टि करने पर, AuthToken मिलते हैं. इनमें उस पासवर्ड के लिए उपयोगकर्ता एसआईडी होता है.

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

कुछ मामलों में, डिवाइस एडमिन किसी मौजूदा क्रेडेंशियल को दिखाए बिना, नया क्रेडेंशियल रजिस्टर करने के लिए भरोसेमंद रजिस्टर कर सकता है. इससे उपयोगकर्ता को डिवाइस को ऐक्सेस करने की अनुमति मिल जाती है. हालांकि, उपयोगकर्ता के पुराने एसआईडी के तहत बनाई गई कुंजियां हमेशा के लिए खो जाती हैं.

पुष्टि करना

इस सेक्शन में पुष्टि करने के सामान्य फ़्लो के बारे में बताया गया है. इसमें Android और सुरक्षित एनवायरमेंट, दोनों में कई कॉम्पोनेंट के बीच इंटरैक्शन शामिल होते हैं. ध्यान दें कि सभी सुरक्षित कॉम्पोनेंट, एक गुप्त एचएमएसी कुंजी शेयर करते हैं. इसका इस्तेमाल, वे एक-दूसरे के मैसेज की पुष्टि करने के लिए करते हैं.

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

पहली इमेज. पुष्टि करने का तरीका

  1. उपयोगकर्ता, पुष्टि करने का कोई तरीका बताता है और उससे जुड़ी सेवा, HAL सेवा से अनुरोध करती है.
    • पिन, पैटर्न या पासवर्ड के लिए, LockSettingsService gatekeeperd से अनुरोध करता है.
    • बायोमेट्रिक ऑथेंटिकेशन के फ़्लो, Android वर्शन पर निर्भर करते हैं. Android 8.x और इससे पहले के वर्शन वाले डिवाइसों पर, FingerprintService fingerprintd से अनुरोध करता है. Android 9 और इसके बाद के वर्शन वाले डिवाइसों पर, BiometricPrompt सही BiometricManager क्लास (जैसे, FingerprintManager या FaceManager) का इस्तेमाल करके, सही बायोमेट्रिक डेमन (उदाहरण के लिए, उंगलियों के निशान के लिए fingerprintd या चेहरे के लिए faced) से अनुरोध करता है. किसी भी वर्शन में, अनुरोध भेजने के बाद बायोमेट्रिक ऑथेंटिकेशन, एसिंक्रोनस तरीके से होता है.
  2. HAL सेवा, अपने टैग एजेंट (TA) को डेटा भेजती है, जो एक AuthToken जनरेट करता है:
    • पिन/पैटर्न/पासवर्ड की पुष्टि करने के लिए, gatekeeperd, Gatekeeper HAL सेवा के ज़रिए, TEE में Gatekeeper TA को पिन, पैटर्न या पासवर्ड का हैश भेजता है. अगर टीईई में पुष्टि हो जाती है, तो Gatekeeper TA एक AuthToken जारी करता है. इसमें उपयोगकर्ता का SID होता है, जिस पर शेयर की गई HMAC कुंजी से हस्ताक्षर किया जाता है.
    • फ़िंगरप्रिंट की पुष्टि करने के लिए, fingerprintd फ़िंगरप्रिंट इवेंट को सुनता है और Fingerprint HAL के ज़रिए, TEE में मौजूद Fingerprint TA को डेटा भेजता है. अगर टीईई में पुष्टि हो जाती है, तो फ़िंगरप्रिंट टीए, AuthToken (AuthToken HMAC पासकोड से साइन किया गया) भेजता है.
    • बायोमेट्रिक ऑथेंटिकेशन के लिए, सही बायोमेट्रिक डेमन बायोमेट्रिक इवेंट को सुनता है और उसे सही बायोमेट्रिक HAL सेवा और टीए को भेजता है.
  3. हस्ताक्षर किए गए AuthToken को Binder इंटरफ़ेस की मदद से, keystore2 सिस्टम सेवा को पास किया जाता है.
  4. keystore2 सेवा, क्रिप्टोग्राफ़िक ऑपरेशन करने के लिए, KeyMint (पहले इसे Keymaster कहा जाता था) से अनुरोध करने के लिए AuthToken अटैच करती है. KeyMint HAL सेवा, इन निर्देशों को KeyMint TA को भेजती है. इसके बाद, TA इन निर्देशों की पुष्टि करता है. इसके लिए, वह Gatekeeper और काम करने वाले बायोमेट्रिक टीईई कॉम्पोनेंट के साथ शेयर की गई एचएमएससी कुंजी का इस्तेमाल करता है. KeyMint, टोकन में मौजूद टाइमस्टैंप को पुष्टि के आखिरी समय के तौर पर मानता है. साथ ही, टाइमस्टैंप के आधार पर यह तय करता है कि पासकोड का इस्तेमाल करने की अनुमति देनी है या नहीं.

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

AuthToken का फ़ॉर्मैट

AuthToken का फ़ॉर्मैट, HardwareAuthToken.aidl में एआईडीएल स्पेसिफ़िकेशन में दिया गया है.

डिवाइस के बूट होने का फ़्लो

डिवाइस के हर बार बूट होने पर, AuthToken HMAC पासकोड जनरेट किया जाना चाहिए और उसे TEE के सभी कॉम्पोनेंट (Gatekeeper, KeyMint/Keymaster, और काम करने वाले बायोमेट्रिक्स TAs) के साथ शेयर किया जाना चाहिए. रीप्ले हमलों को रोकने के लिए, हर बार डिवाइस रीबूट होने पर, एचएमएससी पासकोड को रैंडम तरीके से जनरेट किया जाना चाहिए.

टीए, शेयर की गई इस एचएमएस की ऐक्सेस कुंजी को दो सामान्य तरीकों से हासिल करते हैं:

  • शेयर किया गया सीक्रेट एग्रीमेंट: keystore2 सेवा, डिवाइस के स्टार्टअप पर कई तरह के की-एग्रीमेंट प्रोटोकॉल को लागू करती है. इससे, हिस्सा लेने वाले टीए के बीच एचएमएसी कुंजी को सुरक्षित तरीके से जनरेट किया जा सकता है. हालांकि, इसमें हिस्सा लेने वाले टीए के पास, पहले से शेयर किए गए एक सामान्य पासवर्ड का ऐक्सेस होना चाहिए.
  • सीधे ऐक्सेस: एक ही सुरक्षित एनवायरमेंट में मौजूद टीए, एचएमएसी पासकोड शेयर करने के लिए, इंटरप्रोसेस कम्यूनिकेशन के किसी इंटरनल तरीके का इस्तेमाल कर सकते हैं. यह तरीका, प्लैटफ़ॉर्म पर निर्भर करता है.

दोनों ही मामलों में, एचएमएसी पासकोड को TEE के बाहर कभी उपलब्ध नहीं कराया जाना चाहिए.

Android के साथ काम करने वाला Trusty ऑपरेटिंग सिस्टम, टीईई का एक उदाहरण है. हालांकि, इसके बजाय किसी दूसरे टीईई का इस्तेमाल किया जा सकता है. Trusty, इंटरनल आईपीसी सिस्टम का इस्तेमाल करके, KeyMint और Gatekeeper या सही बायोमेट्रिक टीए के बीच सीधे तौर पर कम्यूनिकेट करता है. एचएमएससी पासकोड सिर्फ़ KeyMint में सेव होता है. फ़िंगरप्रिंट और Gatekeeper, हर बार इस्तेमाल करने के लिए KeyMint से पासकोड का अनुरोध करते हैं. साथ ही, वे वैल्यू को सेव या कैश मेमोरी में सेव नहीं करते.