2010-07-27 12 views
21

मैं अपने एंड्रॉइड एप्लिकेशन में एईएस कुंजी जैसी जानकारी के कुछ छोटे लेकिन महत्वपूर्ण टुकड़े को स्टोर करना चाहता हूं। ऐसा करने का अनुशंसित तरीका क्या होगा? मैं अपने आवेदन के हिस्से के रूप में हार्डकोड चाबियाँ नहीं चाहता हूं।एंड्रॉइड सिक्योर स्टोरेज

मैं KeyStore पर देखता हूं लेकिन यह वास्तव में मेरी समस्या का समाधान नहीं करता है। यह मेरी चाबियाँ संग्रहीत कर सकता है कि मैं एक पासवर्ड प्रदान कर सकता हूं। तो मुझे इस पासवर्ड को स्टोर करने के लिए एक सुरक्षित स्थान खोजने की ज़रूरत है जो मेरी मूल समस्या के समान है।

क्या यह कार्य करने के लिए एंड्रॉइड क्लास में कोई बनाया गया है? या मुझे तीसरे पक्ष के पुस्तकालयों की तलाश करनी चाहिए? एनडीके का उपयोग करना मेरे लिए भी स्वीकार्य है।

अद्यतन: ऐसा है कि

मैं भंडारण के लिए एक Android एपीआई को खोजने के लिए उम्मीद कर रही थी गारंटी देता है कि केवल आवेदन है कि कुछ जानकारी संग्रहित इसे वापस प्राप्त कर सकते हैं। एंड्रॉइड ओएस आवेदन के हस्ताक्षर हस्ताक्षर के आधार पर इसे लागू कर सकता था। इस प्रकार मेरा एप्लिकेशन पहले रन पर एक यादृच्छिक कुंजी उत्पन्न कर सकता है और इसे बाद में उपयोग के लिए सुरक्षित भंडारण में संग्रहीत कर सकता है। क्या इसके लिए कोई एपीआई है?

+2

खैर अगर आप आवेदन के '/ डेटा/डेटा में डेटा स्टोर/ /' तो केवल यह है कि आवेदन पहुँच सकते हैं। यह सच नहीं है अगर फोन जड़ है। लेकिन इसके अलावा, आपको वहां पासवर्ड डेटा संग्रहीत करना ठीक होना चाहिए। – Falmarri

उत्तर

5

क्या एंड्रॉइड क्लास में इस कार्य को निष्पादित करता है?

java.io.File के अलावा, नहीं।

या मुझे तीसरे पक्ष पुस्तकालयों की तलाश करनी चाहिए?

आप कोशिश कर सकते हैं, लेकिन मुझे संदेह है कि अधिकांश समाधान पहले से ही खारिज किए गए समाधान की तरह दिखेंगे। अधिकांश सुरक्षित डेटा स्टोर में पासवर्ड शामिल होते हैं और मानते हैं कि पासवर्ड कहीं और आयोजित किए जाते हैं (उदा।, उपयोगकर्ता के सिर में)। उदाहरण के लिए, OI Safe में एक इंटेंट-आधारित प्रणाली है जो एप्लिकेशन को सुरक्षित स्टोर करने की इजाजत देती है, लेकिन फिर उपयोगकर्ता सुरक्षित, आईआईआरसी को अनलॉक करने में शामिल है।

+0

उत्तर के लिए धन्यवाद। यह वास्तव में मेरी समस्या का समाधान नहीं करता है लेकिन सीमाओं को जानना अच्छा होता है। –

+0

@Szere Dyeri: "मैं इस तरह की गारंटी देता है कि केवल आवेदन है कि कुछ जानकारी संग्रहित वापस इसे पुनः प्राप्त कर सकते हैं कि भंडारण के लिए एक Android एपीआई को खोजने के लिए उम्मीद कर रहा था।" - एंड्रॉइड में ऐसा कोई एपीआई नहीं है, क्षमा करें। – CommonsWare

+2

आपका क्या मतलब है कि ऐसा कोई एपीआई नहीं है? यह गारंटी ऐप को आंतरिक स्टोरेज पर संग्रहीत करने वाली सभी फ़ाइलों के लिए डिफ़ॉल्ट व्यवहार है, क्योंकि प्रत्येक एप्लिकेशन को एक अद्वितीय उपयोगकर्ता आईडी दी जाती है और ऐप द्वारा बनाई जाने वाली फ़ाइलों का डिफ़ॉल्ट मोड निर्माता के यूआईडी द्वारा केवल पठनीय/लिखने योग्य होता है। इसके अलावा केवल (ए) बाहरी भंडारण पर रखी गई फाइलें हैं, और (बी) ध्वज के साथ बनाई गई फाइलें उन्हें दुनिया को पठनीय/लिखने योग्य बनाने के लिए बनाई गई हैं। आपके यूआईडी के साथ एक और एप्लीकेशन चलने का एकमात्र तरीका यह है कि यदि दोनों (ए) यह आपके प्रमाण पत्र के साथ हस्ताक्षरित है और (बी) आप दोनों के पास एक ही एंड्रॉइड है: sharedUserId। – hackbod

4

एक समाधान, यदि आप कीस्टोर एपीआई का उपयोग करने के साथ समाप्त होते हैं, तो प्रत्येक बार ऐप को कीस्टोर तक पहुंचने की आवश्यकता होने पर रन टाइम पर अपना पासवर्ड गतिशील रूप से उत्पन्न करना है। यदि आप अपने पासवर्ड एल्गोरिदम को एक सरल, लेकिन परिवर्तनीय, चर पर विशिष्ट स्थापना से जोड़ते हैं जैसे डिवाइस MEID (या रन टाइम पर प्राप्त भौतिक डिवाइस की अन्य विशिष्ट आईडी) तो आप लॉक की कुंजी प्रदान कर सकते हैं जो तेजी से कठिन हो जाता है उठाना।

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

MEID = MEID + "fluffy" + "2008"; 

कहाँ MEID डिवाइस से कुछ आईडी के साथ एक स्ट्रिंग है, "शराबी" अपने सबसे अच्छे दोस्त बिल्ली का नाम है, और "2008" अपने जीवन में एक महत्वपूर्ण घटना का वर्ष है। फिर इस नई स्ट्रिंग को एक सरणी में खिलाएं, उस संख्या के माध्यम से पार्स करें जो आपको उपयुक्त बनाता है (महीने का दिन जिसे आपने उदाहरण के लिए अपना ड्राइवर लाइसेंस प्राप्त किया है), स्ट्रिंग के अंत में उन तीन वर्णों को बाहर निकालें और छोड़ दें। स्ट्रिंग के सामने से अपनी कुंजी के लिए आवश्यक पदों की संख्या और दूर जाने के लिए क्लिप से क्लिप करें। यह एक बहुत ही प्रोसेसर गहन कार्य नहीं होना चाहिए, इसलिए चर के लिए कुछ गलती सहनशीलता कोड के साथ, आप इसे सिस्टम से एएनआर प्राप्त करने की बहुत अधिक चिंता के साथ भी अपनी मुख्य प्रक्रिया में इसे चलाने में सक्षम होना चाहिए। यदि आप वास्तव में बेकार होना चाहते हैं, तो कुछ बिंदु पर स्ट्रिंग को बिट्स में बदलें और 'bitwise op' परिवर्तनों को बदलें। व्हायोला, एक कम ओवरहेड, गतिशील कुंजी जो डिवाइस के लिए अद्वितीय है, यह चल रहा है!

संपादित करें:

@RedWarp के रूप में बताया, decompiling एक .apk उचित उपकरण और प्रेरणा के साथ किसी भी वस्तु कोड के लिए possiblility के क्षेत्र में हमेशा होता है। यदि "कुंजी" पीढ़ी एक बहुत ही महत्वपूर्ण प्रक्रिया है तो ऐप के दायरे के बाहर की मुख्य जेन को सारण करना जरूरी है।

असली मुद्दा यह है कि मैं इस जवाब के साथ बनाने की कोशिश कर रहा हूँ कि एक छोटे से सामने सोचा न्यूनतम सुरक्षा के संबंध में एक रास्ते चले जाते हैं कर सकते हैं। मेरे द्वारा एक सरल उत्तर की तुलना में मजबूत सुरक्षा गहराई से अधिक है।

+1

अस्पष्टता के माध्यम से सुरक्षा केवल एक लगातार हमलावर में देरी हो सकती है। यह निश्चित रूप से नुस्खा में मसाला जोड़ता है। इसे एकमात्र व्यावहारिक विकल्प के रूप में उपयोग नहीं किया जाना चाहिए। – Samuel

+0

@ सैमक्वैस्ट बेशक यह एकमात्र व्यवहार्य विकल्प के रूप में प्रस्तुत नहीं किया गया है, लेकिन एक शुरुआत है, ताकि कुंजी सुरक्षा के संबंध में किसी अन्य और अद्वितीय तरीके से विचार किया जा सके। लेकिन जब तक सवाल में ऐप एक वित्तीय आवेदन या अन्य उच्च सुरक्षा कार्यान्वयन नहीं है, तो इसे पर्याप्त अस्पष्टता प्रदान करनी चाहिए। एक और विकल्प आरपीसी स्क्रिप्ट या कुछ के माध्यम से दूरस्थ रूप से अस्पष्ट कुंजी प्रदान करना हो सकता है, लेकिन इस दृष्टिकोण में अतिरिक्त जटिलता शामिल होगी। – Kingsolmn

+2

एक .apk को उलटना काफी आसान है, और इसके लिए algorythm प्राप्त करने के लिए – Redwarp

0

आप कुंजी और एप्लिकेशन डेटा के बीच यहां भेद करने के लिए है।

"AndroidKeyStore" KeyPairGenerator और Keygenerator भंडार चाबियाँ वे KeyStore में एक उपनाम के तहत अपने app से पैदा करते हैं और अपने अनुप्रयोग के लिए कुंजी एकत्रित करती है। यदि डिवाइस में "सुरक्षित हार्डवेयर" है तो आप निर्दिष्ट कर सकते हैं कि इसका उपयोग किया जाए और कुंजी वहां संग्रहित की जाएंगी।

चाबी के लिए कोई पासवर्ड नहीं है। आप यह निर्दिष्ट करने के लिए उपनाम का उपयोग करते हैं कि आप किस कुंजी का उपयोग करना चाहते हैं। केवल आपका ऐप जेनरेट की गई कुंजी को पुनर्प्राप्त कर सकता है।

देखें: https://developer.android.com/training/articles/keystore.html

अपने अनुप्रयोग के निजी डेटा के लिए, यदि मैं समझता हूँ ".. भंडारण के लिए एक Android एपीआई ऐसे गारंटी देता है कि केवल आवेदन है कि कुछ जानकारी संग्रहित इसे वापस प्राप्त कर सकते हैं कि ..।", आप हो सकता है इन पर नज़र डालें:

https://developer.android.com/guide/topics/data/data-storage.html#filesInternal https://developer.android.com/guide/topics/data/data-storage.html#db

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