Solución:
Comparando los Synopsys de las dos versiones principales y recientes de OpenSSL, permítanme citar las páginas del manual.
OpenSSL 1.1.0
openssl enc -ciphername [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
OpenSSL 1.1.1
openssl enc -cipher [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-iter count] [-pbkdf2] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-rand file...] [-writerand file] [-engine id]
Obviamente, hay algunas diferencias mayores, es decir, considerando esta pregunta, faltan estos dos interruptores en 1.1.0:
-
pbkdf2
-
iter
Ahora tienes básicamente dos opciones. Ignore la advertencia o ajuste su comando de cifrado a algo como:
openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 100000 -salt -in InputFilePath -out OutputFilePath
Donde estos interruptores:
-
-aes-256-cbc
es lo que tu deberían uso para la máxima protección o la versión de 128 bits, el 3DES (Triple DES) se abandonó hace algún tiempo, vea Triple DES ha sido desaprobado por NIST en 2017, mientras que AES se acelera mucho en todas las CPU modernas; simplemente puede verificar si su CPU tiene el conjunto de instrucciones AES-NI, por ejemplo, usandogrep aes /proc/cpuinfo
; ganar, ganar -
-md sha512
es la variante más rápida de la familia de funciones SHA-2 en comparación con SHA-256, aunque podría ser un poco más segura; ganar, ganar -
-pbkdf2
: utilice el algoritmo PBKDF2 (función 2 de derivación de claves basada en contraseña) -
-iter 100000
está anulando el recuento predeterminado de iteraciones para la contraseña, citando la página del manual:Utilice un número determinado de iteraciones en la contraseña para derivar la clave de cifrado. Los valores altos aumentan el tiempo necesario para aplicar fuerza bruta al archivo resultante. Esta opción habilita el uso del algoritmo PBKDF2 para derivar la clave.
Parece que OpenSSL finalmente, después de al menos 6 años, reconoce que el enc
El comando tiene algunos defectos bastante serios (su propia página de manual los llama “errores”). Tal vez se estén arreglando ahora, pero si sus datos son importantes, ¿por qué no utilizar una herramienta (relativamente) mucho más segura como GnuPG? Tampoco es necesario que utilice el cifrado de clave pública, gpg también realiza el cifrado convencional (contraseña / archivo de claves solamente).
Aquí hay un extracto de mi otra respuesta que destaca los conceptos básicos:
OpenSSL deberían ser capaz de hacer las mismas cosas que hace gpg (OpenSSL existe desde 1998, pero si los números de versión significan algo, llegó a la versión 1 en 2010) pero es muy fácil cometer un error que podría reducir drásticamente la seguridad. Y de esta publicación en security.stackexchange.com (de enero de 2013) y otra de un usuario de reputación de 287K, el
openssl enc
El comando puede dejar algo que desear:El formato de cifrado utilizado por OpenSSL no es estándar: es “lo que hace OpenSSL”, y si todas las versiones de OpenSSL tienden a coincidir, todavía no hay ningún documento de referencia que describa este formato excepto el código fuente de OpenSSL. El formato del encabezado es bastante simple:
magic value (8 bytes): the bytes 53 61 6c 74 65 64 5f 5f salt value (8 bytes)
Por lo tanto, un encabezado fijo de 16 bytes, comenzando con la codificación ASCII de la cadena “Salted__”, seguida de la sal en sí. Eso es todo ! Sin indicación del algoritmo de cifrado; se supone que debe realizar un seguimiento de eso usted mismo.
El proceso mediante el cual la contraseña y la sal se convierten en la clave y el IV no está documentado, pero una mirada al código fuente muestra que llama a la función EVP_BytesToKey () específica de OpenSSL, que utiliza una función de derivación de clave personalizada con algunos hash repetidos. . Esta es una construcción no estándar y no bien examinada (!) Que se basa en la función hash MD5 de dudosa reputación (!!); esa función se puede cambiar en la línea de comandos con el indocumentado
-md
bandera (!!!); el “recuento de iteraciones” lo establece elenc
comando para 1 y no se puede cambiar (!!!!). Esto significa que los primeros 16 bytes de la clave serán iguales a MD5 (contraseña || salt), y eso es.¡Esto es bastante débil! Cualquiera que sepa cómo escribir código en una PC puede intentar descifrar tal esquema y podrá “probar” varias docenas de millones de contraseñas potenciales por segundo (cientos de millones serán alcanzables con una GPU). Si usa “openssl enc”, asegúrese de que su contraseña tenga una entropía muy alta. (es decir, más alto de lo que normalmente se recomienda; apunte a 80 bits, al menos). O, preferiblemente, no lo use en absoluto; en su lugar, opte por algo más robusto (GnuPG, cuando realiza un cifrado simétrico para una contraseña, usa un KDF más fuerte con muchas iteraciones de la función hash subyacente).
man enc
incluso tenía esto en “BUGS”:Debería haber una opción para permitir que se incluya un recuento de iteraciones.
Uno de los comentarios a la primera publicación incluso menciona que estos problemas han existido durante casi 10 años …
Este problema de recuento de iteraciones es una verdadera molestia. Tanto es así que hace casi 10 años hice un script perl “encriptado” que hace esencialmente lo mismo que “openssl enc” pero usa hash PBKDF2 iterativo. ict.griffith.edu.au/anthony/software#encrypt Desencriptará los archivos “openssl enc” salados, pero en su lugar los volverá a encriptar utilizando PBKDF2. ¡Lo habría hecho, aunque el cifrado de archivos OpenSSL ya habría mejorado! – Anthony 7 de febrero a las 5:05
A continuación se muestra un ejemplo de cifrado simétrico con gpg.
En breve:
gpg --symmetric --cipher-algo AES256 --output file.gpg file.txt
y
gpg --decrypt --output file.txt file.gpg
Recientemente instalé la última versión de cygwin. “openssl” comenzó a dar una advertencia:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
Entonces ahora uso lo siguiente para encriptar:
openssl aes-256-cbc -salt -pbkdf2 -in name -out name.aes
y lo siguiente para descifrar:
openssl aes-256-cbc -d -salt -pbkdf2 -in name.aes -out name