Uso de Keystore de Android

6

Estoy utilizando Android Keystore para almacenar un criptográfico asimétrico (para descifrar un archivo que contiene una clave asimétrica). Hice eso porque quiero cifrar un gran conjunto de datos y una asimétrica no es suficiente, ya que el almacén de claves tiene claves simétricas desde el SDK 23.

  • En el HSM clásico no puede acceder a las claves criptográficas, solo envía sus datos y el HSM realiza las operaciones criptográficas. Pero en Android, recupera la clave para realizar manualmente las operaciones (con cifrado, etc.). ¿Es seguro?
  • Si no es seguro, ¿es posible borrar las claves de la memoria después de usarlas? (Al final de mis funciones por ejemplo)
  • Si es seguro, ¿cuáles son los riesgos? ¿Tener la memoria RAM corrompida por un virus?
pregunta AndoKarim 30.03.2018 - 14:15
fuente

4 respuestas

4

Echemos un vistazo a los documentos de desarrolladores de Android "Sistema de almacén de claves de Android" . Tendremos que desglosar esto según cómo utilice el objeto KeyStore . Si está utilizando el KeyStore KeyStore.getInstance("AndroidKeyStore") de Android, entonces:

1) Si el dispositivo en el que se está ejecutando la aplicación tiene almacenamiento seguro respaldado por hardware, entonces

  

El material clave puede estar vinculado al hardware seguro (por ejemplo, Trusted Execution Environment (TEE), Secure Element (SE)) del dispositivo Android. Cuando esta función está habilitada para una clave, su material clave nunca se expone fuera del hardware seguro.

El artículo "Android keystore system" ofrece más información sobre cómo usar esta función.

2) Si el dispositivo no tiene almacenamiento seguro respaldado por hardware, entonces:

  

El material clave nunca entra en el proceso de solicitud. Cuando una aplicación realiza operaciones criptográficas con una clave de Android Keystore, el texto sin formato, el texto cifrado y los mensajes que deben firmarse o verificarse se incorporan a un proceso del sistema que realiza las operaciones criptográficas.

Es de suponer que este proceso del sistema está escrito en C, donde tienen más control sobre la administración de la memoria y pueden poner a cero la clave correctamente cuando está fuera del alcance de su aplicación (lo que me lleva a mi perorata sobre los recolectores de basura ...)

3) Si por alguna razón usa KeyStore.getInstance("JKS") como en los ejemplos aquí , tal vez usted necesita acceso a las claves privadas por alguna razón, o necesita cargar / almacenar las claves privadas en un archivo .jks - luego No, no puede borrarlo : porque el recolector de basura Java es < a href="https://stackoverflow.com/q/38665202/1907046"> famoso por devolver la memoria al sistema operativo sin borrarla o reducirla a cero . De los documentos del desarrollador de Android , no veo ninguna evidencia de que el recolector de basura Dalvik funcione. diferente.

Además, uno de los mecanismos del recolector de basura Java es hacer una copia de cualquier variable de pila a la que su programa hace referencia actualmente y luego liberar la pila antigua. Esto significa que una copia de su clave privada puede ser devuelta al sistema operativo incluso antes de que quede fuera del alcance.

Línea inferior: Si el objeto KeyStore de Android se usa correctamente, sus claves privadas permanecerán de manera segura dentro del Entorno de Ejecución Confiable (TEE), Elemento Seguro (SE)) o el proceso del Sistema.

Si, por alguna razón, trae la clave privada a su aplicación, entonces todas las apuestas están desactivadas porque en Java / Dalvik / Android, una vez que algo está en la memoria de su aplicación, es casi imposible borrarlo o reducirlo a cero.

    
respondido por el Mike Ounsworth 29.05.2018 - 20:03
fuente
4

Las otras respuestas cubren todo muy bien, pero un aspecto parece ser mal entendido. Como las otras respuestas citadas, ...

  

El material clave nunca entra en el proceso de solicitud. Cuando una aplicacion   realiza operaciones criptográficas utilizando una clave de Android Keystore,   Detrás de escena, texto plano, texto cifrado y mensajes que deben firmarse o   verificados son alimentados a un proceso de sistema que lleva a cabo la   Operaciones criptográficas.

Lo que esto significa es que una aplicación de Android no puede recuperar ninguno de los bytes de la clave a través de ningún medio compatible. Esta aplicación es posible porque Android (y Java) obtienen acceso a material clave sin formato a través de un solo método, Key.getEncoded() , en la interfaz Key . Para las claves que son administradas por el almacén de claves de Android, Key.getEncoded() devuelve null .

    
respondido por el James K Polk 30.05.2018 - 04:26
fuente
0

Si realmente TIENE que importar datos clave a AndroidKeyStore (por ejemplo, necesita realizar alguna operación con el que el almacén de claves no sea compatible), no es inmediatamente obvio cómo asegurarse de que no permanezca en la memoria de la aplicación . Sin embargo, he estado jugando con esto yo mismo y parece que estás bastante seguro si haces lo siguiente:

  • Asegúrese de que sus datos clave solo se almacenen en un byte[] o similar (no en un String u otro objeto que pueda copiar sus datos).
  • Implemente su propia clase * KeySpec que no haga ninguna copia de los datos (las predeterminadas sí, y no hay una forma sencilla de borrar los datos copiados, ya que son privados)
  • Sobrescriba el byte[] que contiene los datos clave tan pronto como se coloca en el almacén de claves.
  • El bit de clave: inmediatamente almacene OTRA entrada ficticia en el almacén de claves utilizando cero o datos basura. Esta parece ser la única forma de eliminar la copia que se realiza al distribuir los datos para enviarlos a través de RPC al servicio de almacén de claves.

Espero que esto ayude.

    
respondido por el Dylan Nicholson 07.08.2018 - 06:15
fuente
-1

en Android, recuperas de Keystore la clave para realizar manualmente las operaciones. ¿Es seguro?

De la documentación de Android:

  

El material clave nunca entra en el proceso de solicitud. Cuando una aplicación realiza operaciones criptográficas con una clave de Android Keystore, el texto sin formato, el texto cifrado y los mensajes que deben firmarse o verificarse se incorporan a un proceso del sistema que lleva a cabo las operaciones criptográficas.    enlace

Entonces, mientras usa manualmente la clase Cipher y recupera su clave, esto se hace en un proceso del sistema, NO en su aplicación. Tiene razón en que puede repetir la clave si lo desea (lo que no será seguro), pero el simple hecho de escanear su aplicación (o la memoria utilizada por ella) no generará una clave.

Si no es seguro, ¿es posible borrar las claves de la memoria después de usarlas?

No es necesario. El proceso del sistema que realiza las operaciones lo hace por usted.

Si es seguro, ¿cuáles son los riesgos? ¿Tener la memoria RAM dañada por un virus?

El escenario realmente inseguro es que si el dispositivo no tiene un elemento seguro, se podría leer el KeyStore.

De la documentación de Android:

  

Si el sistema operativo Android está comprometido o si un atacante puede leer el almacenamiento interno del dispositivo, el atacante puede usar las claves del Almacén de claves de Android de cualquier aplicación en el dispositivo Android, pero no extraerlas del dispositivo.    enlace

    
respondido por el Evan Tobin 30.03.2018 - 16:56
fuente

Lea otras preguntas en las etiquetas