2012-08-27 13 views
7

मैं, http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-signaturesAndroid सार्वजनिक कुंजी के बारे में स्पष्टीकरण?

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

इसका मतलब यह है कि

String one = "thisIs"; 
String two = "MyKey"; 
String base64EncodedPublicKey = one + two; 
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey); 
verified = Security.verify(key, signedData, signature); 

सुरक्षित से

String base64EncodedPublicKey = "thisIsMyKey"; 
PublicKey key = Security.generatePublicKey(base64EncodedPublicKey); 
verified = Security.verify(key, signedData, signature); 

है? यदि नहीं, तो क्या आप कृपया मुझे यह करने के लिए कोड में एक उदाहरण दे सकते हैं?

+1

+1 यह प्रश्न डाउनवॉट नहीं किया जाना चाहिए था। – hpique

+0

संबंधित - http://stackoverflow.com/questions/14352758/android-in-app-billing-securing-application-public-key – Krishnabhadra

उत्तर

3

हां। यद्यपि इस मामले में आप केवल तारों को जोड़ रहे हैं जो अधिक बेहतर नहीं है। इसका कारण यह है कि कोई भी आसानी से आपके कोड को अलग कर सकता है और आपकी सार्वजनिक कुंजी तक पहुंच सकता है। यदि आपको कुंजी को फिर से इकट्ठा करना है, तो यह अलग-अलग कोड से कुंजी को पकड़ने के लिए और अधिक चुनौतीपूर्ण बनाता है।

4

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

String encryptKey(String input) 
{ 
    byte[] inBytes=input.getBytes(); 
    String finalString=null; 
    try { 
     Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     MessageDigest md = MessageDigest.getInstance("SHA-1"); 
     byte[] keyBytes=md.digest((KeyPart1+KeyPart2).getBytes()); 
     keyBytes = Arrays.copyOf(keyBytes, 16); 
     SecretKey key= new SecretKeySpec(keyBytes,"AES"); 
     IvParameterSpec ivSpec = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}); 
     cipher.init(Cipher.ENCRYPT_MODE,key,ivSpec); 
     byte[] outBytes = new byte[cipher.getOutputSize(inBytes.length)]; 
     //cipher.update(encrypted, 0, encrypted.length, decrypted, 0); 
     outBytes=cipher.doFinal(inBytes); 
     finalString=new String(Base64.encode(outBytes,0)); 
     Log.v(TAG,"Encrypted="+finalString); 

    } catch (NoSuchAlgorithmException e) { 
     Log.e(TAG,"No Such Algorithm",e); 
    } catch (NoSuchPaddingException e) { 
     Log.e(TAG,"No Such Padding",e); 
    } catch (InvalidKeyException e) { 
     Log.e(TAG,"Invalid Key",e); 
    } catch (InvalidAlgorithmParameterException e) { 
     Log.e(TAG,"Invalid Algorithm Parameter",e); 
    } catch (IllegalBlockSizeException e) { 
    } catch (BadPaddingException e) {} 
    return finalString; 
} 

String decryptKey(String base64Text) 
{ 
    byte[] encrypted=Base64.decode(base64Text,0); 
    //encrypted=base64Text.getBytes(); 
    String decryptedString=null; 
    try { 
     Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     MessageDigest md = MessageDigest.getInstance("SHA-1"); 
     byte[] keyBytes=md.digest((KeyPart1+KeyPart2).getBytes()); 
     keyBytes = Arrays.copyOf(keyBytes, 16); 
     SecretKey key= new SecretKeySpec(keyBytes,"AES"); 
     IvParameterSpec ivSpec = new IvParameterSpec(new byte[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}); 
     cipher.init(Cipher.DECRYPT_MODE,key,ivSpec); 
     byte[] decrypted = new byte[cipher.getOutputSize(encrypted.length)]; 
     //cipher.update(encrypted, 0, encrypted.length, decrypted, 0); 
     decrypted=cipher.doFinal(encrypted); 
     decryptedString=new String(decrypted); 
    } catch (NoSuchAlgorithmException e) { 
     logStackTrace(e); 
    } catch (NoSuchPaddingException e) { 
     logStackTrace(e); 
    } catch (InvalidKeyException e) { 
     logStackTrace(e); 
    } catch (InvalidAlgorithmParameterException e) { 
     logStackTrace(e); 
    } catch (IllegalBlockSizeException e) { 
     logStackTrace(e); 
    } catch (BadPaddingException e) { 
     logStackTrace(e); 
    } 
    return decryptedString; 
} 
+0

लेकिन तुम सिर्फ सर्वर के लिए एक मैनुअल अनुरोध कुंजी वैसे भी सही पाने के लिए कर सकते हैं? – Denny

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