Almacenamiento de datos confidenciales sin cifrar en la memoria del cliente

1

Actualmente estoy trabajando en un servicio que permite a los usuarios almacenar datos cifrados del lado del cliente y acceder a ellos desde cualquier lugar. El cliente se conecta a través de un navegador y la aplicación web está escrita en JavaScript. Para administrar más fácilmente los datos almacenados, me gustaría implementar una función de búsqueda.

El concepto completo de que el servidor no sepa qué se almacena significa que los datos no se pueden buscar en el lado del servidor. Por lo tanto, los datos deben ser descifrados de alguna manera.

  • ¿Es seguro descifrar todos los datos y almacenarlos en la memoria durante la sesión de los clientes (almacenarlos en una variable)?

Por razones relacionadas con la experiencia del usuario, pedir la contraseña del usuario (clave de cifrado) no es algo que funcione a la larga.

    
pregunta Alex 05.04.2015 - 00:31
fuente

2 respuestas

1

Desde lo alto de mi cabeza, puedo pensar en cuatro formas en que esta estrategia podría fallar. Todo puede ser mitigado en cierta medida a través de prácticas de desarrollo sensatas y sentido común por parte de los usuarios, y algunos requerirían algunos ataques muy específicos, pero sin embargo son riesgos.

Eval

El almacenamiento de datos confidenciales en el montón será arriesgado si pretende usar eval , porque el código que se ejecuta en eval puede acceder a las variables en el alcance de la llamada a evaluación, que pueden incluir las variables del montón. Considera:

var creditCardNumber = 123456789;
var evalString = "window.alert(creditCardNumber)";
eval(evalString); // alerts the credit card number!

Hay varias formas en que un usuario malintencionado podría montar un ataque:

  • Si evalString se extrae de una base de datos, un atacante podría intentar influir en los datos de alguna manera
  • Si su aplicación usa código de terceros, un atacante podría intentar secuestrar ese recurso y usar eval para capturar los datos y enviarlos hacia adelante (recuerde: el código que se ejecuta desde diferentes scripts seguirá compartiendo el mismo montón). Este riesgo podría mitigarse si los datos confidenciales se mantienen de algún modo en un cierre en lugar de exponerse directamente en el montón, pero tales prácticas serían fáciles de romper para un desarrollador ingenuo.

Recuerde que llamar a window.setTimeout y window.setInterval con argumentos de cadena también son alias para eval .

Extensiones de navegador

Las extensiones del navegador pueden tener la oportunidad de inspeccionar el contenido del montón de JavaScript, directa o indirectamente. Por ejemplo, Chrome proporciona una API de depuración para extensiones creadas como herramientas de desarrollo. Sin embargo, los usuarios deben otorgar permisos para usar estas extensiones e instalarlas a propósito, por lo que esta podría no ser una forma sencilla de montar un ataque.

Ingeniería inversa

Incluso el código minificado aún puede diseñarse a la inversa, por lo que siempre es posible que los usuarios malintencionados razonen acerca de cómo está realizando el cifrado y la forma en que su aplicación de JavaScript se da en el servidor.

Exposición accidental a través del código de terceros

Puede estar seguro de que su código nunca asigna creditCardNumber a algo persistente como localStorage o lo serializa a JSON y lo empuja a window.name , pero ¿tiene la misma confianza en el código de terceros? Podría valer la pena comprobar si está pasando el objeto, especialmente si lo está pasando a algo que intenta realizar el almacenamiento en caché.

    
respondido por el Jimmy Breck-McKye 07.04.2015 - 15:51
fuente
0

Puede utilizar una biblioteca de cifrado de JavaScript para el proceso de cifrado / descifrado, y puede almacenar los datos sin cifrar en sessionStorage en el navegador. ¿Es seguro? Solo tan seguro como su aplicación, el navegador, el sistema operativo y la máquina en la que se ejecuta.

El almacenamiento de la clave de cifrado en el navegador del usuario, digamos en localStorage, para que persista entre sesiones, es intrínsecamente menos seguro que pedirle la clave al usuario con cada sesión. Es posible que desee ofrecer a sus usuarios la posibilidad de almacenar la clave en localStorage como una opción, pero no lo haría obligatorio.

    
respondido por el Robert Munn 06.04.2015 - 13:08
fuente

Lea otras preguntas en las etiquetas