2012-08-27 23 views
7

Estoy confundido por este consejo de http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-signaturesAclaración sobre la clave pública de Android?

Para mantener su clave pública a salvo de usuarios maliciosos y hackers, no incrustar su clave pública como una cadena literal entero. En su lugar, construya la cadena en tiempo de ejecución a partir de piezas o utilice la manipulación de bits (para el ejemplo , XOR con alguna otra cadena) para ocultar la clave real. La clave en sí misma no es información secreta, pero no desea que sea fácil que un pirata informático o usuario malintencionado reemplace la clave pública con otra clave .

¿Quiere decir esto que

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

es más seguro que

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

? Si no, ¿podría darme un ejemplo en el código de cómo hacer esto?

+1

+1 Esta pregunta no debería haberse bajado de votos. – hpique

+0

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

Respuesta

3

Sí. Aunque en este caso solo estás concatenando cadenas que no es mucho mejor. La razón de esto es que alguien podría desarmar fácilmente su código y acceder a su clave pública. Si tiene que volver a armar la clave, es mucho más difícil extraer la clave del código desmontado.

4

Algo que implica un cambio importante de la clave es lo mejor. Personalmente, prefiero usar el cifrado, algo así podría funcionar. Para la clave, junte algunas partes, y debería ayudar a unirlas. Usa encryptKey para cifrar tu clave, luego borra la clave real del código fuente y debes estar bastante seguro. Mejor es obtener de alguna manera la clave de un servidor seguro, pero eso no siempre es una opción.

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

Pero puede hacer una solicitud manual al servidor para obtener la clave de todos modos, ¿verdad? – Denny

Cuestiones relacionadas