¿Cómo almaceno la clave secreta de un usuario en un servidor?

5

Estoy aprendiendo sobre seguridad en este momento y una cosa que me gustaría probar es tener un servidor de claves que distribuya las claves a los clientes que les permitan guardar y leer datos de manera segura.

Mi idea básica es que el cliente se comunique con el servidor a través de TLS, donde proporcionará un nombre de usuario y una contraseña. Esta contraseña se utilizará tanto para autenticar al usuario como para descifrar la clave en la base de datos.

Esencialmente, la base de datos del servidor de claves se distribuiría de la siguiente manera:

| Nombre de usuario | Hashed Password + Salt | Salt | Clave cifrada |

En este caso, ¿serían seguras las claves en caso de una pérdida de la base de datos? Me pregunto si hay una mejor práctica para este tipo de implementación o ¿debo manejar esto de manera diferente?

    
pregunta Eoin Nolan 10.04.2014 - 20:44
fuente

3 respuestas

1

(Descargo de responsabilidad: yo mismo soy un "estudiante de seguridad", por lo que no estoy 100% seguro de que esto sea correcto.)

No entiendo por qué querría mantener las claves privadas en el servidor después de transferirlas al usuario. No hay uso para ellos. Si están perdidos, crea otros nuevos.

Las teclas tienen una parte pública y otra privada. La parte pública puede ser realmente pública y puede publicarse en la web.

Las claves privadas deben mantenerse privadas, y esto significa que los usuarios tienen sus claves en su propia máquina (computadora portátil, teléfono, etc.), tal vez incluso una clave única para cada máquina. Deben ser instruidos sobre cómo mantener esa llave segura allí. Una contraseña viene a la mente. Si crea las claves para el usuario en su servidor, necesita una forma de obtener la clave privada de forma segura para el usuario. Esto se puede hacer localmente, a través de SSH o mediante una memoria USB, etc. Cree las claves justo antes de transferirlas y luego bórtelas.

Tal vez me esté faltando algo, una buena razón para mantener las claves en el servidor, luego explique por qué.

    
respondido por el SPRBRN 10.04.2014 - 22:01
fuente
1

La complejidad es el enemigo de la seguridad. Entonces es renunciar al control de los bits valiosos, como las teclas, cuando no es necesario.

Como lo entiendo, tu esquema funciona de esta manera:

  1. El usuario inicia la aplicación de cliente que puede acceder a los archivos locales cifrados
  2. El usuario ingresa a) nombre de usuario yb) contraseña
  3. El nombre de usuario y la contraseña se transmiten al servidor
  4. El servidor autentica al usuario con nombre de usuario y contraseña
  5. El servidor utiliza un KDF para derivar una clave de cifrado a partir de la contraseña del usuario
  6. El servidor descifra la clave almacenada del usuario usando la clave derivada
  7. El servidor transmite la clave descifrada a la aplicación cliente
  8. La aplicación del cliente descifra los archivos usando la clave

Sin embargo, todo lo que realmente necesita es 1, 2b, 5 y 8. Los pasos 2a, 3, 4, 6 y 7 son innecesarios y simplemente agregan riesgo.

En el modelo más simple:

  1. El usuario inicia la aplicación de cliente que puede acceder a los archivos locales cifrados
  2. El usuario ingresa la contraseña
  3. La aplicación de cliente local utiliza un KDF para derivar una clave de cifrado a partir de la contraseña del usuario
  4. La aplicación del cliente descifra los archivos usando la clave

En este modelo, no se requiere un almacenamiento de claves persistente, ningún servidor posee un tesoro de claves cifradas y hashes que pueden ser atacados y utilizados para forzar la contraseña, sin transmisión por Internet de datos confidenciales.

Su pregunta no menciona ninguna razón particular para querer o necesita un servidor que almacene claves. A falta de esa necesidad, creo que deberías repensar tu modelo de amenaza, porque el diseño actual no tiene mucho sentido para mí.

    
respondido por el Xander 10.07.2014 - 00:23
fuente
1

Sus claves pueden ser seguras, dependiendo, entre otras cosas, del cifrado utilizado y de las contraseñas seguras de los usuarios. Pero hay una manera de hacerlo mucho más seguro: no los almacene.

En su sistema como lo describe, no hay razón para no dejar que el cliente se encargue de todo el cifrado / descifrado. Por lo tanto, el servidor no tiene sentido conocer las claves de cifrado del usuario. Almacenar las claves en su servidor realmente agregará riesgos sustanciales e innecesarios:

  • su servidor puede ser pirateado, su base de datos robada y las claves recuperadas

  • tiene que enviar estas claves a través de su red, donde pueden ser interceptadas

La única (aunque mala) razón por la que puedo ver si desea almacenar las claves de usuario en la base de datos es poder devolverlas si un cliente pierde su clave. Sin embargo, esto no debería preocuparte, ya que no se supone que suceda. Almacenar una clave privada es un asunto muy delicado que debe manejarse con mucho cuidado. No es algo que "simplemente pierdes".

    
respondido por el ero 10.07.2014 - 01:56
fuente

Lea otras preguntas en las etiquetas