Ocultar cadenas en código ofuscado

Acabo de ofuscar mi código Android usando Proguard y luego descomstackrlo. Hay una serie de cuerdas que realmente me gustaría esconder de miradas indiscretas. Cuando descompilé mi código, las cuerdas estaban ahí para que todos las vieran … y cambiasen. Una de las cadenas es una URL para mi servidor de licencias y, de hecho, podría cambiar la URL para apuntar a un servidor falso (ya que lanzaré el código del servidor al público). ¿Cuál es la mejor manera de ocultar este tipo de información?

Además, noté que las cadenas de clase R son todos números aleatorios, pero no puedo encontrar la clase R en el código descomstackdo. ¿Dónde está?

Por ejemplo , veo: new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);

2130903058 es un archivo de diseño, pero ¿a qué se refiere? El número no significa nada a menos que esté apuntando a algún tipo de dirección.

Suponiendo que esté satisfecho con la oscuridad y no con la seguridad, existen varios mecanismos que podría utilizar, pero los ofuscadores como Proguard no van a poder ayudarlo.

Para lograr esto, necesitará hacer la encoding o el cifrado de la cadena usted mismo, el enfoque que utilice dependerá de aquello contra lo que intenta defenderse, si solo está tratando de esconderse de una inspección obvia, entonces la encoding puede ser suficiente (consulte android .util.Base64, http://developer.android.com/reference/android/util/Base64.html ). Tenga en cuenta que la encoding no es de NINGUNA MANERA SEGURA y lo único que hará es eliminar la referencia obvia a su sitio.

Si está tratando de defenderse de algo más, entonces podría pasar a encriptar la cadena, para hacer esto usaría un cifrado simétrico como AES a través de javax.crypto.Cipher, http://www.androidsnippets.org/snippets/ 39 / index.html proporciona un ejemplo de uso decente. De nuevo, esto es más molesto que seguro para los piratas informáticos, ya que tendrá que guardar la clave en algún lugar de su contenedor, anulando así cualquier seguridad criptográfica.

Para aclarar esto, los pasos básicos serían:

  1. Cree manualmente un cifrado de su cadena utilizando una clave conocida.
  2. Convierta su código para usar una versión descifrada de esta cadena, por ejemplo:

Antes de:

 public class Foo { private String mySecret = "http://example.com"; ... } 

Se convierte en:

 public class Foo { private String encrypted = ""; private String key = " 

Una (buena) alternativa a todo esto es considerar el uso de una solución drm de terceros, como el servidor de licencias que google proporciona http://android-developers.blogspot.com/2010/07/licensing-service-for-android.html . Esto puede ser más seguro que algo en lo que se enrolle, pero está sujeto a limitaciones muy similares a las descritas anteriormente.

Hola a todos.

  1. Deje que el secret sea ​​el texto que quiere ocultar

  2. Encuentra el keyhash de tu debug / release.keystore. Deja que k1 sea ​​esta clave.

(use las herramientas keytool + openssl: keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 )

  1. Use una herramienta (externa al código de Android) para encriptar el secret con k1

    encrypted = encode (secret, k1)

(Por ejemplo: https://jwt.io , para java: https://github.com/jwtk/jjwt ).

  1. En su código java de Android anote encrypted . Cuando necesite la versión decodificada de encrypted (es decir, el secret original), escriba

original = decode(encrypted, get_my_keyhash_programmatically() )

Eso es todo. Esto funciona porque el secret original no se muestra en el código fuente de Java, ni el k1 para decodificarlo. Y, si un pirata informático desea imprimir su secreto descifrado, debe cambiar el código y volver a comstackr, firmando su archivo .apk con su propio almacén de claves, no el suyo, y, por lo tanto, no obtiene el secret original correcto. (El “único” punto es si k1 se puede deducir de su archivo original .apk).

Nota: get_my_keyhash_programmatically ():

 try { PackageInfo info = getPackageManager().getPackageInfo( "el nombre de su paquete por ejemplo com.tarea.u8", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } 

Lo que hice fue crear una larga lista de cadenas estáticas en mi clase de utilidad global. En algún lugar dentro de la larga lista de cadenas, puse mi clave en varios fragmentos.

con mi código es fácil ver cuáles son las claves reales, pero una vez que el ocultador funcione, todas las estáticas tendrán nombres como A, B, C, etc. y ya no será fácil detectarlas.

Usé ROT47. No es muy seguro, pero es fácil de usar e implementar, porque es un codificador / decodificador simétrico

Debes buscar en Google “Simplemente otro hacker de Perl”. Estos son progtwigs que imprimen una cadena con código ofuscado. También hay muchos ejemplos en otros idiomas, luego Perl en la red.

Entrada de Wikipedia

Puede usar DexGuard para encriptar cadenas, probablemente más eficazmente de lo que podría lograr de forma manual y sin cargar el código fuente.