¿Solución anti-hack para una clave secreta en la aplicación para Android?
Necesito almacenar una clave de cadena privada dentro de la aplicación. Su valor nunca cambiará y se establecerá manualmente en código. No puedo, obviamente, sólo almacenar como una String
como método de ingeniería inversa que lo revelaría, incluso con la ofuscación aplicada.
¿Cómo sugieres que proteja esta clave privada?
- Optimizar JSonArray para Loop
- Cómo hacer el diseño relativo con la sombra de la caja
- RealmResult Muchas relaciones con el adaptador
- Álbum de Facebook y fotos no accesibles con todos los permisos necesarios (GRAPH API)
- Android - Cómo cambiar fragmentos en el cajón de navegación
Aunque de guardarlo en una base de datos, pero una base de datos se puede sacar del teléfono también.
PD. Esta clave es un parámetro especial por lo que un método importante y es crucial que se mantiene desconocido para nadie! No es una clave de descifrado. Esta cadena se utilizará como parámetro para el método de cifrado (md5 o similar) y luego se enviará un resultado a nuestro servicio de Internet.
EDITAR
Lo siento, por hacerlo tan complicado. Pensé que podría conseguir una respuesta con tanta información como sea posible.
Esta aplicación permitirá a los usuarios enviar un poco de texto a un servicio de Internet que luego envía ese texto a un sitio web. Tenemos que asegurarnos de que el texto se envía a través de teléfono Android como cualquier script de robot web puede imitar el teléfono Android y publicar un spam. Como captcha-como los métodos no son bienvenidos en los teléfonos móviles, habrá una clave secreta que se pondrá a través de md5 (con algunas otras cosas) para generar un código de hash. Este hash se enviará a un servicio de Internet. El servicio de Internet utilizará la misma clave para obtener un resultado md5 y luego compararlo para ver si el remitente es un teléfono móvil o algún robot.
Este es realmente el máximo que se me permite decir. Espero que sea suficiente.
- Robolectric: ejecute el looper del manipulador en mi caso
- Android Parse JSON atascado en obtener tarea
- Android API 23 - HttpClient 4.X reempaquetado
- Bloquear / desbloquear una aplicación de mi aplicación: Android
- Android, org.simpleframework.xml Existencia de persistencia, Elemento 'foo' ya se utiliza
- En google maps V2 ... fragment.getMap () devuelve null
- Convertir APK en JAR
- ¿Cómo puedo solucionar un error de `android.app.Application no se puede enviar a`
Te sugiero que reconsideras tu arquitectura de seguridad. Cualquier cosa enviada 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 (a través de 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 basada en la entrada del usuario).
Si está utilizando la clave para el cifrado, a continuación, eche un vistazo a cómo se supone que el cifrado de clave pública funcione. Su aplicación debe tener la clave pública ; El servicio de Internet puede descifrar con la clave privada correspondiente.
Si puedes conformarte 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 … bien … persistente, lo que significa que el valor sobrevivirá a una desinstalación / reinstalación De su aplicación (un restablecimiento de fábrica lo eliminaría), pero permanecen "ocultos" para el usuario (es decir, almacenados en el almacenamiento privado del sistema, no en la tarjeta SD).
Puede utilizar el proveedor de contenido de configuración del sistema para almacenar el valor de la siguiente manera:
final String myKey = "verySecretKey"; final String myValue = "verySecretValue"; final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue);
Y para recuperarlo puedes hacer:
myValue = System.getString(getContentResolver(), myKey);
Y sí, en un teléfono arraigado un usuario práctico puede obtener el valor persistido, pero en ese caso nada es sagrado y el comentario de @Adam será válido: No debe almacenar los datos en el dispositivo.