2011-05-12 12 views
12

Estoy trabajando en una EDIT: aplicación web móvil que muestra información confidencial y requiere un inicio de sesión que almacena el nombre de usuario y la contraseña de los miembros en una sesión HTML5. El nombre de usuario y la contraseña se almacenan actualmente en un estado no encriptado por el motivo de que necesitamos usar este nombre de usuario y contraseña en cada carga de página para acceder al servicio web remoto del cliente.Cifrado de datos del lado cliente HTML5: ¿Cuáles son mis opciones?

EDIT: Después de una revisión de seguridad de nuestros clientes planteado la siguiente preocupación:.

"Existe la posibilidad de que la información de sesión de almacenamiento puede quedar almacenada en el disco (por ejemplo, en un bloqueo del navegador) Por esta razón no hay información sensible deben se almacenan sin encriptar en el almacenamiento de la sesión. Los ID de usuario y los tokens de sesión se pueden almacenar ya que se implementan los tiempos de espera de la sesión, sin embargo, no se recomienda el almacenamiento de contraseñas/PIN. "

¿Cuál sería el mejor/más seguro método de cifrado y descifrado de datos confidenciales almacenados en el lado del cliente?

Gracias!

+0

seguro contra qué? ¿Ataques del lado del cliente? ¿Ataques en tránsito? La respuesta será muy diferente dependiendo de esto. – Piskvor

+0

@ Piskovar- Hubo una preocupación particular planteada por un miembro del equipo de seguridad del cliente que fue "Existe la posibilidad de que la información de Almacenamiento de sesión pueda almacenarse en el disco (por ejemplo, en un bloqueo del navegador). Por esta razón, no se debe almacenado sin cifrar en el almacenamiento de la sesión. Los ID de usuario y los tokens de sesión pueden almacenarse ya que se implementan los tiempos de espera de la sesión, sin embargo, no se recomienda el almacenamiento de contraseñas/PIN. " – TGuimond

+1

Aha, gracias por la aclaración. – Piskvor

Respuesta

2

ver este HTML5 Web DB Security

bibliotecas de cifrado del lado del cliente no están maduras o comprobadas suficientemente

... pero ha sido hace un año, por lo que podría ser falsa ya

10

Hola, en lugar de almacenar el nombre de usuario y la contraseña, ¿no puede crear algún tipo de "sesión" con el servidor remoto y en su lugar transmitir un token de autenticación?

Almacenar un nombre de usuario y contraseña en cualquier parte del lado del cliente me da escalofríos.

Quizás para buscar formas de almacenar el nombre de usuario/contraseña de forma segura, busque formas de eliminar la necesidad de almacenarlo.

Sin embargo, por supuesto, estoy diciendo esto sin conocer el fondo completo ... Supongo que hay una buena razón para tener que almacenar el nombre de usuario/contraseña.

+1

El motivo por el que requerimos el nombre de usuario/contraseña para cada carga de página es que tenemos que usarlo para cargar datos desde un servicio web remoto en cada carga de página. Nuestros clientes no están dispuestos a ceder en este requisito :( – TGuimond

+0

@TGuimond Un problema complicado, ¿el servicio web tiene otros métodos de autenticación disponibles? ¿Podría autenticarse usando la Autenticación de Windows en su lugar? –

3

David Dahl, un ingeniero de Firefox, tiene un prototipo de extensión de Firefox, domcrypt (repository on github), que proporciona acceso de JavaScript a las API NSS (Network Security Services) de Firefox. Dado que Chrome también usa NSS, proporcionar la misma API es probablemente sencillo también.

Él es pushing Mozilla para evolucionar un poco más para una eventual inclusión dentro de Firefox; veremos que pasa.

+0

@David Dahl: Olvidé por completo mencionar que es una aplicación web para navegadores móviles, por lo que estamos restringidos a navegadores de teléfonos inteligentes. Disculpas. – TGuimond

2

Investigué este tema recientemente. Creo que por ahora tenemos algunas bibliotecas de cifrado JS probadas, ver here y here.

Ahora la pregunta es dónde guardar la clave. Almacenarlo en el lado del cliente sería lo mismo que almacenar los datos sin ningún cifrado. Y que el usuario ingrese la clave todo el tiempo derrotaría el propósito.

Tal vez podría pedirle a su servidor que genere una nueva clave cada vez que cree una nueva sesión. (Asegúrese de usar HTTPS al hacer esta solicitud). Si la sesión caduca, el usuario debe ingresar nuevamente el nombre de usuario/contraseña y se encriptará usando el nuevo token.Para descifrar la clave, debe realizar una solicitud (segura) a su servidor (ingresando su ID de sesión) para solicitar la clave, que luego se puede utilizar para descifrar el nombre de usuario y la contraseña.

Ahora, esto deja abiertas las vulnerabilidades habituales, como el cross scripting lateral o el secuestro de sesión, pero al menos la contraseña del usuario no se almacena en texto claro en el lado del cliente.

¿Qué opinas?


8

Para cualquiera de tropezar con esta pregunta, Stanford tiene un proyecto sobre criptografía en http://crypto.stanford.edu/sjcl/. No lo he usado en producción, pero estoy ocupado investigando y hasta ahora parece prometedor. Espero que esto ayude a alguien.

0

Debo decir si su creación de una sesión de datos 1 es que no, - almacenado en el servidor no del lado del cliente por lo tanto nadie ve los datos de la sesión o al menos debería hacerse de esa manera a través de asp, php, ect entonces la aplicación requiere internet y recupera la información de un servidor web y no la almacena en el lado del cliente. 2 si esto tiene que ver con el lado del cliente, como tratar con la transmisión de un video, o imágenes o si tiene que crear algunos archivos en el lado del cliente, almacenar la clave en el dispositivo móvil del cliente es la única manera. Por lo tanto, tienen la clave con un ttl corto para descifrar los datos, la clave proporcionada a través de alguna forma de autenticación o certificado, o una clave instalada desde su oficina principal y encriptan el dispositivo en caso de que lo pierdan. No encontré y cifro la función que aún me gusta sugerir.

0

Trabajo en un application que enfrenta el mismo problema. La seguridad es importante para esta aplicación porque permite a los usuarios construir árboles personales (o listas anidadas) y almacenarlos en la nube.

Mi solución es encriptar la contraseña almacenada en el lado del cliente con otra contraseña generada por el servidor para cada usuario.

0

Almacenar credenciales de usuario sensibles realmente no es un buen diseño. En su lugar, genera un token autenticado del servidor usando, por ejemplo, sprint framework. A continuación, puede almacenar lo mismo en el almacenamiento local utilizando el módulo de seguridad de base de datos web.

Cuestiones relacionadas