Wie verwende ich OpenSSL zum Ver- / Entschlüsseln von Dateien?

205

Ich möchte eine Datei mit einem Passwort verschlüsseln und entschlüsseln.

Wie kann ich dazu OpenSSL verwenden?

aF.
quelle
2
Sie sollten einen Schlüssel und eine IV aus dem Passwort mit ableiten PKCS5_PBKDF2_HMAC. Sie sollten die EVP_*Funktionen zum Ver- und Entschlüsseln verwenden. Siehe EVP Symmetric Encryption and Decryption im OpenSSL-Wiki. In der Tat sollten Sie wahrscheinlich eine authentifizierte Verschlüsselung verwenden, da diese sowohl Vertraulichkeit als auch Authentizität bietet . Siehe EVP-authentifizierte Verschlüsselung und Entschlüsselung im OpenSSL-Wiki.
JWW
3
Verstehe aus deiner Frage nicht, warum du OpenSSL willst. Ein Kommentar unten zeigt, dass GPG besser ist - auch aus Sicherheitsgründen. stackoverflow.com/a/31552829/952234 Ich stimme ab.
Jaroslaw Nikitenko

Antworten:

261

Sicherheitswarnung : AES-256-CBC bietet keine authentifizierte Verschlüsselung und ist anfällig für Padding-Orakelangriffe . Sie sollten stattdessen so etwas wie Alter verwenden.

Verschlüsseln:

openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc

Entschlüsseln:

openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new

Weitere Details zu den verschiedenen Flags

Szocske
quelle
18
Die Antwort ist wahrscheinlich nicht optimal (zum Zeitpunkt dieses Schreibens), abhängig vom Anwendungsfall des OP. Insbesondere sind die Parameter "-a" wahrscheinlich nicht optimal und die Antwort erklärt nicht ihre Verwendung. "-a" wird normalerweise verwendet, wenn die verschlüsselte Ausgabe in ASCII / Text-Form übertragen werden soll, und hat den Effekt, dass die Ausgabegröße im Vergleich zur binären Form erhöht wird. Das Originalplakat gibt kein Ausgabeformat an, und daher sollte dies zumindest erwähnt werden. Siehe Antwort: stackoverflow.com/a/31552829/952234, die auch einen Hinweis enthält, warum Sie für diese Aufgabe gpg anstelle von openssl verwenden sollten.
Moo
7
Verwenden Sie den obigen Befehl nicht, da keine Schlüsselableitung erfolgt. Lesen Sie hier mehr: openssl Schwachschlüsselableitung
jonasl
Sollte auch einen Schlüssel angeben oder angeben, woher er kommt. Ist es gestärkt?
Tuntable
2
@jonasl Laut der neuesten Manpage heißt es: "Der Standard-Digest wurde in Openssl 1.1.0 von MD5 auf SHA256 geändert." Quelle: github.com/openssl/openssl/blob/master/doc/man1/enc.pod
Kebman
2
Wenn Sie den Kommentar von @Kebman ergänzen, können Sie ihn -md sha256zu Ihrem Befehl zum Codieren und Decodieren hinzufügen , wenn Sie diese Datei auf einem anderen Computer verwenden möchten . Das sollte Sie gegen Inkompatibilitäten / Unterschiede in der OpenSSL-Version
schützen
162

Kurze Antwort:

Sie möchten wahrscheinlich gpgstattdessen verwenden openssl, siehe "Zusätzliche Hinweise" am Ende dieser Antwort. Aber um die Frage zu beantworten mit openssl:

So verschlüsseln Sie:

openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data

So entschlüsseln Sie:

openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data

Hinweis: Beim Ver- oder Entschlüsseln werden Sie zur Eingabe eines Kennworts aufgefordert.


Lange Antwort:

Ihre beste Informationsquelle openssl encwäre wahrscheinlich: https://www.openssl.org/docs/man1.1.1/man1/enc.html

Befehlszeile: openssl enc hat folgende Form:

openssl enc -ciphername [-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] [-p] [-P] 
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]

Erklärung der nützlichsten Parameter in Bezug auf Ihre Frage:

-e
    Encrypt the input data: this is the default.

-d    
    Decrypt the input data.

-k <password>
    Only use this if you want to pass the password as an argument. 
    Usually you can leave this out and you will be prompted for a 
    password. The password is used to derive the actual key which 
    is used to encrypt your data. Using this parameter is typically
    not considered secure because your password appears in 
    plain-text on the command line and will likely be recorded in 
    bash history.

-kfile <filename>
    Read the password from the first line of <filename> instead of
    from the command line as above.

-a
    base64 process the data. This means that if encryption is taking 
    place the data is base64 encoded after encryption. If decryption 
    is set then the input data is base64 decoded before being 
    decrypted.
    You likely DON'T need to use this. This will likely increase the
    file size for non-text data. Only use this if you need to send 
    data in the form of text format via email etc.

-salt
    To use a salt (randomly generated) when encrypting. You always
    want to use a salt while encrypting. This parameter is actually
    redundant because a salt is used whether you use this or not 
    which is why it was not used in the "Short Answer" above!

-K key    
    The actual key to use: this must be represented as a string
    comprised only of hex digits. If only the key is specified, the
    IV must additionally be specified using the -iv option. When 
    both a key and a password are specified, the key given with the
    -K option will be used and the IV generated from the password 
    will be taken. It probably does not make much sense to specify 
    both key and password.

-iv IV
    The actual IV to use: this must be represented as a string 
    comprised only of hex digits. When only the key is specified 
    using the -K option, the IV must explicitly be defined. When a
    password is being specified using one of the other options, the 
    IV is generated from this password.

-md digest
    Use the specified digest to create the key from the passphrase.
    The default algorithm as of this writing is sha-256. But this 
    has changed over time. It was md5 in the past. So you might want
    to specify this parameter every time to alleviate problems when
    moving your encrypted data from one system to another or when
    updating openssl to a newer version.

Zusätzliche Bemerkungen:

Obwohl Sie speziell nach OpenSSL gefragt haben, möchten Sie möglicherweise GPG zum Zwecke der Verschlüsselung verwenden, die auf diesem Artikel basiert. OpenSSL vs GPG zum Verschlüsseln von externen Backups?

Um GPG zu verwenden, verwenden Sie die folgenden Befehle:

So verschlüsseln Sie:

gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data

So entschlüsseln Sie:

gpg --output un_encrypted.data --decrypt encrypted.data

Hinweis: Beim Ver- oder Entschlüsseln werden Sie zur Eingabe eines Kennworts aufgefordert.

muhen
quelle
8
Toller Kommentar zum Vorzug von GPG gegenüber OpenSSL. Ich finde es unglaublich, dass OpenSSL einen so schwachen, vom Passwort abgeleiteten Hash für den Schlüssel verwendet!
Mark
2
Stellen Sie sicher, dass Sie die Option "-md md5" verwenden, um die Kompatibilität mit Dateien zu gewährleisten, die auf älteren openssl ohne die angegebene Option -md verschlüsselt wurden. Andernfalls werden Dateien auf neueren Systemen nicht entschlüsselt: github.com/libressl-portable/ Portable / Issues / 378
Sam Liddicott
1
Die Standardwerte ändern sich zwischen den Versionen von openssl. 1.0.x verwendet für die Option -md den Standardwert md5. Version 1.1.x verwendet sha256. Wenn Sie entschlüsseln und den Fehler ": Digital Envelope Routines: EVP_DecryptFinal_ex: Bad Decrypt" erhalten. Geben Sie "-md md5" oder "-md sha256" an.
Txyoji
1
"Beim Ver- oder Entschlüsseln werden Sie zur Eingabe eines Kennworts aufgefordert." gpglässt mich eine Datei entschlüsseln, ohne zur Eingabe eines Passworts aufgefordert zu werden. Es sieht so aus, als ob das Passwort für einen bestimmten Zeitraum gespeichert ist, was ich nicht möchte.
user76284
1
@moo Es scheint auch, dass die Option --no-symkey-cachedas Caching deaktiviert, wenn gpg mit verwendet wird --symmetric, selbst wenn der Agent ausgeführt wird.
user76284
32

Verschlüsseln:

openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey

Entschlüsseln:

openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey

Einzelheiten finden Sie in den openssl(1)Dokumenten.

Ken Cheung
quelle
11
Um ein Klartext-Passwort zu verwenden, ersetzen Sie es -k symmetrickeydurch -pass stdinoder-pass 'pass:PASSWORD'
Zenexer
3
Verwenden Sie den obigen Befehl nicht, da keine Schlüsselableitung erfolgt. Lesen Sie hier mehr: openssl Schwachschlüsselableitung
jonasl
4
Beachten Sie, dass im Zusammenhang mit @ jonasls Kommentar -k symmetrickeyirreführend ist. Die -kOption wird zur Angabe eines Kennworts verwendet, von dem OpenSSL den symmetrischen Schlüssel ableitet. Wenn Sie den symmetrischen Schlüssel angeben möchten, müssen Sie die -KOption verwenden.
user1071847
13

VERWENDEN SIE KEINE OPENSSL DEFAULT KEY-ABLEITUNG.

Derzeit wird die akzeptierte Antwort verwendet und sie wird nicht mehr empfohlen und ist nicht mehr sicher.

Es ist sehr gut möglich, dass ein Angreifer den Schlüssel einfach brutal erzwingt.

https://www.ietf.org/rfc/rfc2898.txt

PBKDF1 wendet eine Hash-Funktion an, die MD2 [6], MD5 [19] oder SHA-1 [18] sein soll, um Schlüssel abzuleiten. Die Länge des abgeleiteten Schlüssels wird durch die Länge der Hash-Funktionsausgabe begrenzt, die 16 Oktette für MD2 und MD5 und 20 Oktette für SHA-1 beträgt. PBKDF1 ist mit dem Schlüsselableitungsprozess in PKCS # 5 v1.5 kompatibel. PBKDF1 wird nur aus Gründen der Kompatibilität mit vorhandenen Anwendungen empfohlen, da die von ihm erzeugten Schlüssel für einige Anwendungen möglicherweise nicht groß genug sind.

PBKDF2 wendet eine Pseudozufallsfunktion an (ein Beispiel finden Sie in Anhang B.1), um Schlüssel abzuleiten. Die Länge des abgeleiteten Schlüssels ist im Wesentlichen unbegrenzt. (Der maximal effektive Suchraum für den abgeleiteten Schlüssel kann jedoch durch die Struktur der zugrunde liegenden Pseudozufallsfunktion begrenzt sein. Weitere Informationen finden Sie in Anhang B.1.) PBKDF2 wird für neue Anwendungen empfohlen.

Mach das:

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

Hinweis : Iterationen bei der Entschlüsselung müssen mit Iterationen bei der Verschlüsselung identisch sein.

Iterationen müssen mindestens 10000 sein. Hier ist eine gute Antwort auf die Anzahl der Iterationen: https://security.stackexchange.com/a/3993

Außerdem ... haben wir hier genug Leute, die GPG empfehlen. Lies die verdammte Frage.

Arnold Balliu
quelle
4

So verschlüsseln Sie:

$ openssl bf < arquivo.txt > arquivo.txt.bf

So entschlüsseln Sie:

$ openssl bf -d < arquivo.txt.bf > arquivo.txt

bf === Blowfish im CBC-Modus

fabio almeida
quelle
3

Aktualisieren Sie mit einem zufällig generierten öffentlichen Schlüssel.

Encypt:

openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}

Entschlüsseln:

openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}

Ich habe ein vollständiges Tutorial dazu unter http://bigthinkingapplied.com/key-based-encryption-using-openssl/

nneko
quelle
3

Beachten Sie, dass die OpenSSL-CLI einen schwachen, nicht standardmäßigen Algorithmus verwendet, um die Passphrase in einen Schlüssel zu konvertieren. Die Installation von GPG führt dazu, dass verschiedene Dateien zu Ihrem Home-Verzeichnis hinzugefügt werden und ein Hintergrundprozess für einen GPG-Agenten ausgeführt wird. Wenn Sie maximale Portabilität und Kontrolle mit vorhandenen Tools wünschen, können Sie mit PHP oder Python auf die untergeordneten APIs zugreifen und direkt einen vollständigen AES-Schlüssel und IV übergeben.

Beispiel für einen PHP-Aufruf über Bash:

IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456

ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED

Dies gibt aus:

$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456

Sie können auch die PHP- openssl_pbkdf2Funktion verwenden, um eine Passphrase sicher in einen Schlüssel umzuwandeln.

zeroimpl
quelle
Openssl CLI implementiert und warnt Benutzer jetzt, dass sie PBKDF2 für das Passwort-Hashing verwenden sollten. Die Standard-Iterationszahl ist jedoch sehr niedrig und muss viel größer sein.
Anthony
2

Es gibt ein Open-Source-Programm, das ich online finde und das openssl zum Ver- und Entschlüsseln von Dateien verwendet. Dies geschieht mit einem einzigen Passwort. Das Tolle an diesem Open Source-Skript ist, dass es die ursprüngliche unverschlüsselte Datei löscht, indem es die Datei vernichtet. Das Gefährliche ist jedoch, dass Sie, sobald die ursprüngliche unverschlüsselte Datei verschwunden ist, sicherstellen müssen, dass Sie sich an Ihr Passwort erinnern, da dies sonst keine andere Möglichkeit ist, Ihre Datei zu entschlüsseln.

Hier ist der Link auf Github

https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py

Michael Linkston
quelle
Bei der Verwendung von openssl für die Dateiverschlüsselung haben sich die Dinge geändert. Es gibt viel mehr Optionen, die gespeichert werden müssen, damit Sie verschlüsselte Dateien erfolgreich entschlüsseln können. Eine Lösung hierfür ist „Keepout“ antofthy.gitlab.io/software/#keepout
anthony
2

Wie in den anderen Antworten erwähnt, verwendeten frühere Versionen von openssl eine Ableitungsfunktion für schwache Schlüssel, um einen AES-Verschlüsselungsschlüssel aus dem Kennwort abzuleiten. OpenSL v1.1.1 unterstützt jedoch eine stärkere Funktion zur Schlüsselableitung, bei der der Schlüssel aus dem Kennwort pbkdf2mit einem zufällig generierten Salt und mehreren Iterationen von sha256-Hashing (standardmäßig 10.000) abgeleitet wird.

So verschlüsseln Sie eine Datei:

 openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename

So entschlüsseln Sie eine Datei:

  openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
mti2935
quelle
Da sich diese Optionen ständig ändern, müssen Sie auch aufzeichnen, welche Optionen beim Erstellen jeder mit openssl verschlüsselten Datei verwendet wurden. Zumal die Anzahl der Iterationen mit der Zeit zunehmen sollte! Für eine Lösung siehe relativ einfachen Wrapper um openssl enc ... "keepout" antofthy.gitlab.io/software/#keepout Es kann erweitert werden, um mehr openssl einzuschließen, wenn die Zeit vergeht.
Anthony
@anthony sieht aus wie ein nützliches Projekt. Siehe auch github.com/meixler/web-browser-based-file-encryption-decryption
mti2935
0

Zusätzliche Kommentare zu mti2935 gute Antwort.

Je höher die Iteration, desto besser der Schutz vor roher Gewalt. Sie sollten eine hohe Iteration verwenden, da Sie sich Leistung / Ressourcen leisten können.

Auf meinem alten Intel i3-7100 verschlüsselt eine ziemlich große Datei 1,5 GB:

 time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds: 2,564s

 time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds:  2,775s

Kein wirklicher Unterschied, habe aber die Speichernutzung nicht überprüft (?)

Mit den heutigen GPUs und den noch schnelleren von morgen scheint jede Sekunde eine Brute-Force-Iteration in Milliardenhöhe möglich zu sein.

Vor 12 Jahren NVIDIA GeForce 8800 Ultrakonnte a über 200.000 Millionen / Sek. Iterationen iterieren (MD5-Hashing allerdings)

Quelle: Ainane-Barrett-Johnson-Vivar-OpenSSL.pdf

MrCalvin
quelle