2011-10-31 12 views
7

Tengo una rutina de cifrado y descifrado de mcrypt en una de mis aplicaciones de Android. Esto es esencialmente descifrar una cadena que se busca a través de. llamada remota. Naturalmente, la "clave secreta" se almacena dentro del código, pero cualquiera con apktool puede ver el código y ver mi clave secreta.Mantener la clave secreta SECRETO - dentro de la aplicación de Android ... cualquier idea

¿Hay alguna forma de encriptar todo el código Java para que incluso si no se compile, no sea legible/comprensible?

He oído hablar de ProGuard, pero al leer sobre él, no parece suficiente para este propósito.

+2

La pregunta es ¿por qué la cadena está encriptada? Si se trata de seguridad de transporte y almacenamiento del servidor, utilice el cifrado de clave pública. Si desea "ocultarlo" a los usuarios, no tiene suerte, ya que todo lo que su aplicación puede "ver" también lo pueden hacer los usuarios. –

+0

La cadena está encriptada para ocultar la ubicación de un archivo que se transmite por secuencias: la intención es ofuscar y al menos dificultar que usuarios ocasionales/script kiddies descarguen el mp3 independientemente de la aplicación. Sé lo que dices y entiendo completamente que cualquier cosa que la aplicación pueda ver, cualquiera que esté lo suficientemente determinado como para depurar, descifrar o descompilar, solo estoy tratando de hacerlo más difícil. Alguien determinado aún pasará por todo eso y tendrá éxito. No es gran cosa ... simplemente mantén alejados a los kiddies de script básicamente ... – SpacialWise

+2

¿Por qué no hacer que el cliente genere el par de claves y envíe su clave pública al servidor con la solicitud? –

Respuesta

4

Nunca debe poner una clave secreta dentro del código. El código compilado se puede modificar mediante ingeniería inversa fácilmente y cualquier persona con un depurador puede engancharse al punto donde se crea la clave real. La seguridad siempre se basa en el algoritmo, se supone que el código del cliente es público y un atacante potencial tiene una copia.

Ocultar literales en código solo retrasa al atacante en el proceso de obtener la clave, pero no lo impide de ninguna manera.

+0

Entonces, ¿cuáles son sus recomendaciones? – SpacialWise

+0

Podría haber una pantalla de configuración para que el usuario pueda definir su propia psw. Luego, almacena un hash del usr pasw, y cuando se inicia la aplicación, se solicita el psw. Si el hash psw coincide con el hash almacenado, entonces le concede acceso al usuario. También puede emitir claves para los usuarios, almacenar hashes en su base de datos y permitirles validar su aplicación en el primer uso en línea. –

0

No soy un experto en seguridad ni tampoco, pero sí sé que el lenguaje VM compiled puede descompilarse fácilmente, puede tratar de ofuscar su código usando ProGuard pero aún ser legible, lo que le aconsejaría es intentar guardarlo y cifrar su clave utilizando Java Crypto, este tipo de pregunta se ha hecho antes similar a Android Crypting Database o Encrypt Information in Android, no espero responder a su pregunta, pero le doy una línea de guía a dónde ir a partir de ahora.

+0

Gracias Necronet. He leído varias publicaciones aquí sin una solución definitiva. Verifico las que vinculó. – SpacialWise

0

en su lugar puede generar una clave nueva cada vez que necesite buscar la cadena

A continuación, tendrá que hacer un intercambio de claves con un certificado codificado (que es seguro si se aplica adecuadamente)

o simplemente use SSL si solo es seguro mientras está en tránsito

+1

Este enfoque suena plausible ... la generación de una nueva clave cada vez es factible, pero no estoy familiarizado con el intercambio de claves con un certificado codificado. ¿Podría dar más detalles o señalarme en una dirección? Yo ' – SpacialWise

1

Se puede leer todo el código en la máquina del cliente. Lo mejor que puede hacer es dificultar la búsqueda de la clave.

Sugerencia: habrá algunas cadenas de texto en el código, como "Espere mientras se procesa su solicitud ..." Busque dicho mensaje y genere una matriz de bytes para cambiar ese mensaje a su clave real mediante XORing la matriz de bytes con la cadena de texto.

p. Ej. "ardilla" XOR [16 1D 10 19 1A 13 0B 18] => "elefante"

Solo "ardilla" y la matriz de bytes aparecen realmente en su código.

+0

¡Hola! Sí, esto es lo que estaba pensando originalmente. Esencialmente, tiene algunas rutinas (utilizando algoritmos) que crea la clave de los datos dentro de string.xml y también algunas otras variables incrustadas aleatoriamente. Combinando todo esto en varios métodos integrados en clases separadas. Luego, finalmente, usando ProGuard, lo que haría que el rastreo de funciones/rutinas específicas sea más desafiante ... – SpacialWise

+0

Sé que alguien podría resolverlo incluso en ese caso, pero es un poco más lento, tomando simplemente de descompilar y leer, para tener que rastrear el código durante unos minutos. – SpacialWise

Cuestiones relacionadas