इस लेख में, अपने ऐप्लिकेशन और गेम के लिए Google Play की छेड़छाड़ से सुरक्षा की सुविधा को ज़रूरत के मुताबिक बनाने का तरीका बताया गया है. इस पेज पर बताई गई, अपनी ज़रूरत के हिसाब से बनाने की सुविधाओं का इस्तेमाल करने के लिए, यह ज़रूरी है कि Google Play Console में ऑटोमैटिक प्रोटेक्शन के साथ-साथ, छेड़छाड़ से सुरक्षा की सुविधा चालू हो.
ज़रूरत के मुताबिक सेट अप की गई, छेड़छाड़ से सुरक्षा की सुविधा के बारे में जानकारी
ज़रूरत के मुताबिक सेट अप की गई, छेड़छाड़ से सुरक्षा की सुविधा से अपने ऐप्लिकेशन में Java और Kotlin के लिए दिए गए उन तरीकों की पहचान की जा सकती है जिनके लिए बेहतर सुरक्षा की ज़रूरत पड़ती है. जब Google Play पर आपके ऐप्लिकेशन की रिलीज़ अपलोड की जाती है, तब Google Play इन तरीकों के लिए बेहतर सुरक्षा को प्राथमिकता देता है.
बेहतर सुरक्षा के लिए इन तरीकों की पहचान करके, अपने ऐप्लिकेशन को छेड़छाड़ से बचाने के लिए सुरक्षा को और बेहतर बनाया जा सकता है. बाइनरी से क्लाइंट सीक्रेट (जैसे, संवेदनशील कुंजियां या ऐसे यूआरएल जो ऐप्लिकेशन में होने चाहिए) चोरी होने से बचाने के लिए, तरीके को सुरक्षित रखने वाली सुविधा का भी इस्तेमाल किया जा सकता है.
ज़रूरत के मुताबिक सेट अप की गई, छेड़छाड़ से सुरक्षा की सुविधा लागू करना
अपने ऐप्लिकेशन के कोड बेस में ज़रूरत के मुताबिक बनाई गई, छेड़छाड़ से सुरक्षा की सुविधा लागू करने के लिए यह तरीका अपनाएं.
पहला चरण: अपने कोड बेस में ऑटोमैटिक प्रोटेक्शन के लिए इंटरफ़ेस जोड़ें
सबसे पहले, अपने ऐप्लिकेशन या गेम में सुरक्षा के लिए इंटरफ़ेस जोड़ें.
Kotlin:
package com.google.android.play.protections.annotations/**
* इससे पता चलता है कि यह तरीका, बेहतर सुरक्षा के लिए सही है.
*
* <p>जब Google Play आपके बंडल की सुरक्षा करता है, तब यह एनोटेशन आपके
* बंडल के dex कोड से अपने-आप हटा देगा. इसका इस्तेमाल सिर्फ़
* लेवल एनोटेशन के तौर पर करें. किसी अन्य तरह से इस्तेमाल करने पर (जैसे, रनटाइम के दौरान Reflection API का इस्तेमाल करके क्लास
* को ऐक्सेस करना), यह सुविधा काम नहीं करती.
*/
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
public annotation class PlayAutomaticIntegrityProtection() {}
Java:
package com.google.android.play.protections.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* इससे पता चलता है कि यह तरीका, बेहतर सुरक्षा के लिए सही है.
*
* <p>जब Google Play आपके बंडल की सुरक्षा करता है, तब यह एनोटेशन आपके
* बंडल के dex कोड से अपने-आप हटा देगा. इसका इस्तेमाल सिर्फ़
* कोड लेवल एनोटेशन के तौर पर करें. किसी अन्य तरह से इस्तेमाल करने पर (जैसे, रनटाइम के दौरान Reflection API का इस्तेमाल करके क्लास
* को ऐक्सेस करना), यह सुविधा काम नहीं करती.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PlayAutomaticIntegrityProtection {}
# एनोटेशन क्लास और उसके प्रोग्रामिंग एलिमेंट (Java और Kotlin) को रहने दें.
-keep class com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection* { *; }
# ProGuard डिफ़ॉल्ट रूप से, सभी एनोटेशन एट्रिब्यूट को विकल्प के तौर पर मानता है और
# उन्हें कोड को अस्पष्ट बताने वाले चरण में हटा देता है. इस कॉन्फ़िगरेशन कोड से यह पक्का किया जाएगा कि एनोटेशन एट्रिब्यूट सेव रखे जाएं.
-keepattributes RuntimeVisibleAnnotations, AnnotationDefault
# उन सभी तरीकों का इस्तेमाल करना जारी रखें जिनमें एनोटेशन शामिल है, लेकिन उन्हें अस्पष्ट बनाने की अनुमति दें.
-keepclassmembers,allowobfuscation class * {
@com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection *;
}
दूसरा चरण: कस्टम प्रोटेक्शन के लिए तरीकों को एनोटेट करें
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection
@PlayAutomaticIntegrityProtection()
fun myMethod() {
// Method body...
}
Java
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection;
@PlayAutomaticIntegrityProtection()
public void myMethod() {
// Method body...
}तीसरा चरण: (ज़रूरी नहीं है) क्लाइंट-साइड सीक्रेट सुरक्षित रखें
कस्टम प्रोटेक्शन वाला तरीका, एनोटेट किए गए तरीके के मुख्य हिस्से में मौजूद कोड को सीधे तौर पर अस्पष्ट कर देता है. इसका इस्तेमाल, संवेदनशील एपीआई पासकोड को सुरक्षित रखने के लिए किया जा सकता है.
Kotlin:
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection
@PlayAutomaticIntegrityProtection()
fun callApi() {
api.connect("YOUR_API_KEY")
}
Java:
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection;
@PlayAutomaticIntegrityProtection()
public static void callApi() {
api.connect("YOUR_API_KEY");
}
चौथा चरण: (ज़रूरी नहीं है) सुरक्षा की वजह से परफ़ॉर्मेंस पर पड़ने वाले असर को मैनेज करें
डिफ़ॉल्ट रूप से, किसी सुरक्षित किए गए तरीके को लागू करने में कुछ मिलीसेकंड ज़्यादा लगते हैं. इसलिए, इसे परफ़ॉर्मेंस के हिसाब से संवेदनशील स्थितियों में या मुख्य थ्रेड पर लागू नहीं किया जाना चाहिए.
अगर आपको किसी ऐसे तरीके को सुरक्षित रखना है जिसमें तेज़ी से काम करना ज़रूरी है, तो कम सुरक्षा वाला एक मोड उपलब्ध है. तेज़ी से ऐक्सेस करने के लिए, एनोटेशन एट्रिब्यूट का इस्तेमाल किया जा सकता है. यह एट्रिब्यूट, स्टार्टअप के समय लोड होता है. हालांकि, इससे मिलने वाली सुरक्षा ज़्यादा मज़बूत नहीं होती.
Kotlin:
@PlayAutomaticIntegrityProtection(loadAtStartup = true)
fun callApi() {
api.connect("YOUR_API_KEY")
}
Java:
@PlayAutomaticIntegrityProtection(loadAtStartup = true)
public static void callApi() {
api.connect("YOUR_API_KEY");
}
इसका इस्तेमाल करने के लिए, पहले चरण में दिए गए एनोटेशन की असल परिभाषा के मुख्य हिस्से में इंटरफ़ेस एट्रिब्यूट जोड़ें:
// Kotlin एनोटेशन की परिभाषा में बदलाव
public annotation class PlayAutomaticIntegrityProtection(
/**
* अगर यह वैल्यू 'सही है' पर सेट है, तो एनोटेट किया गया तरीका स्टार्टअप के समय लोड हो जाएगा. अगर यह वैल्यू 'गलत है' पर सेट है, तो इसे
* ज़रूरत पड़ने पर लोड किया जाएगा.
*
* <p>ज़रूरत पड़ने पर लोड करने के लिए, इस तरीके को लागू करने पर परफ़ॉर्मेंस
* पर असर पड़ेगा. स्टार्टअप के समय लोड करने के लिए, यह तरीका
* ऐप्लिकेशन के चालू रहने तक मेमोरी में डिकोड की गई स्थिति में रहेगा.
*/
val loadAtStartup: Boolean = false
) {}
पांचवां चरण: अपने ऐप्लिकेशन की जांच करें
तरीके चुनने के बारे में सबसे असरदार बातें
तरीकों को सोच-समझकर चुनने से, आपका ऐप्लिकेशन ज़्यादा सुरक्षित रहता है. अगर हर नई रिलीज़ में, सुरक्षा के लिए नया तरीका इस्तेमाल किया जाता है, तो ऐप्लिकेशन या गेम के उस वर्शन को हैक करना ज़्यादा मुश्किल हो जाएगा.
अपने ऐप्लिकेशन की परफ़ॉर्मेंस पर पड़ने वाले असर को कम करने के लिए, बार-बार इस्तेमाल होने वाले तरीके के बजाय खास स्थितियों में इस्तेमाल होने वाले तरीके चुनें. ज़्यादा से ज़्यादा सुरक्षा के लिए, ऐसे तरीके चुनें जो:
- ऐप्लिकेशन के लिए बहुत ज़रूरी हों (अगर उन्हें हटाया जाता है, तो ऐप्लिकेशन काम नहीं कर पाएगा).
- मुख्य/यूज़र इंटरफ़ेस (यूआई) थ्रेड में लागू नहीं किए गए हों.
- ऐप्लिकेशन के चालू रहने के दौरान, एक से ज़्यादा बार लागू किए जाते हों. हालांकि, उन्हें बार-बार लागू नहीं करना चाहिए.
- मुश्किल नहीं हों (ऐसे तरीके जिनमें मुश्किल कोड या डेटा शामिल हो).
- स्टार्टअप के दौरान लागू नहीं किए जाते हों. ऐसा तब नहीं करना चाहिए, जब मुमकिन हो.
- ऐप्लिकेशन की रिलीज़ में पहली बार इस्तेमाल किए गए हों या उनमें काफ़ी बदलाव किया गया हो.
- ऐब्स्ट्रैक्ट न हों, इंटरफ़ेस वाले न हों या कंस्ट्रक्टर न हों.
- Reflection API का इस्तेमाल और किसी नेटिव लाइब्रेरी को सीधे तौर पर लोड न करते हों.
ज़रूरत के मुताबिक सेट अप की गई, छेड़छाड़ से सुरक्षा की सुविधा हटाना
अगर आपको किसी खास तरीके को सुरक्षित नहीं रखना है, तो @PlayAutomaticIntegrityProtection() एनोटेशन को आसानी से हटाया जा सकता है.