¿Es seguro asignar claves desencriptadas a una variable en la aplicación? [duplicar]

22

Digamos que he recuperado una clave secreta encriptada del servidor. Lo desencripto para obtener la clave secreta real, asigno la clave desencriptada a una variable en mi aplicación. Algo a lo largo de esto:

const encryptedKey = fetchKeyFromServer();
const secretKey = decrypt(encryptedKey);
//Now, the variable secretKey has the actual secret key in memory

Ahora, ¿es esto algo vulnerable en términos de seguridad? Desde que almacené la clave descifrada en la memoria, ¿existe la posibilidad de que alguien pueda revelar la clave secreta al leer desde la memoria de la aplicación?

Sin embargo, si no asigno la clave descifrada a una variable, ¿cómo debo usar la clave? Pensé en asignar la clave cifrada a la variable y descifrarla cada vez que la necesite. Pero todavía no estoy seguro de si esta es la mejor manera de hacer las cosas.

    
pregunta xenon 10.05.2017 - 07:35
fuente

1 respuesta

32

Sí, significa que la clave se almacenará en la memoria de la aplicación. Sí, existe el riesgo de que el malware (con privilegios suficientes) pueda leerlo desde allí. Este riesgo es difícil de evitar: si desea utilizar la llave, debe guardarla en la memoria, del mismo modo que debe guardar la llave de su casa en el bolsillo después de cerrar la puerta.

Esto generalmente no se considera un gran problema por una razón: si hay un malware con privilegios de root en una computadora, de todos modos ya habrá terminado el juego. No hay manera de mantener nada seguro en ese punto. Incluso si no descifras la clave, el malware podría leer la clave que se usa para ese descifrado desde cualquier lugar donde esté almacenada.

Aquí hay tres cosas que puede hacer para mitigar el riesgo:

  • Use algún tipo de HSM . (Gracias a DRF por señalarlo). Este es el mejor enfoque, pero la factibilidad depende de la plataforma en la que están trabajando en Sin embargo, tenga en cuenta que el malware con suficiente privilegio para leer la memoria de otros procesos probablemente también puede usar el HSM. Así que esto no es a prueba de balas contra una infección de malware.
  • Minimiza el tiempo que la clave está en la memoria para reducir la ventana de ataque al sobrescribir la memoria después de que hayas terminado. (Como señala MSalters , esto podría no ser tan sencillo como parece. Por ejemplo, en C ++, el optimizador podría eliminar una escritura que no se lee, y en Java las cadenas son imutables por lo que no se pueden sobrescribir.)
  • Como sugiere Vitor , marque la página de memoria en la que se almacena la clave como no intercambiable para que nunca se escriba al disco.
respondido por el Anders 10.05.2017 - 08:09
fuente

Lea otras preguntas en las etiquetas