2012-04-15 21 views
80

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

+1

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

+0

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

उत्तर

87

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

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

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

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

+2

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

+0

ठीक थाक्स .. मैं obfuscation तरीके से जाऊँगा (क्या आप इसे करने के लिए किसी भी अच्छे उपकरण की सिफारिश कर सकते हैं?) ... प्रॉक्सी वेबपैप होने से बहुत आकर्षक नहीं है क्योंकि मुझे अपने उपयोगकर्ताओं को अपनी साइट पर पंजीकरण करने के लिए मजबूर करना होगा .. पूरी श्रृंखला में एक अतिरिक्त कदम जोड़ने के लिए बहुत उपयोगकर्ता के अनुकूल नहीं है ... – yeahman

10

आप उन्हें AccountManager में संग्रहीत कर सकते हैं। इन लोगों के अनुसार इसे सर्वोत्तम अभ्यास माना जाता है।

इस वर्ग को उपयोगकर्ता के ऑनलाइन खातों की एक केंद्रीकृत रजिस्ट्री तक पहुँच प्रदान करता:

enter image description here

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

खाता प्रबंधक का उपयोग कैसे करें के बारे में विस्तृत गाइड के लिए:

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

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

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

आशा है कि इससे मदद मिलती है।

+2

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

1

अच्छी तरह से आप दो विकल्प गिरकर टोकन तक पहुंच सकते हैं।

  1. एंड्रॉइड कीस्टोर में अपना एक्सेस टोकन सहेजने का उपयोग करें जो विपरीत नहीं होगा।
  2. कुछ गणना कि अपना टोकन और सी के साथ ++ कोड है कि बहुत कठिन है NDK बचाने के साथ
  3. उपयोग NDK समारोह अपने Android स्टूडियो की परियोजना फलक से उल्टा करने के लिए
3
  1. करें, "परियोजना फ़ाइलें" और एक नया नाम दिया फ़ाइल बनाने आपके प्रोजेक्ट की रूट निर्देशिका में "keystore.properties"।

enter image description here

  1. खोलें "keystore.properties" फ़ाइल और फ़ाइल में अपने पहुंच टोकन और गुप्त सहेजें।

enter image description here

  1. अब आप अपने एप्लिकेशन मॉड्यूल के build.gradle फ़ाइल में पहुंच टोकन और गुप्त पढ़ लोड। फिर आपको अपने एक्सेस टोकन और सीक्रेट के लिए 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; 
    

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

+0

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

+0

एक अच्छा वैकल्पिक तरीका। –

1

साझा किए गए संदर्भ is not एक सुरक्षित स्थान। रूट डिवाइस पर हम easily सभी एप्लिकेशन के साझा किए गए प्राइमर्स xml के को पढ़ और संशोधित कर सकते हैं। यहां तक ​​कि यदि टोकन हर घंटे समाप्त हो जाता है, तो भी नए टोकन साझा किए गए संदर्भों से चोरी हो सकते हैं। एंड्रॉइड कीस्टोर का इस्तेमाल दीर्घकालिक भंडारण और क्रिप्टोग्राफिक कुंजी के पुनर्प्राप्ति के लिए किया जाना चाहिए जिसका उपयोग हमारे टोकन को एन्क्रिप्ट करने के लिए किया जाएगा ताकि उन्हें स्टोर किया जा सके। SharedPreferences। चाबियाँ किसी एप्लिकेशन की प्रक्रिया में संग्रहीत नहीं होती हैं, इसलिए वे are harder से समझौता किए जाने के लिए।

संबंधित मुद्दे