2012-04-18 9 views
9

Necesito almacenar una clave de cadena privada dentro de la aplicación. Su valor nunca cambiará y se configura manualmente en el código. Obviamente no puedo simplemente almacenarlo como String ya que el método de ingeniería inversa lo revelaría, incluso con la ofuscación aplicada.Solución anti-piratería para una clave secreta en la aplicación de Android?

¿Cómo sugieres que proteja esta clave privada?

Pensé en guardarlo en una base de datos, pero también se puede sacar una base de datos del teléfono.

PS. esta clave es un parámetro especial, por lo que es un método importante y es crucial, ¡permanece desconocido para cualquiera! No es una clave de descifrado. Esta cadena se usará como un parámetro para el método de encriptación (md5 o similar) y luego se enviará un resultado a nuestro servicio de Internet.

EDITAR

Lo siento, para hacer que fuera tan complicado. Pensé que podría obtener una respuesta con la menor cantidad de información posible.

Esta aplicación permitirá a los usuarios enviar texto a un servicio de Internet que luego publica ese texto en un sitio web. Necesitamos asegurarnos de que el texto se envíe a través del teléfono Android, ya que cualquier script de robot web puede imitar el teléfono Android y publicar un correo no deseado. Como los métodos tipo captcha no son bienvenidos en los teléfonos móviles, habrá una clave secreta que se enviará a md5 (con algunas otras cosas) para generar un código hash. Este hash se enviará a un servicio de Internet. El servicio de Internet usará la misma clave para obtener un resultado md5 y luego lo comparará para ver si el remitente es un teléfono móvil o algún robot.

Esto es realmente el máximo que puedo decir. Espero que sea suficiente

+7

"es crucial que siga siendo desconocido para cualquiera" Si es realmente crucial, no puede incluirlo en la aplicación en absoluto. De lo contrario, un atacante podría pasar por su código con un depurador, detenerse en el punto en que su código usa la cadena e inspeccionar los contenidos. El atacante no necesita saber cómo descifrar la cadena, pero solo necesita instalar las herramientas de desarrollo de Android para permitir que su código realice el descifrado. –

+0

@ AdamMihalcin No, esta cadena se usará ** para el cifrado ** y luego se enviará un resultado a otro servicio de Internet. ¿Esto cambia algo? – sandalone

+0

Acepto, si utiliza su cadena como un pswd/TAN o similar, puede que quiera ver la forma en que los bancos lo hacen hoy en día enviando un código de uso único al móvil y simplemente use esto - cada vez que el usuario quiera tiene acceso a uno nuevo. @ Adam Mihalcin, ¿qué quiere decir exactamente? Entiendo que uno puede MIRAR el código, sin embargo, al depurar una aplicación cargada, ¿cómo es posible? – user387184

Respuesta

10

Sugiero que reconsidere su arquitectura de seguridad. Todo lo enviado con la aplicación es detectable. (Por ejemplo, la biblioteca de validación de licencias de Android está diseñada para que se envíe una clave pública con la aplicación.)

Una posibilidad es que la aplicación recupere la clave de un servidor (mediante un socket seguro o una conexión https). Obviamente, esto requeriría que la aplicación envíe al servidor algún tipo de identificación/validación (probablemente en función de la información del usuario).

Si está utilizando la clave para el cifrado, eche un vistazo a cómo se supone que funciona el cifrado de clave pública. Su aplicación debe tener la clave pública ; el servicio de internet puede descifrar con la clave privada correspondiente.

+0

Hola Ted, yo He editado la pregunta. "Esta cadena se usará como un parámetro para el método de encriptación (md5 o similar) y luego se enviará un resultado a nuestro servicio de Internet." – sandalone

+0

@sandalone Agregué un poco a mi respuesta para abordar su edición. –

+0

Editó la respuesta nuevamente. – sandalone

4

Si puede contestar con el comentario de @ Adam, hay al menos una solución que conozco para persistir un valor String en el teléfono de una manera ... persistente, lo que significa que el valor sobrevivirá a una desinstalación/vuelva a instalar su aplicación (sin embargo, un restablecimiento de fábrica se eliminaría), pero permanecerá "oculto" para el usuario (es decir, almacenado en el almacenamiento privado del sistema, no en la tarjeta SD).

Puede usar la configuración del sistema proveedor de contenido para almacenar el valor de este modo:

final String myKey = "verySecretKey"; 
final String myValue = "verySecretValue"; 
final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue); 

Y para recuperarlo que puede hacer:

myValue = System.getString(getContentResolver(), myKey); 

Y sí, en un teléfono raíces un práctico el usuario puede obtener el valor persistente, pero en ese caso ya nada es sagrado y el comentario de @Adam será válido: no debe almacenar los datos en el dispositivo.

+0

Editó la respuesta nuevamente. – sandalone

+0

¿Esto realmente funciona? Parece como un hack, y algo que Android no permitiría (o podría romperse en versiones futuras). Settings.System está diseñado para ... bueno, configuraciones del sistema, no aplicaciones de almacenamiento personal. – Tom

+0

Sí, funciona y también espero que funcione, especialmente porque hay una API pública documentada para ello. Además, al revisar la documentación (http://developer.android.com/reference/android/provider/Settings.System.html), uno puede notar que el método 'putString' parece estar habilitado para" teclas de propósito general ". value storage ", mientras que los otros métodos' put ... 'parecen usarse para modificar principalmente claves existentes (pero eso puede ser una cuestión de interpretación). – dbm

Cuestiones relacionadas