simple que encrypt data cbc php security encryption cryptography mcrypt

php - que - Cifrado: ¿Uso del vector de inicialización vs clave?



que es mcrypt php (4)

Estoy utilizando la biblioteca mcrypt de PHP y el AES-256 (rijndael), que requiere un vector de inicialización de tecla + clave para ejecutarse.

Mi cerebro lógico no está de acuerdo con esto. ¿No es solo una clave suficiente?

Escenario teórico:
Si tuviera datos confidenciales cifrados almacenados en una base de datos, que solo el propietario debería poder descifrar, ¿sería apropiado usar la contraseña de hash del usuario para la clave o el vector de inicialización de sus datos?

¿Debería considerarse la clave más privada que el vector de inicialización o es al revés?


El Vector de inicialización (IV) no es una clave en absoluto, y no es secreto. De hecho, a menudo se expone (por ejemplo, ante los datos encriptados). Se utiliza como una entrada aleatoria adicional para el algoritmo de cifrado, de modo que el resultado de cifrar los mismos datos claros sea diferente cada vez que utilice un IV diferente. De esta manera, las estadísticas no se pueden recopilar en los datos cifrados. No "mejora" la fuerza de cifrado por sí misma.

Puede buscar here diagramas agradables que muestran cómo y por qué se usa la IV.


No use la contraseña con hash como una sola fuente para la clave y IV. Como regla general, debe generar IV al azar CADA VEZ que actualice los datos cifrados y almacene IV con estos datos. La clave se puede reutilizar varias veces, pero use hashing salado y almacene sal con datos también.

Si solo hash las contraseñas de usuario y las usas como claves de cifrado, los usuarios con las mismas contraseñas tendrán las mismas claves. Dependiendo de la estructura de su base de datos y de los derechos de acceso de intrusos, podría haber algunos casos desafortunados en los que se puedan detectar usuarios con las mismas contraseñas. Agrega al menos un nombre de usuario único a este hash.

Si no cambia IV por cada actualización de datos, se puede filtrar información sobre los cambios de datos. Con el modo CBC o CFB, los primeros bloques de texto simple idénticos se cifrarán a texto cifrado idéntico hasta el primer cambio de texto simple, por lo que se puede determinar la posición de este cambio.


No, de hecho, una IV es vital en la mayoría de las implementaciones. La IV también se considera segura para el uso público, por ejemplo, la IV se transmite en texto sin formato para WEP y WPA1 / WPA2. El problema surge cuando esta misma clave + iv se utiliza para cifrar el mismo texto sin formato. Los textos cifrados serán idénticos, a menos que utilice un IV. Si un atacante puede cifrar texto simple arbitrario con esta clave, y luego ver el texto cifrado. Esta es una forma mucho más rápida de forzar a otro texto de cifrado que el atacante ha obtenido.

No solo eso, el IV debe ser aleatorio o usted estaría en violación de CWE-329 . La razón por la que este es un problema es un poco más sutil y no lo entendí al principio . No mencionaste esto, pero espero que estés usando los modos CBC o CMAC

El uso de una función hash en una contraseña es casi idéntico a usar una función String2Key. Este es un diseño sólido siempre que un atacante no pueda usar la inyección SQL para obtener la clave.


Si está utilizando el modo EBP del cifrado de bloque, o la mayoría de los cifrados de flujo, las combinaciones idénticas de clave + IV en diferentes puntos de vista ofrecerán a los atacantes una vista directa del resultado XOR de la clave. Esto por extensión revela la clave en sí misma y hasta cierto punto la contraseña.

¿Pero quiero decir que las IV son definitivamente necesarias? No. Siempre que cambie su contraseña cada vez en su próximo bloque de texto plano (incluso el mismo bloque la segunda vez), estará completamente bien sin IV. De hecho, todo lo que hace un IV es la automatización del proceso anterior.