Solución:
En OpenSSL, la sal se antepondrá al principio de los datos cifrados, lo que permitirá descifrarlos. El propósito de la sal es prevenir ataques de diccionario, tablas de arco iris, etc. Lo siguiente es de la documentación de OpenSSL:
Sin la opción -salt es posible realizar ataques de diccionario eficientes a la contraseña y atacar datos cifrados con cifrado de flujo. La razón de esto es que sin la sal, la misma contraseña siempre genera la misma clave de cifrado. Cuando se utiliza la sal, los primeros ocho bytes de los datos cifrados se reservan para la sal: se genera al azar al cifrar un archivo y se lee del archivo cifrado cuando se descifra.
La documentación sugiere que un salt siempre se use con una contraseña, excepto si es necesaria la compatibilidad con versiones anteriores que no admiten un salt.
Password
y SALT
son dos cosas diferentes. Debe tener una contraseña con o sin sal (la contraseña es obligatoria mientras que la sal es opcional pero se recomienda).
El actual key
que se utiliza para el cifrado se maneja desde el password
y el SALT
, si se proporciona. Por lo tanto, incluso si se usa la misma contraseña para cifrar dos archivos, si se usa SALT, entonces la clave será diferente y el texto cifrado, por supuesto.
La contraseña nunca se agrega ni se codifica en el texto cifrado. Por el contrario, la sal se agrega al comienzo del texto cifrado. Pero no se puede utilizar para descifrar el texto cifrado sin la contraseña.
¿Por qué SALT es importante? Imagina que estás usando la misma contraseña sin SALT para cifrar diez archivos. Un adversario puede generar un diccionario de claves para posibles contraseñas y, una vez que una clave descifra correctamente un archivo, puede descifrar todos los archivos. Con SALT tiene que crear diez diccionarios diferentes uno para cada SALT, lo que le hace las cosas más caras y seguras para nosotros.
Hagamos cosas prácticas, usaré openssl 1.1.1:
Contraseña sin SALT:
echo "secret data in my file" > plaintext.txt
openssl enc -aes-128-cbc -nosalt -k "mySecretPassword" -in plaintext.txt -out enc1.nosalt.bin
openssl enc -aes-128-cbc -nosalt -k "mySecretPassword" -in plaintext.txt -out enc2.nosalt.bin
Ambos textos cifrados deben ser iguales porque la clave de cifrado solo depende de la contraseña que es la misma en ambos casos.
xxd enc1.nosalt.bin
00000000: 576e a82c 0dac 92d8 5e45 5ef4 3f6f db6a Wn.,....^E^.?o.j
00000010: 5630 554f 3f28 a0de ae96 91d9 1024 d5ca V0UO?(.......$..
xxd enc2.nosalt.bin
00000000: 576e a82c 0dac 92d8 5e45 5ef4 3f6f db6a Wn.,....^E^.?o.j
00000010: 5630 554f 3f28 a0de ae96 91d9 1024 d5ca V0UO?(.......$..
Contraseña y SALT:
openssl enc -aes-128-cbc -k "mySecretPassword" -in plaintext.txt -out enc2.salted.bin
openssl enc -aes-128-cbc -k "mySecretPassword" -in plaintext.txt -out enc1.salted.bin
El texto cifrado debería ser diferente debido al SALT, aunque usamos la misma contraseña. Tenga en cuenta que la sal se adjunta al principio del texto cifrado.
xxd enc2.salted.bin
00000000: 5361 6c74 6564 5f5f 9cfe 2d62 a2d4 70b8 Salted__..-b..p.
00000010: aee4 afb5 85c9 76a2 cb04 7e1d 27d9 94d4 ......v...~.'...
00000020: a1b3 c4d6 39b8 f5a8 c300 81b5 b6ed 4cca ....9.........L.
xxd enc1.salted.bin
00000000: 5361 6c74 6564 5f5f e73c ee5b 701b bba8 Salted__.<.[p...
00000010: fa25 c54e befa 26dc ddb1 3a2d 2bd7 a95b .%.N..&...:-+..[
00000020: bda9 56f0 4445 f229 3398 4076 1044 dad6 ..V.DE.)[email protected]