2013-11-20 7 views
19

सरल मैसेजिंग एंड्रॉइड एप्लिकेशन के निर्माण के दौरान संदेश को एन्क्रिप्ट/डिक्रिप्ट करना और उन्हें इंटरनेट के माध्यम से भेजना, मैंने आरएसए सार्वजनिक/निजी कुंजी एन्क्रिप्शन का उपयोग करने का फैसला किया। सवाल यह है कि निजी कुंजी को कैसे स्टोर किया जाए, ताकि फोन दुर्भावनापूर्ण रूप से रूट हो, तो कुंजी सुरक्षित रहेगी? जहां तक ​​मुझे समझा गया, KeyStore प्रमाणपत्रों के लिए उपयोग किया जाता है, और इसका उपयोग नहीं किया जा सकता है? क्या मुझे निजी कुंजी को एईएस के साथ टेक्स्ट फ़ाइल के रूप में एन्क्रिप्ट करना चाहिए? मुझे सुरक्षा के साथ बहुत कम अनुभव है, इसलिए कृपया मेरे विचारों को सही करने के लिए स्वतंत्र महसूस करें, और अपनी राय दें!भंडारण आरएसए प्राइवेट कुंजी एंड्रॉइड

दयालु सम्मान।

+3

@LokiSinclair आप जहां भी चाहें सार्वजनिक कुंजी डाल सकते हैं और जो भी आपको पसंद करते हैं उसे दिखा सकते हैं, यही कारण है कि यह सार्वजनिक है। तो निजी कुंजी के साथ इसे स्टोर करना ठीक है। आपको केवल निजी कुंजी को एक सुरक्षित स्थान पर रखना होगा। – Peanut

+0

@LokiSinclair क्षमा करें, लेकिन यह सिर्फ गलत है। निजी कुंजी डिवाइस पर सबसे अच्छी तरह से संग्रहीत होती हैं जो संदेशों को डिक्रिप्ट करने में सक्षम होना चाहिए। बैकअप ऑनलाइन बनाया जा सकता है लेकिन यह एक सुरक्षा जोखिम बन गया है। साथ ही, सार्वजनिक कुंजी के समान स्थान पर सार्वजनिक कुंजी को संग्रहीत करने में कोई जोखिम नहीं है। – joakimb

उत्तर

8

मुझे लगता है कि KeyStore आपके उपयोग के लिए उपयुक्त हो सकता है। यह आरएसए कुंजी को स्टोर करने में सक्षम है और उन्हें एईएस का उपयोग करके एन्क्रिप्ट करता है, यहां तक ​​कि रूट एक्सेस के साथ, उन्हें पासवर्ड या ब्रूटफोर्सिंग के बिना निकाला नहीं जा सकता है।

यहाँ KeyStore उपयोग के बारे में एक अच्छा पोस्ट है: http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html

+0

उत्तर के लिए धन्यवाद, आपके द्वारा लिंक किया गया ब्लॉग बहुत उपयोगी है! पासवर्ड आधारित एन्क्रिप्शन के बारे में पोस्ट है, जो कि कम से कम मेरे एप्लिकेशन के लिए, KeyStore के आधार पर मुझे अधिक उचित और वांछनीय पाया गया है। फिर से धन्यवाद! – user32981

3

आप अपने आरएसए सार्वजनिक/निजी कुंजी एंड्रॉयड पर SharedPreference का उपयोग कर बच सकते हैं। फ़ोन को दुर्भावनापूर्ण रूप से रूट करते समय अपनी चाबियाँ सुरक्षित रखने के लिए, आप निम्न चरणों को कर सकते हैं:

1: जब आप किसी भी डेटा को एक कुंजी जोड़ी उत्पन्न करना चाहते हैं।
2: उपयोगकर्ता को पासवर्ड के लिए संकेत दें।
3: अपनी निजी कुंजी एन्क्रिप्ट करने के लिए एक सममित कुंजी उत्पन्न करने के लिए उस पासवर्ड का उपयोग करें।
4: आप सार्वजनिक कुंजी का उपयोग करके अपने डेटा को एन्क्रिप्ट कर सकते हैं और निजी कुंजी का उपयोग करके डिक्रिप्ट कर सकते हैं।
5: आप चरण 2 में दिए गए पासवर्ड के लिए सत्र रख सकते हैं। उस सत्र के दौरान, आप निजी कुंजी को एन्क्रिप्ट/डिक्रिप्ट करने के लिए सममित कुंजी (पासवर्ड से उत्पन्न) का उपयोग कर सकते हैं।

निम्नलिखित कोड का टुकड़ा कैसे स्टोर करने के लिए & लाने सार्वजनिक कुंजी

public void setPublicKey(PublicKey publicKey, String key, Context context) { 

    byte[] pubKey = publicKey.getEncoded(); 
    String pubKeyString = Base64.encodeBytes(pubKey); 
    this.setString(key, pubKeyString, context); 
} 

public PublicKey getPublicKey(String key,Context context) { 

    PublicKey pKey = null; 
    try { 

     String pubString = this.getString(key, context); 

     if(pubString!=null) { 
      byte[] binCpk = Base64.decode(pubString); 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
      X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(binCpk); 
      pKey = keyFactory.generatePublic(publicKeySpec); 
     } 
     }catch(Exception e){ 
    } 
    return pKey; 
} 

को दर्शाता है निम्नलिखित कोड का टुकड़ा से पता चलता स्टोर करने के लिए कैसे & निजी कुंजी लाने।

public void setPrivateKey(PrivateKey privateKey, String key, Context context) { 

    byte[] priKey = privateKey.getEncoded(); 
    String priKeyString = Base64.encodeBytes(priKey); 
    this.setString(key, priKeyString, context); 
} 

public PrivateKey getPrivateKey(String key, Context context) { 

    PrivateKey privateKey = null; 

    try { 
     String privateString = this.getString(key, context); 
     if(privateString!=null){ 
      byte[] binCpk = Base64.decode(privateString); 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
      PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(binCpk); 
      privateKey = keyFactory.generatePrivate(privateKeySpec); 
     } 
    } 
    catch(Exception e){ 
    } 
    return privateKey; 
} 
+4

कृपया निजी कुंजी के लिए ऐसा न करें। ऐसा दिखने से सही होना मुश्किल है। या तो अंतर्निहित कीस्टोर एपीआई (एंड्रॉइड 4.3+ में उपलब्ध) का उपयोग करें या अपनी चाबियाँ और प्रमाणपत्रों को स्टोर करने के लिए नियमित 'कीस्टोर' (बीकेएस/जेकेएस) का उपयोग करें। प्रारूप में अखंडता संरक्षण और एन्क्रिप्शन है और इसे पासवर्ड द्वारा संरक्षित किया जा सकता है। –

+0

क्या मैं सही कह रहा हूं कि आप बस सेट विधि में कुंजी एन्कोड कर रहे हैं? – Karoly

2

फ़ाइल सिस्टम में कोई भी कीस्टोर (पी 12, जेकेएस, एकेएस) आरएसए निजी कुंजी रखने के लिए पर्याप्त सुरक्षित नहीं हो सकता है। केवल स्मार्टकार्ड या सुरक्षित टोकन उच्च स्तरीय सुरक्षा प्रदान कर सकते हैं। इस पुस्तक को पढ़ें: "एंड्रॉइड सिक्योरिटी इंटरनल"। इस पुस्तक में आपको एंड्रॉइड सिक्योरिटी और जेसीए प्रदाताओं का अच्छा विवरण मिलेगा।

+2

वास्तविकता के लिए दिलचस्प है कि "एंड्रॉइड सिक्योरिटी इंटरनल" के लेखक ने स्वयं को अपनी चाबियाँ और प्रमाणपत्र स्टोर करने के लिए "नियमित 'कीस्टोर' (बीकेएस/जेकेएस) का उपयोग करने की सलाह दी है।पिछले जवाब से टिप्पणियां पढ़ें। अभी भी सिफारिश मान्य है। निकोले एलेनकोव से बहुत अच्छी किताब और ब्लॉग। – jfuentes

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