2012-04-18 22 views
9

मुझे ऐप के अंदर एक निजी स्ट्रिंग कुंजी स्टोर करने की आवश्यकता है। इसका मूल्य कभी नहीं बदलेगा और कोड में मैन्युअल रूप से सेट किया जाएगा। मैं स्पष्ट रूप से इसे String के रूप में स्टोर नहीं कर सकता क्योंकि रिवर्स-इंजीनियरिंग विधि इसे प्रकट करेगी, यहां तक ​​कि obfuscation लागू भी किया जाएगा।एंड्रॉइड ऐप में एक गुप्त कुंजी के लिए एंटी-हैक समाधान?

आप कैसे सुझाव देते हैं कि मैं इस निजी कुंजी की रक्षा करता हूं?

हालांकि मैं इसे डेटाबेस में सहेजने के बावजूद, लेकिन डेटाबेस को भी फोन से बाहर खींच लिया जा सकता है।

पीएस। यह कुंजी एक विशेष पैरामीटर है इसलिए एक महत्वपूर्ण विधि है और यह महत्वपूर्ण है कि यह किसी के लिए अज्ञात रहता है! यह एक डिक्रिप्टिंग कुंजी नहीं है। यह स्ट्रिंग एन्क्रिप्शन विधि (एमडी 5 या इसी तरह के) के पैरामीटर के रूप में उपयोग की जाएगी और फिर परिणाम हमारी इंटरनेट सेवा पर भेजा जाएगा।

संपादित

क्षमा करें, यह इतना जटिल बनाने के लिए। मैंने सोचा कि मुझे जितनी संभव हो उतनी जानकारी के साथ जवाब मिल सकता है।

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

यह वास्तव में अधिकतम मुझे कहने की अनुमति है। मुझे आशा है कि यह पर्याप्त है।

+7

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

+0

@AdamMihalcin नहीं, इस स्ट्रिंग का उपयोग ** एन्क्रिप्शन ** के लिए किया जाएगा और फिर परिणाम किसी अन्य इंटरनेट सेवा पर भेजा जाएगा। क्या यह कुछ बदलता है? – sandalone

+0

मैं सहमत हूं, यदि आप अपनी स्ट्रिंग का उपयोग pswd/TAN या इसी तरह करते हैं, तो आप मोबाइल पर एक बार उपयोग कोड भेजकर आजकल बैंकों को ऐसा करने के तरीके में देखना चाहते हैं और बस इसका उपयोग करें - हर बार जब उपयोगकर्ता चाहता है पहुंच वह एक नया हो जाता है। @ एडम मिहालसीन, आपका क्या मतलब है? मैं समझता हूं कि कोई कोड पर देख सकता है, हालांकि, लोड किए गए ऐप को डिबग करना, यह कैसे संभव है? – user387184

उत्तर

10

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

ऐप के लिए एक सर्वर (एक सुरक्षित सॉकेट या https कनेक्शन पर) से कुंजी पुनर्प्राप्त करने की संभावना है। यह स्पष्ट रूप से आवश्यक होगा कि ऐप सर्वर को कुछ प्रकार की पहचान/सत्यापन (शायद उपयोगकर्ता इनपुट के आधार पर) सबमिट करे।

यदि आप एन्क्रिप्शन के लिए कुंजी का उपयोग कर रहे हैं, तो एक और देखें कि सार्वजनिक कुंजी एन्क्रिप्शन को कैसे काम करना चाहिए। आपके ऐप में सार्वजनिक कुंजी होना चाहिए; इंटरनेट सेवा मेल खाने वाली निजी कुंजी के साथ डिक्रिप्ट कर सकती है।

+0

हाय टेड, मैं सवाल संपादित किया है। "यह स्ट्रिंग एन्क्रिप्शन विधि (एमडी 5 या इसी तरह के) के पैरामीटर के रूप में प्रयोग की जाएगी और फिर परिणाम हमारी इंटरनेट सेवा पर भेजा जाएगा।" – sandalone

+0

@ सैंडलोन मैंने आपके संपादन को संबोधित करने के लिए मेरे उत्तर में कुछ जोड़ा। –

+0

फिर से जवाब संपादित किया गया। – sandalone

4

यदि आप @ एडम की टिप्पणी के साथ व्यवस्थित हो सकते हैं, तो कम से कम एक समाधान है जिसे मैं फोन पर स्ट्रिंग मान को बनाए रखने के लिए जानता हूं ... अच्छी तरह से ... लगातार तरीका, जिसका अर्थ है कि मान अनइंस्टॉल करेगा/अपने ऐप को दोबारा स्थापित करें (एक फ़ैक्टरी रीसेट हालांकि इसे हटा देगा), फिर भी उपयोगकर्ता के लिए "छुपा" रहें (यानी सिस्टम निजी स्टोरेज में संग्रहीत, एसडी-कार्ड पर नहीं)। हाँ, एक निहित फोन पर एक आसान

myValue = System.getString(getContentResolver(), myKey); 

और:

आप सिस्टम सेटिंग्स सामग्री प्रदाता इसलिए की तरह मान संग्रहीत करने के लिए उपयोग कर सकते हैं:

final String myKey = "verySecretKey"; 
final String myValue = "verySecretValue"; 
final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue); 

और इसे पुनः प्राप्त करने आप कर सकते हैं उपयोगकर्ता को लगातार मूल्य प्राप्त हो सकता है, लेकिन उस स्थिति में अब और कुछ भी पवित्र नहीं है और @ एडम की टिप्पणी मान्य होगी: आपको डिवाइस पर डेटा स्टोर नहीं करना चाहिए।

+0

फिर से जवाब संपादित किया गया। – sandalone

+0

क्या यह वास्तव में काम करता है? ऐसा लगता है कि ऐसा हैक, और कुछ एंड्रॉइड अनुमति नहीं देगा (या भविष्य में रिलीज में तोड़ सकता है)। सेटिंग्स। सिस्टम का मतलब है ... अच्छी तरह से, सिस्टम सेटिंग्स, एप्लिकेशन व्यक्तिगत भंडारण नहीं। – Tom

+0

हां, यह काम करता है और मैं यह भी काम करने की उम्मीद करता हूं, विशेष रूप से इसके लिए एक दस्तावेज सार्वजनिक एपीआई है। साथ ही, दस्तावेज़ीकरण (http://developer.android.com/reference/android/provider/Settings.System.html) की जांच कर रहे हैं, कोई यह ध्यान रख सकता है कि 'putString' विधि "सामान्य उद्देश्य कुंजी- मूल्य भंडारण ", जबकि अन्य 'डाल दिया ...' विधियों का उपयोग मुख्य रूप से मौजूदा कुंजी को संशोधित करने के लिए किया जाता है (लेकिन यह व्याख्या का विषय हो सकता है)। – dbm