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:
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.
Deje que el secret
sea el texto que quiere ocultar
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
)
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 ).
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.