2011-02-24 25 views
18

Estoy usando la biblioteca mcrypt de PHP y el algoritmo AES-256 (rijndael), que requiere una clave + vector de inicialización para ejecutarse.Encriptación: ¿uso del vector de inicialización frente a la clave?

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

escenario teórico:
Si hubiera cifrado de datos sensibles almacenados en una base de datos, que sólo el propietario debe ser capaz de descifrar, ¿sería apropiado utilizar los usuarios de hash de contraseña a la tecla o la inicialización vector a sus datos?

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

+2

+1 buena pregunta. – rook

Respuesta

11

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, la IV debe ser aleatoria o usted estaría en violación de CWE-329. La razón por la cual este es un problema es un poco más sutil y I didn't get it at first. Usted no ha mencionado esto, pero espero que esté utilizando ya sea el CBC or CMAC modes

El uso de una función hash de una contraseña es casi idéntica a la utilización de 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.

+0

Hola torre. Eso fue todo nuevo para mí. ¡Muchas gracias! Debo estar a salvo, entonces, si utilicé 'CFC' con un IV no aleatorio? – Industrial

+0

@ Industrial Actualmente su modo 'CBC', y el IV ** debe ** ser aleatorio. En una base de datos puede tener una columna para el iv y generar este número usando 'mt_rand()'. – rook

+0

@Rook Hmm. No pude descifrar mis cadenas encriptadas sin tener un IV que sea consistente entre el cifrado y el descifrado, por lo que no hay nada realmente aleatorio. Tal vez estoy haciendo algo mal o ¿estás diciendo que el IV siempre debe ser completamente aleatorio? – Industrial

6

Vector de inicialización (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 recopilar en los datos cifrados. No "mejora" la potencia de cifrado por sí mismo.

Puede mirar here para obtener buenos diagramas que muestran cómo y por qué se usa IV.

+0

Eso es genial. ¡Gracias! – Industrial

7

No utilice la contraseña hash como fuente única para la clave y IV. Como regla general, debe generar IV aleatoria CADA VEZ que actualice datos encriptados 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 utiliza 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 para cada actualización de datos, se puede filtrar la información sobre los cambios en los datos. 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.

+0

consejo muy importante – davka

+0

¡Muchas gracias por el consejo! – Industrial

+0

Entonces, en vez de un campo en el DB, ¿ahora necesita al menos 3? Valor encriptado, IV y Salt? Incluso podemos agregarle la clave que lo convertiría en 4 campos en la base de datos (aunque no guardaría la clave en DB). Suena como un montón de trabajo, posiblemente innecesario? – Piero

0

Si está utilizando el modo EBP del cifrado de bloque, o la mayoría de los cifradores de flujo, 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 quiero decir 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.

+0

¿Qué es el modo EBP? Nunca he oído hablar de eso y una búsqueda rápida tampoco aparece nada. Los modos OFB y CTR tienen fugas en el flujo de claves, ya que en realidad son cifrados de flujo. Pero ningún modo popular filtra la clave en sí. – CodesInChaos

Cuestiones relacionadas