2012-06-09 22 views
7

Estoy escribiendo una aplicación de Android que tiene como objetivo encriptar y descifrar archivos usando AES 256. Estoy usando el modo AES-CBC y PBKDF2 para derivar la clave AES de una contraseña ingresada por el usuario. Además, estoy generando una sal segura y pseudoaleatoria para cada clave de cifrado de archivo. Estoy almacenando el IV y la sal con el archivo cifrado, por lo que puedo volver a leerlos y regenerar la clave más adelante para poder descifrar el archivo.¿Se almacena la sal junto con la seguridad de interrupción de archivos cifrados?

Mi pregunta: ¿Almacenar la sal junto con la seguridad de la rotura del archivo cifrado y el significado de la sal en sí? ¿No puede un atacante saber que la sal y el IV realizan un ataque de fuerza bruta sin conexión contra el archivo cifrado para averiguar la clave de cifrado?

Respuesta

10

El objetivo principal de la sal no es ser secreto, sino asegurarse de que un atacante no pueda usar atajos cuando intente usar la contraseña bruta, como usar tablas rainbow (es decir, una tabla existente o una nueva) para ser utilizado para múltiples archivos cifrados), o fuerza bruta de múltiples archivos recopilados (que deben tener diferentes sales) a la vez.

Siempre que su contraseña tenga suficiente entropía y el número de iteraciones en la función de derivación de clave sea lo suficientemente alto, almacenar el sal con el texto cifrado no es un problema. La sal por sí sola no permitirá que nadie descifre el archivo.

Además, si desea mantener la sal en secreto (generalmente se llama "pimienta" en lugar de sal), tendrá que pensar en algún mecanismo para obtener la sal adecuada para la que descifra legítimamente.

+0

Pero, ¿y si el atacante construyera una tabla de arcoíris con una sal válida que pueda leer en texto sin formato del archivo? –

+9

@AlexAmiryan La construcción de una mesa de arcoíris es al menos tan cara como un ataque de fuerza bruta. Entonces, si no puede reutilizar la tabla (y eso es lo que previenen las sales), es inútil construir una tabla. Simplemente ejecuta un ataque de fuerza bruta directamente. – CodesInChaos

2

Salt se utiliza para funciones unidireccionales, como hashing a password.

Random IV se utiliza para funciones bidireccionales, como el cifrado de datos que luego pueden descifrarse.

Ambos son bytes aleatorios y se utilizan para evitar que la misma información produzca el mismo resultado después de ser aplicada por la función. Entonces, si dos personas eligen la misma contraseña para almacenar sus datos y almacenar la misma información, los bytes cifrados serán diferentes.

Puede almacenarlos junto con el archivo cifrado.

También use más de 1 iteración con PBKDF2 o si no es bastante inútil. De acuerdo con Wikipedia iOS 3 usa 2,000 iteraciones y iOS 4 usa 10,000.

+1

¿Puede ser más descriptivo por qué es seguro almacenar IV y sal junto con el archivo cifrado? –

Cuestiones relacionadas