Quiero encriptar y desencriptar un archivo usando una contraseña.
¿Cómo puedo usar OpenSSL para hacer eso?
encryption
openssl
aF.
fuente
fuente
PKCS5_PBKDF2_HMAC
. Debe usar lasEVP_*
funciones para cifrar y descifrar. Vea EVP Symmetric Encryption and Decryption en la wiki de OpenSSL. De hecho, probablemente debería ser autenticado mediante el cifrado, ya que proporciona tanto la confidencialidad y autenticidad. Vea EVP Authenticated Encryption and Decryption en la wiki de OpenSSL.Respuestas:
Cifrar:
Descifrar:
Más detalles sobre las diferentes banderas.
fuente
-md sha256
a su comando de codificación y decodificación si planea usar este archivo en otra máquina. Eso debería cubrirlo contra las incompatibilidades / diferencias de la versión OpenSSLRespuesta corta:
Es probable que desee utilizar en
gpg
lugar deopenssl
ver las "Notas adicionales" al final de esta respuesta. Pero para responder la pregunta usandoopenssl
:Encriptar:
Para descifrar:
Nota: Se le solicitará una contraseña cuando cifre o descifre.
Respuesta larga:
Su mejor fuente de información
openssl enc
probablemente sería: https://www.openssl.org/docs/man1.1.1/man1/enc.htmlLínea de comando:
openssl enc
toma la siguiente forma:Explicación de los parámetros más útiles con respecto a su pregunta:
Notas adicionales:
Aunque ha preguntado específicamente sobre OpenSSL, es posible que desee considerar el uso de GPG en su lugar con el propósito de cifrado basado en este artículo OpenSSL vs GPG para cifrar copias de seguridad fuera del sitio.
Para usar GPG para hacer lo mismo, usaría los siguientes comandos:
Encriptar:
Para descifrar:
Nota: Se le solicitará una contraseña cuando cifre o descifre.
fuente
gpg
me permite descifrar un archivo sin que se me solicite una contraseña. Parece que la contraseña está almacenada durante un período de tiempo, que no quiero.--no-symkey-cache
deshabilita el almacenamiento en caché al usar gpg con--symmetric
, incluso si el agente se está ejecutando.Cifrar:
Descifrar:
Para más detalles, ver los
openssl(1)
documentos.fuente
-k symmetrickey
con-pass stdin
o-pass 'pass:PASSWORD'
-k symmetrickey
es engañoso. La-k
opción se utiliza para especificar una contraseña, de la cual OpenSSL deriva la clave simétrica. Si desea especificar la clave simétrica, debe usar la-K
opción.NO UTILICE OPENSSL DEFAULT KEY DERIVATION.
Actualmente, la respuesta aceptada la utiliza y ya no se recomienda ni es segura.
Es muy factible que un atacante simplemente fuerce la llave con fuerza bruta.
https://www.ietf.org/rfc/rfc2898.txt
Hacer esto:
openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow
openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out
Nota : Las iteraciones en el descifrado deben ser las mismas que las iteraciones en el cifrado.
Las iteraciones tienen que ser un mínimo de 10000. Aquí hay una buena respuesta sobre la cantidad de iteraciones: https://security.stackexchange.com/a/3993
Además ... tenemos suficiente gente aquí recomendando GPG. Lee la maldita pregunta.
fuente
Encriptar:
Para descifrar:
bf === Blowfish en modo CBC
fuente
Actualice utilizando una clave pública generada al azar.
Encypt:
Descifrar:
Tengo un tutorial completo sobre esto en http://bigthinkingapplied.com/key-based-encryption-using-openssl/
fuente
Tenga en cuenta que la CLI de OpenSSL utiliza un algoritmo no estándar débil para convertir la frase de contraseña en una clave, y la instalación de resultados de GPG en varios archivos agregados a su directorio de inicio y un proceso de fondo del agente gpg en ejecución. Si desea la máxima portabilidad y control con las herramientas existentes, puede usar PHP o Python para acceder a las API de nivel inferior y pasar directamente una clave AES completa y IV.
Ejemplo de invocación de PHP a través de Bash:
Esto produce:
También puede usar la
openssl_pbkdf2
función de PHP para convertir una frase de contraseña en una clave de forma segura.fuente
Hay un programa de código abierto que encuentro en línea que utiliza openssl para cifrar y descifrar archivos. Lo hace con una sola contraseña. Lo mejor de este script de código abierto es que elimina el archivo original sin cifrar al destruir el archivo. Pero lo peligroso es que una vez que el archivo original no encriptado haya desaparecido, debe asegurarse de recordar su contraseña; de lo contrario, no habrá otra forma de descifrar su archivo.
Aquí el enlace está en github
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
fuente
Como se mencionó en las otras respuestas, las versiones anteriores de openssl usaban una función de derivación de clave débil para derivar una clave de cifrado AES de la contraseña. Sin embargo, openssl v1.1.1 admite una función de derivación de clave más fuerte, donde la clave se deriva de la contraseña utilizando
pbkdf2
una sal generada aleatoriamente y múltiples iteraciones de hash sha256 (10,000 por defecto).Para cifrar un archivo:
Para descifrar un archivo:
fuente
Comentarios adicionales a mti2935 buena respuesta.
Parece que a mayor iteración, mejor protección contra la fuerza bruta, y debe usar una iteración alta, ya que puede permitirse el rendimiento / recurso inteligente.
En mi viejo Intel i3-7100 encriptando un archivo bastante grande de 1.5GB:
Realmente no hay ninguna diferencia, aunque no verifiqué el uso de memoria (?)
Con las GPU de hoy, y las mañanas aún más rápidas, creo que mil millones de iteraciones de fuerza bruta parecen posibles cada segundo.
Hace 12 años, a
NVIDIA GeForce 8800 Ultra
podía iterar más de 200,000 millones / seg de iteraciones (aunque el hash MD5)fuente: Ainane-Barrett-Johnson-Vivar-OpenSSL.pdf
fuente