क्लासिक एपीआई अनुरोध करें

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

ज़रूरी बातें

स्टैंडर्ड और क्लासिक अनुरोधों की तुलना करें

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

यहां दी गई टेबल में, इन दोनों टाइप के मुख्य अंतरों को हाइलाइट किया गया है अनुरोध:

स्टैंडर्ड एपीआई अनुरोध क्लासिक एपीआई अनुरोध
ज़रूरी शर्तें
Android SDK का कम से कम वर्शन होना ज़रूरी है Android 5.0 (एपीआई लेवल 21) या इसके बाद वाला वर्शन Android 4.4 (एपीआई लेवल 19) या इसके बाद का वर्शन
Google Play की ज़रूरी शर्तें Google Play Store और Google Play services Google Play Store और Google Play services
इंटिग्रेशन की जानकारी
एपीआई वॉर्म-अप करना ज़रूरी है ✔️ (कुछ सेकंड)
अनुरोध में आम तौर पर लगने वाला समय कुछ सौ मिलीसेकंड कुछ सेकंड
अनुरोध की फ़्रीक्वेंसी अक्सर (किसी भी कार्रवाई या अनुरोध के लिए मांग पर जांच) कभी-कभी (सबसे ज़्यादा वैल्यू वाली कार्रवाइयों या सबसे संवेदनशील अनुरोधों के लिए, एक बार की जाने वाली जांच)
टाइम आउट की संख्या ज़्यादातर वॉर्म अप 10 सेकंड से कम होते हैं, लेकिन उनमें सर्वर कॉल शामिल होता है, इसलिए हमारा सुझाव है कि टाइम आउट लंबा रखें, जैसे कि 1 मिनट. फ़ैसला के अनुरोध, क्लाइंट-साइड पर होते हैं ज़्यादातर अनुरोध 10 सेकंड से कम के होते हैं, लेकिन उनमें सर्वर कॉल शामिल होता है, इसलिए एक लंबा टाइम आउट रखने का सुझाव दिया जाता है (उदाहरण के लिए 1 मिनट)
पूरी सुरक्षा की जांच के नतीजे का टोकन
इसमें डिवाइस, ऐप्लिकेशन, और खाते की जानकारी शामिल है ✔️ ✔️
टोकन कैशिंग Google Play की मदद से, डिवाइस पर सुरक्षित तरीके से कैश मेमोरी में डेटा सेव करने की सुविधा हम आपको इसका सुझाव नहीं देते हैं
Google Play सर्वर से टोकन को डिक्रिप्ट करें और उसकी पुष्टि करें ✔️ ✔️
सामान्य डिक्रिप्शन के सर्वर-टू-सर्वर अनुरोध में लगने वाला समय 10 सेकंड की उपलब्धता के साथ 39 सेकंड 10 सेकंड की उपलब्धता के साथ 39 सेकंड
टोकन को एक सुरक्षित सर्वर एनवायरमेंट में, स्थानीय तौर पर डिक्रिप्ट करें और उसकी पुष्टि करें ✔️
टोकन क्लाइंट-साइड को डिक्रिप्ट करें और उसकी पुष्टि करें
पूरी सुरक्षा की जांच के नतीजे अपडेट होने की फ़्रीक्वेंसी Google Play की मदद से कुछ डेटा अपने-आप कैश मेमोरी और रीफ़्रेश होने की सुविधा हर अनुरोध के बाद सभी नतीजों की फिर से गिनती की जाती है
सीमाएं
हर ऐप्लिकेशन के लिए हर दिन मिलने वाले अनुरोध डिफ़ॉल्ट रूप से 10,000 (बढ़ोतरी का अनुरोध किया जा सकता है) डिफ़ॉल्ट रूप से 10,000 (बढ़ोतरी का अनुरोध किया जा सकता है)
हर ऐप्लिकेशन इंस्टेंस के हिसाब से हर मिनट के लिए मिले अनुरोध वॉर्म अप: हर मिनट पांच मिनट
इंटिग्रिटी टोकन: कोई सार्वजनिक सीमा नहीं*
इंटिग्रिटी टोकन: हर मिनट पांच मिनट
सुरक्षा
छेड़छाड़ करने और इस तरह के हमलों से बचने के लिए requestHash फ़ील्ड का इस्तेमाल करें अनुरोध के डेटा के आधार पर, कॉन्टेंट बाइंडिंग के साथ nonce फ़ील्ड का इस्तेमाल करें
रीप्ले और इस तरह के हमलों से बचें Google Play की ओर से अपने-आप होने वाले खतरों के असर को कम करने की सुविधा सर्वर साइड लॉजिक के साथ nonce फ़ील्ड का इस्तेमाल करें

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

क्लासिक अनुरोध कभी-कभी करें

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

कैश मेमोरी में सेव किए जाने वाले नतीजों से बचना

नतीजे को कैश मेमोरी में सेव करने से, कई हमलों का खतरा बढ़ जाता है. जैसे, डेटा को बाहर निकाला जाना और उसे फिर से चलाना, जहां एक अच्छे नतीजे को किसी गैर-भरोसेमंद एनवायरमेंट से फिर से इस्तेमाल किया जाता हो. अगर आप: कोई क्लासिक अनुरोध करने और बाद में इस्तेमाल के लिए कैश मेमोरी में सेव करने पर, मांग पर मानक अनुरोध करने के बजाय यह सुझाव दिया जाता है. स्टैंडर्ड अनुरोध डिवाइस की मेमोरी में कुछ जगह होती है, लेकिन Google Play ज़्यादा सुरक्षा का इस्तेमाल करता है रीप्ले हमलों और बाहर निकाले जाने के जोखिम को कम करने की तकनीकें.

क्लासिक अनुरोधों को सुरक्षित रखने के लिए, नॉन्स फ़ील्ड का इस्तेमाल करें

Play Integrity API में, nonce नाम का फ़ील्ड होता है. इसका इस्तेमाल इन कामों के लिए किया जा सकता है इससे आपके ऐप्लिकेशन को कुछ हमलों से सुरक्षित रखा जा सकता है. जैसे, ऐप्लिकेशन को फिर से चलाने और उससे छेड़छाड़ करने पर हमले. Play Integrity API, इस फ़ील्ड में सेट की गई वैल्यू दिखाता है इंटिग्रिटी से जुड़ा साइन किया गया रिस्पॉन्स भेजा जाएगा. अपनी ऑडियंस की सूची बनाने के लिए, नॉन्स का इस्तेमाल करें.

एक्सपोनेन्शियल बैकऑफ़ के साथ क्लासिक अनुरोधों को फिर से करने की कोशिश करें

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

खास जानकारी

Play Integrity का हाई-लेवल डिज़ाइन दिखाने वाला सीक्वेंस डायग्राम
एपीआई

जब उपयोगकर्ता आपके ऐप्लिकेशन में कोई ऐसी अहम कार्रवाई करता है जिसे आपको सुरक्षित रखना है इंटिग्रिटी जांच की मदद से, इन चरणों को पूरा करें:

  1. आपके ऐप्लिकेशन का सर्वर-साइड बैकएंड, क्लाइंट-साइड लॉजिक. बाकी के चरण, इस लॉजिक को आपका "ऐप्लिकेशन" कहते हैं.
  2. आपका ऐप्लिकेशन, आपके कॉन्टेंट की यूनीक वैल्यू और कॉन्टेंट से nonce बनाता है ज़्यादा अहम कार्रवाई होनी चाहिए. इसके बाद, वह Play Integrity API को कॉल करता है, जो nonce.
  3. आपके ऐप्लिकेशन को Play Integrity से, हस्ताक्षर और एन्क्रिप्ट (सुरक्षित) किए गए नतीजे की जानकारी मिलती है एपीआई.
  4. आपका ऐप्लिकेशन, एन्क्रिप्ट (सुरक्षित) और हस्ताक्षर किए गए नतीजे को ऐप्लिकेशन के बैकएंड में पास करता है.
  5. आपके ऐप्लिकेशन का बैकएंड, Google Play सर्वर को नतीजे भेजता है. Google Play सर्वर, नतीजे को डिक्रिप्ट करके उसकी पुष्टि करता है. इसके बाद, यह आपके बैकएंड पर भी काम करता है.
  6. आपके ऐप्लिकेशन का बैकएंड, उसमें मौजूद सिग्नल के आधार पर तय करता है कि आगे क्या करना है टोकन पेलोड है.
  7. आपके ऐप्लिकेशन का बैकएंड, आपके ऐप्लिकेशन को फ़ैसले के नतीजे भेजता है.

नॉन्स जनरेट करें

जब Play Integrity API की मदद से, अपने ऐप्लिकेशन में कोई कार्रवाई सुरक्षित की जाती है, तो ये काम किए जा सकते हैं कुछ खास तरह के हमलों को कम करने के लिए, nonce फ़ील्ड का इस्तेमाल करता है. जैसे, पर्सन इन द मिडल (पीआईटीएम) के तहत, छेड़छाड़ करने और फिर से हमला करने के लिए इस्तेमाल किए जाने वाले सॉफ़्टवेयर को दिखाया गया हो. द प्ले Integrity API, हस्ताक्षर के अंदर इस फ़ील्ड में सेट की गई वैल्यू दिखाता है इंटेग्रिटी रिस्पॉन्स.

nonce फ़ील्ड में सेट की गई वैल्यू को सही तरीके से फ़ॉर्मैट किया जाना चाहिए:

  • String
  • यूआरएल की सुरक्षा
  • Base64 और नॉन-रैपिंग के तौर पर एन्कोड किया गया
  • कम से कम 16 वर्ण
  • ज़्यादा से ज़्यादा 500 वर्ण

Play में nonce फ़ील्ड का इस्तेमाल करने के कुछ सामान्य तरीके यहां दिए गए हैं Integrity API. nonce से सबसे मज़बूत सुरक्षा पाने के लिए, आपके पास इन्हें एक साथ जोड़ने का विकल्प है इन तरीकों का इस्तेमाल करें.

छेड़छाड़ से बचाने के लिए अनुरोध हैश शामिल करना

एपीआई अनुरोध के क्लासिक वर्शन में nonce पैरामीटर का इस्तेमाल, इसकी तरह ही किया जा सकता है स्टैंडर्ड एपीआई अनुरोध में requestHash पैरामीटर, ताकि से छेड़छाड़ न करने का अनुरोध करे.

पूरी सुरक्षा की जांच के नतीजे का अनुरोध करने पर:

  1. सभी ज़रूरी अनुरोध पैरामीटर का डाइजेस्ट लिखें (जैसे, किसी स्टेबल का SHA256 अनुरोध की क्रम संख्या के आधार पर) होने वाला है.
  2. nonce फ़ील्ड को कंप्यूट किए गए डाइजेस्ट की वैल्यू पर सेट करने के लिए, setNonce का इस्तेमाल करें.

पूरी सुरक्षा की जांच का नतीजा मिलने पर:

  1. इंटिग्रिटी टोकन को डिकोड करें और उसकी पुष्टि करें. साथ ही, डाइजेस्ट से nonce फ़ील्ड.
  2. अनुरोध के डाइजेस्ट को उसी तरह से समझें जैसे ऐप्लिकेशन में किया जाता है (उदाहरण के लिए, स्टेबल अनुरोध की सीरीज़ का SHA256).
  3. ऐप्लिकेशन-साइड और सर्वर-साइड डाइजेस्ट की तुलना करें. अगर वे मेल नहीं खाते हैं, तो अनुरोध भरोसेमंद नहीं है.

रीप्ले से होने वाले हमलों से बचने के लिए यूनीक वैल्यू शामिल करें

नुकसान पहुंचाने वाले उपयोगकर्ताओं को आपकी ओर से Play Integrity API, हर ऐप्लिकेशन की अलग तरह से पहचान करने के लिए, nonce फ़ील्ड का इस्तेमाल किया जा सकता है दिखाई देगा.

पूरी सुरक्षा की जांच के नतीजे का अनुरोध करने पर:

  1. दुनिया भर में यूनीक वैल्यू इस तरह पाएं कि नुकसान पहुंचाने वाले उपयोगकर्ता अनुमान न लगा सकें. उदाहरण के लिए, क्रिप्टोग्राफ़िक तौर पर सुरक्षित एक रैंडम नंबर, सर्वर साइड कोई ऐसी वैल्यू या पहले से मौजूद आईडी हो सकती है. जैसे, सेशन या ट्रांज़ैक्शन आईडी होता है. इससे आसान और कम सुरक्षित वैरिएंट यह होता है कि पहले से मौजूद है. हमारा सुझाव है कि आप 128 बिट या उससे बड़ी वैल्यू बनाएं.
  2. nonce फ़ील्ड को पहले चरण में मौजूद यूनीक वैल्यू पर सेट करने के लिए, setNonce() को कॉल करें.

पूरी सुरक्षा की जांच का नतीजा मिलने पर:

  1. इंटिग्रिटी टोकन को डिकोड करके उसकी पुष्टि करें. इसके बाद, nonce फ़ील्ड.
  2. अगर सर्वर पर, पहले चरण में चुनी गई वैल्यू जनरेट हुई है, तो देख लें कि यूनीक वैल्यू, जनरेट की गई वैल्यू में से एक थी और उसे का पहली बार इस्तेमाल किया है (आपके सर्वर को जनरेट की गई अवधि के लिए वैल्यू). अगर भेजी गई यूनीक वैल्यू का इस्तेमाल किया गया है रिकॉर्ड में पहले से नहीं दिख रहा है या नहीं दिख रहा है, तो अनुरोध अस्वीकार करें
  3. या फिर, अगर डिवाइस पर यूनीक वैल्यू जनरेट हुई थी, तो जांच लें कि प्राप्त मान का पहली बार उपयोग किया जा रहा है (आपके सर्वर को (तय अवधि के लिए, पहले से देखी गई वैल्यू का रिकॉर्ड). अगर आपको अद्वितीय मान का पहले ही उपयोग किया जा चुका है, अनुरोध नामंजूर करें.

ऐप्लिकेशन में छेड़छाड़ करने और उसे फिर से चलाने पर होने वाले हमलों से सुरक्षा के लिए, दोनों सुविधाओं का एक साथ इस्तेमाल करें (इसका सुझाव दिया जाता है)

nonce फ़ील्ड का इस्तेमाल करके, ऐप्लिकेशन के साथ होने वाली छेड़छाड़ से बचा जा सकता है को फिर से चलाएं. ऐसा करने के लिए, इस रूप में यूनीक वैल्यू जनरेट करें ऊपर बताया गया है और इसे अपने अनुरोध में शामिल करें. फिर हैश का अनुरोध करें, ताकि हैश के हिस्से के रूप में यूनीक वैल्यू शामिल की जा सके. अगर आप नीचे बताए गए तरीके से इन दोनों तरीकों को लागू किया जा सकता है:

पूरी सुरक्षा की जांच के नतीजे का अनुरोध करने पर:

  1. उपयोगकर्ता अहम कार्रवाई शुरू करता है.
  2. इस कार्रवाई के लिए यूनीक वैल्यू पाएं. इसके बारे में, यूनीक वैल्यू शामिल करें वैल्यू को फिर से चलाने के हमलों से बचाने के लिए सेक्शन में बताया गया है.
  3. वह मैसेज तैयार करें जिसे आपको सुरक्षित करना है. दूसरे चरण में दी गई यूनीक वैल्यू शामिल करें दिखाई देता है.
  4. आपका ऐप्लिकेशन जिस मैसेज की सुरक्षा करना चाहता है उसके डाइजेस्ट का हिसाब इस तरह लगाता है डेटा को सुरक्षित रखने के लिए, अनुरोध हैश को शामिल करना छेड़छाड़ करना सेक्शन में बताया गया है. चूंकि संदेश में वैल्यू, यूनीक वैल्यू हैश का हिस्सा होती है.
  5. nonce फ़ील्ड को कंप्यूट किए गए डाइजेस्ट पर सेट करने के लिए, setNonce() का इस्तेमाल करें पिछला चरण.

पूरी सुरक्षा की जांच का नतीजा मिलने पर:

  1. अनुरोध से यूनीक वैल्यू पाएं
  2. इंटिग्रिटी टोकन को डिकोड करें और उसकी पुष्टि करें. साथ ही, डाइजेस्ट से nonce फ़ील्ड.
  3. जैसा कि छेड़छाड़ से बचाने के लिए, अनुरोध हैश शामिल करना सेक्शन में बताया गया है सेक्शन में, सर्वर साइड पर डाइजेस्ट की फिर से गिनती करें और देखें कि यह मेल खाता है या नहीं इंटिग्रिटी टोकन से मिला डाइजेस्ट.
  4. जैसा कि में बताया गया है, वीडियो को फिर से चलाने से रोकने के लिए यूनीक वैल्यू शामिल करें हमले सेक्शन में, यूनीक वैल्यू की वैधता की जांच करें.

नीचे दिए गए डायग्राम में, इन चरणों को सर्वर साइड के साथ दिखाया गया है nonce:

सीक्वेंस डायग्राम, जिसमें छेड़छाड़ करने और फिर से चलाने, दोनों से बचने का तरीका बताया गया है
हमले

पूरी सुरक्षा की जांच के नतीजे का अनुरोध करना

nonce जनरेट करने के बाद, Google से पूरी सुरक्षा की जांच के नतीजे का अनुरोध किया जा सकता है ऐप्लिकेशन चलाएं. इसके लिए, नीचे दिया गया तरीका अपनाएं:

  1. IntegrityManager बनाएं, जैसा कि इन उदाहरणों में दिखाया गया है.
  2. एक IntegrityTokenRequest बनाएं, जो nonce को जुड़े हुए बिल्डर में setNonce() तरीका है. खास तौर पर उपलब्ध कराए गए ऐप्लिकेशन और SDK टूल के लिए, Google Play से बाहर के डेवलपर को अपना Google Cloud तय करना होगा setCloudProjectNumber() तरीके से प्रोजेक्ट नंबर डाला जाता है. Google पर ऐप्लिकेशन Play को, Play Console के किसी Cloud प्रोजेक्ट से लिंक किया गया है. इसे खेलने की ज़रूरत नहीं है अनुरोध में क्लाउड प्रोजेक्ट का नंबर सेट करें.
  3. requestIntegrityToken() पर कॉल करने के लिए मैनेजर का इस्तेमाल करें. IntegrityTokenRequest.

Kotlin

// Receive the nonce from the secure server.
val nonce: String = ...

// Create an instance of a manager.
val integrityManager =
    IntegrityManagerFactory.create(applicationContext)

// Request the integrity token by providing a nonce.
val integrityTokenResponse: Task<IntegrityTokenResponse> =
    integrityManager.requestIntegrityToken(
        IntegrityTokenRequest.builder()
             .setNonce(nonce)
             .build())

Java

import com.google.android.gms.tasks.Task; ...

// Receive the nonce from the secure server.
String nonce = ...

// Create an instance of a manager.
IntegrityManager integrityManager =
    IntegrityManagerFactory.create(getApplicationContext());

// Request the integrity token by providing a nonce.
Task<IntegrityTokenResponse> integrityTokenResponse =
    integrityManager
        .requestIntegrityToken(
            IntegrityTokenRequest.builder().setNonce(nonce).build());

यूनिटी

IEnumerator RequestIntegrityTokenCoroutine() {
    // Receive the nonce from the secure server.
    var nonce = ...

    // Create an instance of a manager.
    var integrityManager = new IntegrityManager();

    // Request the integrity token by providing a nonce.
    var tokenRequest = new IntegrityTokenRequest(nonce);
    var requestIntegrityTokenOperation =
        integrityManager.RequestIntegrityToken(tokenRequest);

    // Wait for PlayAsyncOperation to complete.
    yield return requestIntegrityTokenOperation;

    // Check the resulting error code.
    if (requestIntegrityTokenOperation.Error != IntegrityErrorCode.NoError)
    {
        AppendStatusLog("IntegrityAsyncOperation failed with error: " +
                requestIntegrityTokenOperation.Error);
        yield break;
    }

    // Get the response.
    var tokenResponse = requestIntegrityTokenOperation.GetResult();
}

मूल भाषा वाला

/// Create an IntegrityTokenRequest opaque object.
const char* nonce = RequestNonceFromServer();
IntegrityTokenRequest* request;
IntegrityTokenRequest_create(&request);
IntegrityTokenRequest_setNonce(request, nonce);

/// Prepare an IntegrityTokenResponse opaque type pointer and call
/// IntegerityManager_requestIntegrityToken().
IntegrityTokenResponse* response;
IntegrityErrorCode error_code =
        IntegrityManager_requestIntegrityToken(request, &response);

/// ...
/// Proceed to polling iff error_code == INTEGRITY_NO_ERROR
if (error_code != INTEGRITY_NO_ERROR)
{
    /// Remember to call the *_destroy() functions.
    return;
}
/// ...
/// Use polling to wait for the async operation to complete.
/// Note, the polling shouldn't block the thread where the IntegrityManager
/// is running.

IntegrityResponseStatus response_status;

/// Check for error codes.
IntegrityErrorCode error_code =
        IntegrityTokenResponse_getStatus(response, &response_status);
if (error_code == INTEGRITY_NO_ERROR
    && response_status == INTEGRITY_RESPONSE_COMPLETED)
{
    const char* integrity_token = IntegrityTokenResponse_getToken(response);
    SendTokenToServer(integrity_token);
}
/// ...
/// Remember to free up resources.
IntegrityTokenRequest_destroy(request);
IntegrityTokenResponse_destroy(response);
IntegrityManager_destroy();

पूरी सुरक्षा की जांच के नतीजे को डिक्रिप्ट करें और उसकी पुष्टि करें

पूरी सुरक्षा की जांच के नतीजे का अनुरोध करने पर, Play Integrity API, डेवलपर के लिए रिस्पॉन्स टोकन का इस्तेमाल नहीं करेगा. आपके अनुरोध में शामिल किया गया nonce, रिस्पॉन्स टोकन का इस्तेमाल नहीं करेगा.

टोकन का फ़ॉर्मैट

टोकन एक नेस्ट किया गया JSON Web Token (JWT) है, जो क्या JSON वेब एन्क्रिप्शन (JWE) चालू है JSON वेब सिग्नेचर (JWS) की सूची में शामिल है. JWE और JWS कॉम्पोनेंट को कॉम्पैक्ट (कॉम्पैक्ट) तरीके से दिखाया जाता है क्रम से लगाना को अपनाएं.

एन्क्रिप्शन / साइनिंग एल्गोरिदम, अलग-अलग JWT में काम करते हैं लागू करना:

  • JWE, A256KW का इस्तेमाल इन कामों के लिए करता है alg और enc के लिए A256GCM

  • JWS, ES256 का इस्तेमाल करता है.

Google के सर्वर पर डिक्रिप्ट करें और पुष्टि करें (सुझाया गया)

Play Integrity API की मदद से, पूरी सुरक्षा की जांच के नतीजे को डिक्रिप्ट किया जा सकता है और इसकी पुष्टि की जा सकती है: Google के सर्वर, जो आपके ऐप्लिकेशन की सुरक्षा को बेहतर बनाते हैं. इसके लिए, इन शर्तों को पूरा करें चरण:

  1. सेवा खाता बनाना आपके ऐप्लिकेशन से जुड़े हुए Google Cloud प्रोजेक्ट में.
  2. अपने ऐप्लिकेशन के सर्वर पर, अपने सेवा खाते से ऐक्सेस टोकन पाएं playintegrity स्कोप का इस्तेमाल करने वाले क्रेडेंशियल और ये अनुरोध करें:

    playintegrity.googleapis.com/v1/PACKAGE_NAME:decodeIntegrityToken -d \
    '{ "integrity_token": "INTEGRITY_TOKEN" }'
  3. JSON का जवाब पढ़ें.

स्थानीय तौर पर डिक्रिप्ट और पुष्टि करें

अगर जवाब को एन्क्रिप्ट करने वाली कुंजियों को मैनेज और डाउनलोड करने का विकल्प चुना जाता है, तो अपने सुरक्षित सर्वर एनवायरमेंट में, लौटाए गए टोकन को डिक्रिप्ट करें और उनकी पुष्टि करें. IntegrityTokenResponse#token() का इस्तेमाल करके, लौटाया गया टोकन पाया जा सकता है तरीका.

नीचे दिए गए उदाहरण में एईएस कुंजी और DER कोड में बदले गए सार्वजनिक डेटा को डिकोड करने का तरीका बताया गया है Play Console से किसी भाषा के लिए हस्ताक्षर की पुष्टि करने के लिए ईसी कुंजी (हमारे मामले में Java प्रोग्रामिंग भाषा) कुंजियां हैं. नोट जोड़ें कि डिफ़ॉल्ट फ़्लैग का इस्तेमाल करके पासकोड, base64 की मदद से कोड में बदला गया है.

Kotlin

// base64OfEncodedDecryptionKey is provided through Play Console.
var decryptionKeyBytes: ByteArray =
    Base64.decode(base64OfEncodedDecryptionKey, Base64.DEFAULT)

// Deserialized encryption (symmetric) key.
var decryptionKey: SecretKey = SecretKeySpec(
    decryptionKeyBytes,
    /* offset= */ 0,
    AES_KEY_SIZE_BYTES,
    AES_KEY_TYPE
)

// base64OfEncodedVerificationKey is provided through Play Console.
var encodedVerificationKey: ByteArray =
    Base64.decode(base64OfEncodedVerificationKey, Base64.DEFAULT)

// Deserialized verification (public) key.
var verificationKey: PublicKey = KeyFactory.getInstance(EC_KEY_TYPE)
    .generatePublic(X509EncodedKeySpec(encodedVerificationKey))

Java

// base64OfEncodedDecryptionKey is provided through Play Console.
byte[] decryptionKeyBytes =
    Base64.decode(base64OfEncodedDecryptionKey, Base64.DEFAULT);

// Deserialized encryption (symmetric) key.
SecretKey decryptionKey =
    new SecretKeySpec(
        decryptionKeyBytes,
        /* offset= */ 0,
        AES_KEY_SIZE_BYTES,
        AES_KEY_TYPE);

// base64OfEncodedVerificationKey is provided through Play Console.
byte[] encodedVerificationKey =
    Base64.decode(base64OfEncodedVerificationKey, Base64.DEFAULT);
// Deserialized verification (public) key.
PublicKey verificationKey =
    KeyFactory.getInstance(EC_KEY_TYPE)
        .generatePublic(new X509EncodedKeySpec(encodedVerificationKey));

इसके बाद, इन कुंजियों का इस्तेमाल करके सबसे पहले इंटिग्रिटी टोकन (JWE का हिस्सा) को डिक्रिप्ट करें और इसके बाद JWS के नेस्ट किए गए हिस्से की पुष्टि करें और उसे एक्सट्रैक्ट करें.

Kotlin

val jwe: JsonWebEncryption =
    JsonWebStructure.fromCompactSerialization(integrityToken) as JsonWebEncryption
jwe.setKey(decryptionKey)

// This also decrypts the JWE token.
val compactJws: String = jwe.getPayload()

val jws: JsonWebSignature =
    JsonWebStructure.fromCompactSerialization(compactJws) as JsonWebSignature
jws.setKey(verificationKey)

// This also verifies the signature.
val payload: String = jws.getPayload()

Java

JsonWebEncryption jwe =
    (JsonWebEncryption)JsonWebStructure
        .fromCompactSerialization(integrityToken);
jwe.setKey(decryptionKey);

// This also decrypts the JWE token.
String compactJws = jwe.getPayload();

JsonWebSignature jws =
    (JsonWebSignature) JsonWebStructure.fromCompactSerialization(compactJws);
jws.setKey(verificationKey);

// This also verifies the signature.
String payload = jws.getPayload();

नतीजे के तौर पर मिलने वाला पेलोड, सादा टेक्स्ट वाला टोकन होता है. इसमें पूरी सुरक्षा देने की सुविधा होती है नतीजे.