java - para - proguard jar
Ocultar cadenas en código ofuscado (6)
Debes buscar en Google "Simplemente otro hacker de Perl". Estos son programas que imprimen una cadena con código ofuscado. También hay muchos ejemplos en otros idiomas, luego Perl en la red.
Acabo de ofuscar mi código Android usando Proguard y luego descompilarlo. 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 descompilado. ¿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.
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.
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.
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 codificación 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 codificación puede ser suficiente (consulte android .util.Base64, http://developer.android.com/reference/android/util/Base64.html ). Tenga en cuenta que la codificación 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:
- Cree manualmente un cifrado de su cadena utilizando una clave conocida.
- 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 = "<manually created encrypted string>";
private String key = "<key used for encryption";
private String mySecret = MyDecryptUtil.decrypt(encrypted, 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.
Usé ROT47. No es muy seguro, pero es fácil de usar e implementar, porque es un codificador / decodificador simétrico
Hola a todos.
Deje que el
secret
sea el texto que quiere ocultarEncuentra 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
conk1
encrypted = encode (secret, k1)
(Por ejemplo: https://jwt.io , para java: https://github.com/jwtk/jjwt ).
- En su código java de Android anote
encrypted
. Cuando necesite la versión decodificada deencrypted
(es decir, elsecret
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 compilar, 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) {
}