2012-01-24 17 views
7

Tengo un sitio web donde los usuarios envían sus datos personales, y estoy pensando en encriptar estos datos usando aes-256 y su contraseña se usa como clave para ese cifrado y luego almaceno los datos encriptados en una base de datos mysql. ..¿Cómo cambiar la clave aes-256 después del cifrado?

Ahora bien, si el usuario cambia su contraseña ¿cómo iba a cambiar la clave de los datos cifrados

¿Debo reunir todos los datos de la base de datos y luego descifrar sus datos con la clave de edad luego de cifrarlo de nuevo con una ¿nueva llave?

Respuesta

13

No necesita volver a cifrar todos los datos del usuario cuando cambian su contraseña.

Genera una clave secreta para cifrar los datos de un usuario; llama a esto la "clave de cifrado de contenido". Derivar una clave de la contraseña del usuario; llama a esto la "clave de encriptación de clave". Encripte la "clave de cifrado de contenido" usando la "clave de cifrado de clave". Almacene la clave cifrada junto con la sal y el número de iteraciones utilizadas para la derivación de clave.

Si cambian su contraseña, descifran la clave de cifrado de contenido con la contraseña anterior y la vuelven a cifrar con una clave derivada de la nueva contraseña. Debe elegir un nuevo sal para la nueva contraseña, y asegúrese de almacenarla junto con la nueva clave encriptada.

Como la clave de cifrado de contenido se elige aleatoriamente de un espacio grande, puede usar ECB de forma segura como el modo de cifrado al cifrarlo.

No simplemente hash la contraseña, incluso si usas sal, incluso si usas un algoritmo aún no roto. Necesita repetir la operación de hash miles de veces. Hay bibliotecas para hacer esto (correctamente) en la mayoría de las plataformas. Use un algoritmo de derivación de clave (PBKDF2, de PKCS # 5) para crear una clave secreta a partir de una contraseña.

Este concepto sigue the draft for password-based S/MIME encryption.

+0

¿Dónde se almacenaría la clave cifrada? ¿En la memoria en el servidor de aplicaciones o en el almacenamiento físico en el servidor de la base de datos? – dimiguel

+0

@dimgl Almacenado en un almacenamiento confiable y persistente, con copias de seguridad. Definitivamente no en la memoria. A menos que no le importe si el contenido es irrevocablemente destruido por un corte de energía. – erickson

0

Eso es tonto.

AES utiliza una clave de 256 bits por lo que cuando diga que va a utilizar su contraseña para la clave, no será tan larga como el tamaño de la clave requerida.

+0

Llamaré su contraseña para darme el byte de 256 y luego lo usaré en el cifrado –

+0

Ok, ¿cuál es su formato para construir la clave? –

3

En primer lugar, generalmente no debe usar la contraseña como clave AES. Tal vez algo así como un hash criptográfico (no MD5) de la contraseña + una sal (en este caso, se almacenaría la sal pero no el hash).

Una cosa que podría hacer es encriptar los archivos de cada usuario con una clave aleatoria, luego encriptar esa clave con la contraseña hash + salada. Si el usuario cambia las contraseñas, solo tiene que volver a cifrar la clave.

2

Una posibilidad a considerar desacopla la clave utilizada para cifrar los datos de la clave utilizada para acceder a los datos. Hecho con cuidado, esto le permite al usuario cambiar su contraseña tantas veces como lo desee, mientras que usted solo cambia un registro en la base de datos. Por separado, puede programar cambios en la (s) clave (s) cifrando sus datos cuando sea conveniente para usted.

¿Cómo funciona?

  • cifra los datos D para el usuario U con una clave generada aleatoriamente, K U, D.
  • a cifrar la clave K U, D con una clave K1 separada T, K generado a partir de una sal de azar, S1 T (que se mantiene un registro de) y la contraseña del usuario P1 T (que puede o no hacer un seguimiento de). La clave cifrada es E1 U.
  • Usted almacena S1 U y K1 U, K listo para cuando el usuario quiere acceder a sus datos.
  • Cuando el usuario U quiere acceder a sus datos, que le proporcionan su contraseña, P1 T, y miras hacia arriba S1 T y regenerar K1 T, K partir de esos datos, y usar eso para descifrar E1 U, dándole K U, D una vez más, con la que descifrar sus datos reales.
  • Asegúrate de que puedes detectar cuando la contraseña dada es correcta para que no emitas galimatías binarios si los usuarios escriben una contraseña incorrecta.

La ventaja de este nivel de indirección se produce cuando el usuario desea cambiar su contraseña. Si no utiliza alguna técnica análoga a esto, deberá obtener y validar la contraseña anterior y la nueva, descifrar todos los datos con la contraseña anterior y volver a encriptarlo con la nueva contraseña.

Con el nivel de indirección, todavía se solicitará al usuario su contraseña antigua (P1 T) y su nueva contraseña (P2 T) y validarlos, pero sólo hay que descifrar E1 T y a continuación, vuelva a cifrarlo con una nueva clave K2 U, K generada a partir de una nueva sal S2 U y la nueva contraseña P2 U. No tiene que tocar los datos encriptados en absoluto.

Con el nivel de indirección, el sistema S también puede guardar una segunda copia encriptada de la clave de datos K U, D, cifrada con la contraseña del sistema. Si resulta necesario o deseable cambiar la clave utilizada para encriptar los datos, el sistema puede usar su copia encriptada de la clave para hacerlo. Puede mantener un registro de qué tecla fue grabada por última vez por el usuario en su clave, por lo que cuando el usuario vuelve a mirar los datos, puede organizar el cambio de la clave almacenada K2 U, D porque en ese momento, tiene su contraseña (el resto del tiempo, no)

Esta es una variación leve de algunas de las ideas en "Cryptography in the Database: The Last Line of Defense" de Kevin Kenan. Las claves Kn U, K son ejemplos de una KEK, una clave de cifrado de clave. También podría leer sobre las familias clave en el libro, lo que ayudaría con la administración de datos encriptados.

Cuestiones relacionadas