Sal aleatoria y clave PBKDF2
Supongamos que escribí una función $$(salt,IV ) = \text{keyIVGenerator}(passwd)$$que genera una sal aleatoria de tamaño 32 bytes y un vector de inicialización aleatorio (IV) de tamaño 16 bytes. Luego, use una función de derivación de clave (KDF) como PBKDF2 para generar una clave de 32 bytes de longitud (dkLen = 32).
$$key = PBKDF2(password, salt, deLen)$$
Creé una función $$ c = encryption(key,data,IV)$$, suponga que el relleno de datos (usando aes CBC) se realiza correctamente y que la lógica es correcta.
Cuando le pido al usuario cifrado y datos, paso la contraseña a la función $keyIVGenerator(passwd)$ para obtener el $IV,key$y $passwd$ ellos al $encryption(key,data,iv)$junto con los datos. El cifrado funciona.
Y ahora suponga que tengo que descifrar los datos. Necesitaré pasar la misma clave generada por PBKDF2 para que el cifrado descifre mis datos. El iv fue antepuesto al texto cifrado.
Pero ¿qué pasa con la sal?
Si paso la contraseña solicitada al usuario a $keyIVGenerator(passwd)$ generará una nueva clave con la nueva sal aleatoria, por lo que los datos no se descifrarán.
¿Se supone que debo anteponer mi sal al texto cifrado también? ¿Debo mantener una base de datos de sales?
¿Cómo genero la misma clave desde PBKDF2?
Respuestas
Sí, generalmente la sal se antepone al texto cifrado.
En principio, siempre genera una nueva clave para cada sal, por lo que es posible que no necesite el IV. Sin embargo, usaría la salida de PBKDF2 para crear un IV y una clave aleatorios solo para estar seguro (por ejemplo, usar SHA-512 y luego usar el 32 más a la izquierda para la clave y los siguientes 16 bytes para el IV).
También es posible usar HKDF en la salida de PBKDF2 para separar tanto la clave de datos como el IV de la clave intermedia generada (eso es más ordenado, pero también más difícil de implementar).
Notas:
- Sería una buena idea utilizar un modo autenticado como GCM. En ese caso, el IV debería ser de 12 bytes.
dkLense especifica en bits, no en bytes, al menos en el estándar. Los tamaños de clave generalmente lo son.- Una sal de 16 bytes es generalmente suficiente, pero 32 bytes también está bien (aún debe caber en un solo bloque de incluso SHA-256, por lo que probablemente no influirá en el factor de trabajo creado por la función hash y el recuento de iteraciones).