Nunca debe utilizar la utilidad de línea de comandos de OpenSSL para el cifrado de propósito general. En realidad, está diseñado solo como una prueba de las rutinas de cifrado internas de la biblioteca. Debido a esto, existen algunos problemas inherentes a su uso cuando se necesita verdadera confidencialidad e integridad:
- Serás vulnerable a malleability ataques , ya que el modo CBC no está autenticado. Esto puede permitir que sus archivos se modifiquen de ciertas formas predecibles sin conocer la clave de cifrado.
- Sin verificación de integridad significa que el descifrado con la clave incorrecta puede ser exitoso, a pesar de generar incoherencias corruptas. Las utilidades diseñadas para el cifrado de archivos le indicarán si la clave es incorrecta.
- No se realiza el estiramiento de la clave, y la clave y la IV se derivan directamente de una función hash rápida única. Esto hace que los ataques de diccionario sean una amenaza mucho más grave.
- El hash predeterminado utilizado para derivar la clave maestra es MD5, que está lejos de ser lo ideal. Es posible cambiar el hash, por ejemplo con
-md sha512
, pero aún así no se utilizará el estiramiento de la clave.
- No está bien probado. Para muchas versiones de OpenSSL,
enc
usando el cifrado en modo GCM funcionó, pero el descifrado no lo hizo. Esto podría incluso ser el caso.
Esto no es exclusivo del comando enc
. La utilidad de línea de comandos OpenSSL tiene otros errores cuando uno intenta usarla para algo que no sea probar la biblioteca. Otro ejemplo es el comando s_client
, que se usa para conectarse a un servidor a través de SSL o TLS, que no valida el certificado del objetivo. En general, no debe utilizar la utilidad OpenSSL . Solo usa GnuPG:
La única vez que usaría OpenSSL directamente es si tuviera que cifrar algo con una clave completamente aleatoria o una clave sin formato específica y IV y no me importó la integridad del mensaje. Por ejemplo, escribir una secuencia pseudoaleatoria sembrada por el kernel a la salida estándar se puede hacer con:
openssl aes-128-ctr -nosalt -k $(xxd -l16 -c16 -ps /dev/urandom) -in /dev/zero
Del mismo modo, descifrar un blob de datos encriptados cuando conoce tanto la clave bruta como la IV bruta en hexadecimal (evitando la necesidad de -md
para la derivación de la clave) podría hacerse con:
openssl aes-128-cbc -d -nosalt -K $hex_key -iv $hex_iv -in infile -out outfile
¿Pero para el cifrado de archivos de propósito general? Solo usa GnuPG.