एंड्रॉइड में एक्सेस टोकन और रहस्य को सुरक्षित रूप से कैसे स्टोर करें?


123

मैं Google से मेल और संपर्क लाने के लिए oAuth का उपयोग करने जा रहा हूं। मैं एक्सेस टोकन और गुप्त प्राप्त करने के लिए लॉग इन करने के लिए हर बार उपयोगकर्ता से पूछना नहीं चाहता। मुझे जो समझ में आया, मुझे उन्हें अपने आवेदन के साथ या तो डेटाबेस में संग्रहीत करना होगा SharedPreferences। लेकिन मैं इसके साथ सुरक्षा पहलुओं को लेकर थोड़ा चिंतित हूं। मैंने पढ़ा कि आप टोकन को एन्क्रिप्ट कर सकते हैं और डिक्रिप्ट कर सकते हैं, लेकिन किसी हमलावर के लिए यह आसान है कि वह आपके एपीके और क्लासेज को डिकम्पोज कर दे और एन्क्रिप्शन कुंजी प्राप्त कर ले।
एंड्रॉइड में इन टोकन को सुरक्षित रूप से संग्रहीत करने का सबसे अच्छा तरीका क्या है?


1
मैं उपभोक्ता कुंजी और गुप्त कैसे संग्रहीत करूं (उन्हें सुरक्षित नहीं किया गया है)? मुझे उनसे एक्सेस्टोकेन और रहस्य का अनुरोध करने की आवश्यकता है .. अन्य मौजूदा एप्लिकेशन ओउथ का उपयोग कैसे करते हैं? हम्म के साथ आखिरकार, आपको मेरे लिए और अधिक सुरक्षा के मुद्दों पर ध्यान देने की आवश्यकता है .... मुझे उपभोक्ता टोकन / गुप्त रूप से रखने की आवश्यकता है और साथ ही accesstoken और गुप्त .... अंत में यह अधिक सरल नहीं होगा बस उपयोगकर्ता का उपयोगकर्ता नाम / पासवर्ड एन्क्रिप्ट किया गया है? ... अंत में, क्या बाद वाला बेहतर नहीं है? मैं अभी भी नहीं देख सकता कि कैसे बेहतर है ...
यमन

क्या आप मुझे बता सकते हैं..जिसकी फाइल एक्सेस टोकन स्टोर करती है ?? मैं एंड्रॉइड में नया हूं और मैंने सैंपल प्लस ऐप चलाने की कोशिश की है। लेकिन मुझे यह कहीं भी नहीं मिल रहा है [GoogleAuthUtil.getToken () विधि।]
अभिषेक कौशिक

जवाबों:


117

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

वास्तविक उपयोगकर्ता नाम पासवर्ड के बजाय टोकन के भंडारण के कुछ लाभ हैं:

  • तृतीय पक्ष एप्लिकेशन को पासवर्ड जानने की आवश्यकता नहीं है और उपयोगकर्ता यह सुनिश्चित कर सकते हैं कि वे इसे केवल मूल साइट (फेसबुक, ट्विटर, जीमेल, आदि) पर भेज दें।
  • यहां तक ​​कि अगर कोई टोकन चोरी करता है, तो उन्हें पासवर्ड देखने को नहीं मिलता है (जो उपयोगकर्ता अन्य साइटों पर भी उपयोग कर सकता है)
  • टोकन आम तौर पर एक जीवनकाल होता है और एक निश्चित समय के बाद समाप्त हो जाता है
  • यदि आपको संदेह है कि उन्हें समझौता किया गया है, तो टोकन रद्द किए जा सकते हैं

1
उत्तर के लिए thx! लेकिन मुझे कैसे पता चलेगा कि मेरी उपभोक्ता कुंजी से समझौता किया गया है? lol यह बताना कठिन होगा .. ठीक है कि एक्सेस टोकन और गुप्त भंडारण के बारे में, ठीक है, मैं उन्हें साझा करने के संदर्भ में सहेजता हूं और उन्हें एन्क्रिप्ट करता हूं लेकिन उपभोक्ता कुंजी और गुप्त के बारे में कैसे? मैं उन्हें साझाकरण में संग्रहीत नहीं कर सकता (मुझे स्पष्ट रूप से उपभोक्ता कुंजी और कोड को गुप्त रूप से इसे पहले स्थान पर साझा करने में बचाने के लिए लिखना होगा) .. पता नहीं है कि क्या आप समझते हैं कि मेरा क्या मतलब है।
यशमान

2
आपको या तो एप्लिकेशन को कुछ (कुछ हद तक) बाधित तरीके से डालना होगा, वे विघटित होने के तुरंत बाद दिखाई नहीं देते हैं, या अपने स्वयं के निजीकरण प्रॉक्सी वेबएप का उपयोग करते हैं जिसमें कुंजी और गुप्त है। उन्हें ऐप में डालना स्पष्ट रूप से आसान है, और अगर आपको लगता है कि आपके ऐप को क्रैक करने की कोशिश करने वाले किसी व्यक्ति का जोखिम काफी कम है, तो उस दृष्टिकोण को अपनाएं। BTW, ऊपर दिए गए बिंदु उपयोगकर्ता पासवर्ड के लिए हैं। यदि आपको पता चलता है कि आपकी उपभोक्ता कुंजी / रहस्य से छेड़छाड़ की गई है, तो आप उन्हें भी रद्द कर सकते हैं (हालांकि, निश्चित रूप से, आपके ऐप को तोड़ देगा)।
निकोले एलेनकोव

1
@NikolayElenkov: आपने लिखा था 'एन्क्रिप्शन के लिए, आपको उपयोगकर्ता को हर बार डिक्रिप्ट पासफ़्रेज़ में प्रवेश करने की आवश्यकता होती है (इस प्रकार कैशिंग क्रेडेंशियल्स के उद्देश्य को पराजित करना), या किसी फ़ाइल की कुंजी को सहेजना, और आपको एक ही समस्या मिलती है।' । क्या होगा अगर पटाखे आपके एप्लिकेशन को अंतर्दृष्टि प्राप्त करने के लिए रिवर्स करते हैं कि एन्क्रिप्शन कैसे काम करता है? आपका बचाव टूट सकता है। देशी कोड का उपयोग करके ऐसी जानकारी (टोकन, एन्क्रिप्शन ...) को स्टोर करना सबसे अच्छा अभ्यास है?
10

1
यदि ऐप डेटा साफ़ हो जाता है, तो ताज़ा टोकन खो जाता है, जो कि शायद उपयोगकर्ता नहीं चाहता था।
आरडीएस

1
यह अब एक दिन के लिए टोकन स्टोर करने का सबसे अच्छा तरीका नहीं है!
राहुल रस्तोगी

19

आप उन्हें खाता प्रबंधक में संग्रहीत कर सकते हैं । यह इन लोगों के अनुसार सबसे अच्छा अभ्यास माना जाता है।

यहाँ छवि विवरण दर्ज करें

यहाँ आधिकारिक परिभाषा है:

यह वर्ग उपयोगकर्ता के ऑनलाइन खातों की एक केंद्रीकृत रजिस्ट्री तक पहुँच प्रदान करता है। उपयोगकर्ता "वन-क्लिक" अनुमोदन के साथ ऑनलाइन संसाधनों तक पहुंच प्रदान करते हुए, प्रति खाते में एक बार क्रेडेंशियल (उपयोगकर्ता नाम और पासवर्ड) दर्ज करता है।

खाता प्रबंधक का उपयोग करने के बारे में विस्तृत जानकारी के लिए:

हालाँकि, अंत में खाता प्रबंधक केवल एक सादे पाठ के रूप में आपके टोकन को संग्रहीत करता है। इसलिए, मैं आपको खाता प्रबंधक में उन्हें संग्रहीत करने से पहले अपने रहस्य को एन्क्रिप्ट करने का सुझाव दूंगा। आप AESCrypt या AESCrypto जैसी विभिन्न एन्क्रिप्शन लाइब्रेरी का उपयोग कर सकते हैं

एक अन्य विकल्प कंसील लाइब्रेरी का उपयोग करना है । यह फेसबुक के लिए पर्याप्त सुरक्षित है और खाता प्रबंधक की तुलना में उपयोग करने में बहुत आसान है। यहाँ एक कोड स्निपेट है जिसे कॉनकॉल का उपयोग करके एक गुप्त फ़ाइल को सहेजना है।

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);

2
अच्छा टिप कि कंसीलर। उपयोग करने में बहुत आसान लगता है। और कई उपयोग के मामलों के लिए।
लागोस

लिंक के माध्यम से Conceal नहीं मिल सका। इसे निष्क्रिय किया जा सकता है
user1114

10

SharedPreferences नहीं है एक सुरक्षित स्थान में ही। एक निहित डिवाइस पर हम आसानी से सभी अनुप्रयोगों को साझा कर सकते हैं और संशोधित कर सकते हैं 'SharedPreferools xml's। तो टोकन अपेक्षाकृत बार-बार समाप्त हो जाना चाहिए। लेकिन भले ही हर घंटे एक टोकन समाप्त हो जाता है, लेकिन नए टोकन अभी भी SharedPreferences से चुराए जा सकते हैं। Android KeyStore को क्रिप्टोग्राफ़िक कुंजियों के दीर्घकालिक भंडारण और पुनर्प्राप्ति के लिए उपयोग किया जाना चाहिए जो कि हमारे साझाकरणों को एन्क्रिप्ट करने के लिए उपयोग किया जाएगा, जैसे कि SharedPreferences या डेटाबेस में। कुंजियाँ किसी एप्लिकेशन की प्रक्रिया के भीतर संग्रहीत नहीं की जाती हैं, इसलिए उनका समझौता किया जाना कठिन है।

किसी स्थान की तुलना में अधिक प्रासंगिक यह है कि वे स्वयं कैसे सुरक्षित हो सकते हैं जैसे कि क्रिप्टोग्राफिक रूप से हस्ताक्षरित अल्प-आयु वाले जेडब्ल्यूटी का उपयोग करके, एंड्रॉइड कीस्टोर का उपयोग करके उन्हें एन्क्रिप्ट करना और उन्हें सुरक्षित प्रोटोकॉल के साथ भेजना।


9
फिर हम उन्हें कहाँ स्टोर कर सकते हैं?
मिलिंद मेवाड़ा

2
  1. अपने एंड्रॉइड स्टूडियो के प्रोजेक्ट पेन से, "प्रोजेक्ट फाइल्स" चुनें और अपने प्रोजेक्ट के रूट डायरेक्टरी में "keystore.properties" नामक एक नई फाइल बनाएं।

यहाँ छवि विवरण दर्ज करें

  1. "Keystore.properties" फ़ाइल खोलें और फ़ाइल में अपना एक्सेस टोकन और सीक्रेट सेव करें।

यहाँ छवि विवरण दर्ज करें

  1. अब अपने ऐप मॉड्यूल की बिल्ड.ग्रेड फ़ाइल में एक्सेस टोकन एंड सीक्रेट को पढ़ें । फिर आपको अपने एक्सेस टोकन और सीक्रेट के लिए BuildConfig वैरिएबल को परिभाषित करने की आवश्यकता है ताकि आप सीधे अपने कोड से उन्हें एक्सेस कर सकें। आपका build.gradle निम्नलिखित की तरह लग सकता है:

    ... ... ... 
    
    android {
        compileSdkVersion 26
    
        // Load values from keystore.properties file
        def keystorePropertiesFile = rootProject.file("keystore.properties")
        def keystoreProperties = new Properties()
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
        defaultConfig {
            applicationId "com.yourdomain.appname"
            minSdkVersion 16
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            // Create BuildConfig variables
            buildConfigField "String", "ACCESS_TOKEN", keystoreProperties["ACCESS_TOKEN"]
            buildConfigField "String", "SECRET", keystoreProperties["SECRET"]
        }
    }
  2. आप अपने एक्सेस टोकन और सीक्रेट का उपयोग अपने कोड में इस तरह कर सकते हैं:

    String accessToken = BuildConfig.ACCESS_TOKEN;
    String secret = BuildConfig.SECRET;

इस तरह आपको अपने प्रोजेक्ट के अंदर सादे पाठ में एक्सेस टोकन और सीक्रेट को स्टोर करने की आवश्यकता नहीं है। इसलिए अगर कोई आपका एपीके अपघटित कर देता है, तो भी उन्हें आपका एक्सेस टोकन और सीक्रेट कभी नहीं मिलेगा, क्योंकि आप उन्हें बाहरी फाइल से लोड कर रहे हैं।


1
ऐसा लगता है कि हार्ड कोडिंग के बजाय गुण फ़ाइल बनाने में कोई अंतर नहीं है।
Dzshean

मैं रन टाइम पर टोकन लिखना चाहता हूं हो सकता है मेरा ऐप खोलने पर हर बार मेरा टोकन बदल जाए।
रेहान सरवर

1
यह एपीआई एक्सेस टोकन जैसे कुछ टोकन स्टोर करने का एक बहुत अच्छा तरीका है। यदि आप उपयोगकर्ता क्रेडेंशियल्स को स्टोर करना चाहते हैं तो NDK एक बेहतर तरीका है।
एरिक

7
यह बिल्कुल नहीं है कि आपको अपने आवेदन में संवेदनशील जानकारी संग्रहीत करने के बारे में कैसे जाना चाहिए! भले ही रिपॉजिटरी में इस दृष्टिकोण का उपयोग करके डेटा शामिल नहीं है (डेटा को बिल्ड प्रक्रिया में इंजेक्ट किया जाता है) यह एक BuildConfig फ़ाइल को उत्पन्न करता है जिसमें एक सरल अपघटन के बाद देखने के लिए सभी के लिए सादे पाठ में टोकन / रहस्य होता है।
हर्टन

-1

वैसे आप दो विकल्पों का पालन करके टोकन को सुरक्षित कर सकते हैं।

  1. एंड्रॉइड कीस्टॉर में अपने एक्सेस टोकन को बचाने का उपयोग करें जो रिवर्स नहीं होगा।
  2. कुछ गणना के साथ NDK फ़ंक्शन का उपयोग करें जो आपके टोकन और NDK को c ++ कोड के साथ सहेजते हैं जो रिवर्स करने के लिए बहुत कठिन है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.