Cifrado: ¿uso del vector de inicialización frente a la clave?

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

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

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

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

No, de hecho, un IV es vital en la mayoría de las implementaciones. La IV también se considera segura para 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 usa para encriptar el mismo texto sin formato. Los textos de cifrado serán idénticos, a menos que use un IV. Si un atacante puede cifrar texto plano arbitrario con esta clave, y luego ver el texto de cifrado. Esta es una forma mucho más rápida de forzar bruto otro texto de cifrado que el atacante ha obtenido.

No solo eso, el IV debe ser aleatorio o estarías en violación de CWE-329 . La razón por la cual este es un problema es un poco más sutil y al principio no lo entendí . 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 al uso de la 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.

No use la contraseña hash como una fuente única para la clave y IV. Como regla general, debe generar IV aleatoria CADA VEZ que actualice los datos cifrados y almacene IV con estos datos. La clave puede reutilizarse varias veces, pero también puede usar hashing salado y almacenar sal.

Si solo hash 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 del intruso, podría haber algunos casos desafortunados en los que se puedan detectar usuarios con las mismas contraseñas. Agregue al menos nombre de usuario único a este hash.

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

Inicialización Vector (IV) no es una clave en absoluto, y no es secreto. De hecho, a menudo está expuesto (por ejemplo, antepuesto a los datos encriptados). Se utiliza como una entrada aleatoria adicional al algoritmo de encriptación, de modo que el resultado de encriptar los mismos datos claros es diferente cada vez que usa una IV diferente. De esta forma, las estadísticas no se pueden recostackr en los datos cifrados. No “mejora” la potencia de cifrado por sí mismo.

Puede buscar aquí buenos diagtwigs que muestran cómo y por qué se usa IV.

Si está utilizando el modo EBP del cifrado de bloque, o la mayoría de los cifradores de flujo, las combinaciones idénticas de teclas + IV en planos diferentes ofrecerán a los atacantes una vista directa del resultado XOR de la clave. Esto por extensión revela la clave y, en cierta medida, la contraseña.

¿Pero me refiero a que los IV son definitivamente necesarios? No. Siempre que cambie su contraseña todas y cada una de las veces en su próximo bloque de texto sin texto (incluso el mismo bloque la segunda vez), estará completamente bien sin IV. De hecho, todo lo que hace una IV es la automatización del proceso anterior.