2012-12-29 14 views
11

मैंने ऐप बिलिंग v3 में उपयोग किए जाने वाले मेरे ऐप को विकसित करना समाप्त कर दिया है। मेरा ऐप एक परीक्षा सहायता ऐप है जिसमें डेटाबेस में डाले गए प्रश्नों की एक सूची है। जो चीज मुझे चिंतित करती है वह सुरक्षा के मुकाबले सुरक्षा है, वहां बहुत कुछ और है। मेरा ऐप खरीदे गए सामानों के लिए सूची से पूछताछ करता है ताकि खरीदारी को संग्रहित करना कोई समस्या न हो।ऐप बिलिंग सुरक्षा में

तो पहला मुद्दा किसी एप्लिकेशन (जो मेरे द्वारा की गई) और यहां तक ​​कि ProGuard साथ आप बहुत अधिक कठिनाई के बिना सभी सवालों के प्राप्त कर सकते हैं डिकंपाइल सकता है।

अगली बात आवेदन की सार्वजनिक कुंजी है। यह आसानी से मेरे ऐप से लिया जा सकता है और डेवलपर्स गाइड के अनुसार, यह कुछ है जो मुझे सुरक्षित रखना चाहिए।

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

तो अनिवार्य रूप से सवाल यह है:

सुरक्षा किस प्रकार उपयोग करना चाहिए और यह कैसे किया जाता है? बस मुझे उन लिंक पर इंगित करें जो चरण-दर-चरण इसके माध्यम से जाते हैं, इसलिए मैं समझ सकता हूं कि यह आश्चर्यजनक होगा।

बहुत बहुत धन्यवाद!

स्पष्टीकरण:

कोई सर्वर शामिल नहीं है। डेटा ऐप में संग्रहीत किया जाता है। जब यह सूची पूछताछ की जाती है (queryinventoryasync विधि के माध्यम से) यदि कोई सूची खरीदी जाती है या नहीं तो यह वापस आती है और यह ऐप लॉन्च होने पर हर बार चलता है। ऐप बिलिंग में ही मुझे लगता है कि ठीक है, मैं अपने आवेदन के बारे में और अधिक पूछ रहा हूं एप्लिकेशन सार्वजनिक कुंजी - मैं किसी भी तरह से प्रतिलिपि बनाने के लिए कठिन बना रहा हूं लेकिन वर्तमान में मैंने इसे 15 तारों में तोड़ दिया है और मैं बस "जोड़ता हूं" उन्हें रनटाइम पर एक दूसरे के लिए, लेकिन यह मुश्किल से कोई बेहतर नहीं है, बस इसे एक स्ट्रिंग के रूप में रखना। मैं इसे किसी भी तरह एन्क्रिप्ट करना चाहता हूं बस यह नहीं जानता कि कैसे।

+0

http://stackoverflow.com/questions/14352758/android-in-app-billing-securing-plication-public-key – Krishnabhadra

उत्तर

18

अच्छा सवाल।

सार्वजनिक कुंजी इस्तेमाल किया जा करने के लिए डिवाइस पर उपलब्ध होना चाहिए। एक बार डिवाइस पर आने के बाद यह वास्तव में सुरक्षित नहीं है। कुंजी स्वयं एक रहस्य नहीं है, लेकिन हमें इसे और अधिक कठिन कार्य होने के लिए संभावित प्रतिस्थापन करने की आवश्यकता है।

आप क्या कर सकते XOR एन्क्रिप्शन तथाकथित उपयोग करने के लिए है। एक्सओआर एन्क्रिप्टर और डिक्रिप्टर विधियों का एक उदाहरण यहां दिया गया है।

public static String xorEncrypt(String input, String key) { 
    byte[] inputBytes = input.getBytes(); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(Base64.encode(outBytes, Base64.DEFAULT)); 
} 

public static String xorDecrypt(String input, String key) { 
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT); 
    int inputSize = inputBytes.length; 

    byte[] keyBytes = key.getBytes(); 
    int keySize = keyBytes.length - 1; 

    byte[] outBytes = new byte[inputSize]; 
    for (int i=0; i<inputSize; i++) { 
     outBytes[i] = (byte) (inputBytes[i]^keyBytes[i % keySize]); 
    } 

    return new String(outBytes); 
} 

कैसे क्या आप की जरूरत एक पासवर्ड स्ट्रिंग (String key) का चयन करें और अपने सार्वजनिक कुंजी (String input) एन्क्रिप्ट इसे का उपयोग करने के लिए है। यह एन्क्रिप्टेड कुंजी जिसे आप कक्षा में स्टोर कर सकते हैं। जब आपको अपने वास्तविक कुंजी मान की आवश्यकता होती है, तो आप पासवर्ड और सार्वजनिक (एन्क्रिप्टेड) ​​कुंजी स्ट्रिंग के साथ xorDecrypt() पर कॉल करते हैं। पासवर्ड एक स्ट्रिंग है जिसे आप कहीं भी अपने कोड में स्टोर करते हैं। जैसा कि मैंने कहा था कि हम वास्तव में इसकी रक्षा नहीं करते हैं, लेकिन हम इसे ढूंढना और/या प्रतिस्थापित करना अधिक कठिन बनाते हैं।

आप कैसे भी सार्वजनिक कुंजी और पासवर्ड एन्क्रिप्टेड गठबंधन करने के लिए पर और अधिक परिष्कृत तर्क जोड़ सकते हैं। यह सिर्फ अधिक जटिलता जोड़ता है लेकिन आपको कोई वारंटी नहीं देगा जो आपकी कुंजी को डिक्रिप्ट नहीं किया जाएगा। किसी भी मामले में Google confirms एक्सओआर एन्क्रिप्शन कुछ भी नहीं है।

एंड्रॉइड 4.3 ने कुछ और सुरक्षा सुविधाओं को जोड़ा जो सार्वजनिक कुंजी को संग्रहीत करने के लिए भी इस्तेमाल किए जा सकते हैं। इस समाधान के लिए एक सर्वर संचार और हार्डवेयर समर्थन की आवश्यकता होगी वास्तव में सुरक्षित होना चाहिए। ये Key Chain enhancements and Android Keystore Provider हैं।

+0

बहुत बढ़िया उत्तर। इसके अतिरिक्त, क्या मैं अपनी एन्क्रिप्टेड सार्वजनिक कुंजी को विभिन्न हिस्सों में तोड़ दूं जो मैं एक साथ तारों को उलट देता हूं और चरित्रों को झुकाता हूं? जो मैं समझता हूं वह यह है कि किसी को अपनी कुंजी को अपने साथ बदलना बंद करना है जिससे आइटम खरीदने से प्राप्त धन को अपने खाते में ले जाया जा सके। – AndroidPenguin

+1

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

+0

'int keySize = keyBytes.length - 1;' यह नैसेसरी नहीं है। i% key keyize को हमेशा आकार से कम करें, इसलिए हमें 1 के लिए कुंजी आकार को कम करने की आवश्यकता नहीं है –

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