¿Estoy cifrando y almacenando una serie de detalles de usuario correctamente?

3

Se me ocurrió un procedimiento de almacenamiento de detalles de usuario que, al principio, se basaba en la literatura de seguridad real, pero luego seguí escribiendo sin hacer todas las comprobaciones cruzadas que debería haber hecho.

  • Se ingresaron el nombre de usuario, la contraseña y los datos personales.

  • Se genera una clave simétrica aleatoria de 128 bits.

  • Se generan dos vectores de inicialización aleatorios.

  • La matriz en la que se almacenan los datos personales (nombre, correo electrónico, etc.) se encripta AES-128 con la clave recién generada y el primer vector de inicialización.

  • La propia clave simétrica se encripta con AES-128, utilizando la contraseña del usuario en texto sin formato como la clave y el segundo vector de inicialización.

  • La clave recién cifrada, vector de inicialización 1 & 2 y el conjunto cifrado de datos personales se almacena en un objeto que luego se serializa en un archivo con una ID, un hash del nombre de usuario del usuario.

  • Cuando el programa recupera los detalles: contiene el nombre de usuario del usuario actual, busca ese hash en el archivo "usuarios" (la ID), recupera el objeto asociado con él, descifra la clave y utiliza la clave descifrada para descifrar los datos de usuario.

¿Es grotescamente inseguro? ¿Me estoy perdiendo algo obvio?

    
pregunta Quoi 04.08.2015 - 13:33
fuente

2 respuestas

1

Algunos comentarios sobre el flujo proporcionado:

  1. Asegúrese de que cuando dice "Se generaron dos vectores de inicialización aleatorios", realmente son aleatorios criptográficamente seguros.

  2. El cifrado simétrico debe ser cifrado autenticado.

Por lo tanto, le sugiero que agregue algo de MAC (es decir, que use HMAC). E.g:

1. AES-encrypt: plaintext + secret key + fresh-generated random IV = ciphertext C1.
2. C2 = IV + C1.
3. MAC = HMAC(K , C2) where K is a different secret key independent the first used.
4. C3 = C2 + MAC.
    
respondido por el bayotop 04.08.2015 - 13:56
fuente
0

Como sugiere el comentario de @ SEJPM, el esquema como se describe carece de algunos de los detalles necesarios para responder de manera completa, pero con algunas suposiciones, podemos presentar un par de puntos generales, no obstante. Específicamente:

  1. La contraseña del usuario no debe usarse directamente como clave de cifrado de clave. Debe usar un PBKDF adecuado, como PBKDF2, bcrypt, scrypt u otro, para convertir la contraseña en una clave aleatoria apropiada con un factor de trabajo adecuado.

  2. ¿Por qué hash el nombre de usuario? ¿Por qué no usar el nombre de usuario directamente como clave? Tal vez esto tenga valor para la aplicación, pero no parece tener ningún beneficio de seguridad por lo que puedo ver en la descripción de su esquema.

  3. Para reiterar el punto 1, establecer el factor de trabajo de manera adecuada para su KDF es crítico. Si el cálculo de una clave a partir de una contraseña candidata se puede hacer demasiado rápido, su encriptación será una simple ventana, y no ofrecerá una protección significativa contra los atacantes sin conexión que logran obtener una copia de los datos encriptados.

respondido por el Xander 01.03.2016 - 18:13
fuente

Lea otras preguntas en las etiquetas