2017-04-26 10 views
10

प्रमाणीकरण के बाद सर्वर से टोकन तक पहुंच है "uyhjjfjfgg567f8fhjkkf" अब मैं इसे डिवाइस में सुरक्षित रूप से सहेजना चाहता हूं। मैंने एंड्रॉइड डेवलपर साइट्स में कीस्टोर और कीचेन में देखा। मैं स्पष्ट रूप से समझ नहीं पा रहा हूं कि यह कैसे काम करता है और कैसे हमें कीस्टोर से टोकन पुनर्प्राप्त करना चाहिए।एंड्रॉइड में सुरक्षित रूप से ओथ एक्सेस टोकन को कैसे सुरक्षित करें

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
     KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); 
kpg.initialize(new KeyGenParameterSpec.Builder(
     alias, 
     KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
     .setDigests(KeyProperties.DIGEST_SHA256, 
      KeyProperties.DIGEST_SHA512) 
     .build()); 

KeyPair kp = kpg.generateKeyPair(); 


/* 
* Load the Android KeyStore instance using the the 
* "AndroidKeyStore" provider to list out what entries are 
* currently stored. 
*/ 

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
Enumeration<String> aliases = ks.aliases(); 

उत्तर

9

आप के बाद से यह कम जीवन वैसे भी है, पहुँच टोकन को बचाने के लिए की जरूरत नहीं है। इसे स्मृति में रखना काफी अच्छा है।

आप ताज़ा टोकन रखने की जरूरत है, और आप उस के लिए कुछ विकल्प हैं:

  • एक फ़ाइल में
    • या तो सीधे आंतरिक भंडारण में एक फ़ाइल में
    • या का उपयोग करते हुए SharedPreferences
    • या एक डाटाबेस
  • टी का उपयोग में वह AccountManager

StoredCredential का उपयोग करने पर विचार करें। प्रवाह के लिए, मैं आपको Google AppAuth library का उपयोग करने की सलाह देता हूं।

बेशक

, आप भी एक सिफर का उपयोग कर कुंजी एन्क्रिप्ट कर सकते हैं:

private static byte[] encrypt(byte[] key, byte[] text) throws GeneralSecurityException { 
    final SecretKeySpec skeySpec = new SecretKeySpec(key, KEY_ALGORITHM); 
    final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, sInitVectorSpec); 
    return cipher.doFinal(text); 
} 

और कुंजी KeyStore में संग्रहित किया जा सकता है।

2

Here आप एंड्रॉइड सुरक्षा के लिए उपलब्ध संभावनाओं के बारे में एंड्रॉइड प्राधिकरण द्वारा वास्तव में एक अच्छा लेख पा सकते हैं।

एंड्रॉइड कीस्टोर कार्यान्वयन का एक व्यापक उदाहरण here पाया जा सकता है।

और दूसरा अच्छा विकल्प Google's keyczar है कि आप नमूनों और विवरणों के लिए गिट भंडार पर अनुसरण कर सकते हैं। वहाँ आप भी Known Security Issues की एक विस्तृत सूची पा सकते हैं, तो आप देख सकते हैं अगर यह आपके आगे कार्यान्वयन सूट।

आपके वर्तमान मुद्दे के लिए मैं उपरोक्त दूसरे लिंक में उदाहरण कार्यान्वयन के बाद एंड्रॉइड कीस्टोर पर जाने की अनुशंसा करता हूं।

शुभकामनाएं!

0

हम एक कस्टम SharedPreference उदाहरण का उपयोग करते हैं जो जोड़ने के दौरान कुंजी और मान को एन्क्रिप्ट करता है, और अनुरोध करते समय डिक्रिप्ट करता है।

SecurePreferences preferences = ... 
preferences.edit().putString("key", "value").apply(); // key and value are encrypted automatically 

String value = preferences.getString("key", null); // key and value are decrypted automatically 

मैं केवल, अगर मान एन्क्रिप्ट किए गए हैं SharedPreferences का उपयोग कर की सिफारिश करेंगे क्योंकि भले ही xml फ़ाइल केवल एप्लिकेशन के लिए उपलब्ध है, उसे रूट उपकरणों पर पहुँचा जा सकता है।

यदि आप पहले से ही SQLLiteDB का उपयोग कर रहे हैं, तो शायद मैं इसका उपयोग करूँगा। यदि नहीं, तो बस टोकन को बचाने के लिए यह बहुत भारी है।

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

एक OAuth टोकन पूरी तरह से कुंजी और कीस्टोर एप्लिकेशन पर हस्ताक्षर करने के लिए इस्तेमाल करने के लिए संबंधित नहीं है।

ओथ टोकन ऐप के भीतर उपयोगकर्ता के प्रमाण-पत्रों को सत्यापित करने के बाद सर्वर द्वारा प्रदत्त टोकन है।

कीस्टोर में 1 या अधिक प्रमाणपत्र हैं जिनका उपयोग ऐप पर डिजिटल हस्ताक्षर करने के लिए किया जाता है। यह किसी और को उस ऐप को अपलोड करने से रोकने के लिए है जिसमें आपके पास समान पैकेज नाम है और इसे बदल रहा है।

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