Chcę zaszyfrować i odszyfrować jeden plik za pomocą jednego hasła.
Jak mogę to zrobić za pomocą OpenSSL?
Chcę zaszyfrować i odszyfrować jeden plik za pomocą jednego hasła.
Jak mogę to zrobić za pomocą OpenSSL?
Odpowiedzi:
Ostrzeżenie bezpieczeństwa : AES-256-CBC nie zapewnia uwierzytelnionego szyfrowania i jest podatny na ataki typu padding oracle . Zamiast tego powinieneś użyć czegoś takiego jak wiek .
Szyfruj:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
Odszyfruj:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
-md sha256
do swojego polecenia kodowania i dekodowania, jeśli planujesz używać tego pliku na innym komputerze. To powinno Cię zabezpieczyć przed niezgodnościami / różnicami wersji OpenSSL
Prawdopodobnie chcesz użyć gpg
zamiast tego openssl
, patrz „Dodatkowe uwagi” na końcu tej odpowiedzi. Ale aby odpowiedzieć na pytanie, używając openssl
:
Aby zaszyfrować:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
Aby odszyfrować:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
Uwaga: Podczas szyfrowania lub deszyfrowania pojawi się monit o podanie hasła.
Najlepszym źródłem informacji jest openssl enc
prawdopodobnie: https://www.openssl.org/docs/man1.1.1/man1/enc.html
Wiersz polecenia:
openssl enc
przyjmuje następującą postać:
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]
Wyjaśnienie najbardziej przydatnych parametrów w odniesieniu do twojego pytania:
-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.
Chociaż konkretnie pytałeś o OpenSSL, możesz rozważyć użycie GPG zamiast do szyfrowania na podstawie tego artykułu OpenSSL vs GPG do szyfrowania kopii zapasowych poza witryną?
Aby użyć tego samego GPG, użyj następujących poleceń:
Aby zaszyfrować:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
Aby odszyfrować:
gpg --output un_encrypted.data --decrypt encrypted.data
Uwaga: Podczas szyfrowania lub deszyfrowania pojawi się monit o podanie hasła.
gpg
pozwala mi odszyfrować plik bez pytania o hasło. Wygląda na to, że hasło jest przechowywane przez pewien czas, czego nie chcę.
--no-symkey-cache
wyłącza buforowanie podczas używania gpg z --symmetric
, nawet jeśli agent jest uruchomiony.
Szyfruj:
openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey
Odszyfruj:
openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey
Aby uzyskać szczegółowe informacje, zobacz openssl(1)
dokumenty.
-k symmetrickey
się -pass stdin
lub-pass 'pass:PASSWORD'
-k symmetrickey
jest to mylące. -k
Opcja służy do podawania hasła, z którego wywodzi OpenSSL klucz symetryczny. Jeśli chcesz określić klucz symetryczny, musisz użyć -K
opcji.
NIE UŻYWAJ DOMYŚLNEJ POCHODZENIA OPENSSL.
Obecnie zaakceptowana odpowiedź korzysta z niej i nie jest już zalecana ani bezpieczna.
Jest bardzo możliwe, aby atakujący po prostu brutalnie nacisnął klawisz.
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1 stosuje funkcję skrótu, którą jest MD2 [6], MD5 [19] lub SHA-1 [18], w celu uzyskania kluczy. Długość pochodnego klucza jest ograniczona długością wyniku funkcji skrótu, która wynosi 16 oktetów dla MD2 i MD5 i 20 oktetów dla SHA-1. PBKDF1 jest zgodny z procesem wyprowadzania klucza w PKCS # 5 v1.5. PBKDF1 jest zalecany tylko ze względu na kompatybilność z istniejącymi aplikacjami, ponieważ klucze, które produkuje, mogą nie być wystarczająco duże dla niektórych aplikacji.
PBKDF2 stosuje funkcję pseudolosową (patrz przykład w dodatku B.1) w celu uzyskania kluczy. Długość klucza pochodnego jest zasadniczo nieograniczona. (Jednak maksymalna efektywna przestrzeń wyszukiwania dla wyprowadzonego klucza może być ograniczona przez strukturę podstawowej funkcji pseudolosowej. Patrz Dodatek B.1 w celu dalszej dyskusji.) PBKDF2 jest zalecany dla nowych aplikacji.
Zrób to:
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
Uwaga : Iteracje w odszyfrowywaniu muszą być takie same jak iteracje w szyfrowaniu.
Iteracje muszą wynosić co najmniej 10000. Oto dobra odpowiedź na temat liczby iteracji: https://security.stackexchange.com/a/3993
Ponadto ... mamy tutaj wystarczającą liczbę osób, które polecają GPG. Przeczytaj to cholerne pytanie.
Aby zaszyfrować:
$ openssl bf < arquivo.txt > arquivo.txt.bf
Aby odszyfrować:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === Blowfish w trybie CBC
Zaktualizuj za pomocą losowo wygenerowanego klucza publicznego.
Encypt:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
Odszyfruj:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
Mam pełny samouczek na ten temat pod adresem http://bigthinkingapplied.com/key-based-encryption-using-openssl/
Zauważ, że interfejs OpenSSL CLI używa słabego niestandardowego algorytmu do konwersji hasła na klucz, a instalacja GPG powoduje dodanie różnych plików do katalogu domowego i uruchomienie procesu w tle agenta gpg. Jeśli chcesz mieć maksymalną przenośność i kontrolę przy użyciu istniejących narzędzi, możesz użyć PHP lub Pythona, aby uzyskać dostęp do interfejsów API niższego poziomu i bezpośrednio przekazać pełny klucz AES i IV.
Przykład wywołania PHP przez 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
To daje:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
Możesz także użyć openssl_pbkdf2
funkcji PHP, aby bezpiecznie przekonwertować hasło na klucz.
Istnieje program open source, który znajduję online, który używa openssl do szyfrowania i deszyfrowania plików. Robi to za pomocą jednego hasła. Wspaniałą rzeczą w tym skrypcie typu open source jest to, że usuwa on oryginalny nieszyfrowany plik, niszcząc go. Ale niebezpieczną rzeczą jest to, że po zniknięciu oryginalnego niezaszyfrowanego pliku musisz upewnić się, że pamiętasz hasło, w przeciwnym razie nie będzie to żaden inny sposób na odszyfrowanie pliku.
Tutaj link znajduje się na github
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
Jak wspomniano w innych odpowiedziach, poprzednie wersje openssl używały funkcji wyprowadzania słabego klucza do uzyskania klucza szyfrowania AES z hasła. Jednak openssl 1.1.1 obsługuje silniejszą funkcję wyprowadzania klucza, w której klucz jest uzyskiwany z hasła przy użyciu pbkdf2
losowo generowanej soli i wielokrotnych iteracji mieszania sha256 (domyślnie 10 000).
Aby zaszyfrować plik:
openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename
Aby odszyfrować plik:
openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
Dodatkowe komentarze do dobrej odpowiedzi mti2935.
Wydaje się, że im wyższa iteracja, tym lepsza ochrona przed brutalną siłą i powinieneś używać wysokiej iteracji, ponieważ możesz sobie pozwolić na wydajność / zasoby.
Na moim starym Intelie i3-7100 szyfrującym dość duży plik 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
Naprawdę nie ma różnicy, chociaż nie sprawdziłem użycia pamięci (?)
Przy dzisiejszych procesorach graficznych i jeszcze szybszych jutrach wydaje mi się, że miliard iteracji brutalnej siły wydaje się możliwy co sekundę.
12 lat temu NVIDIA GeForce 8800 Ultra
można było iterować ponad 200 000 milionów / s iteracji (choć skrót MD5)
PKCS5_PBKDF2_HMAC
. Należy użyćEVP_*
funkcji do szyfrowania i deszyfrowania. Zobacz Symetryczne szyfrowanie i deszyfrowanie EVP na wiki OpenSSL. W rzeczywistości prawdopodobnie powinieneś używać uwierzytelnionego szyfrowania, ponieważ zapewnia ono zarówno poufność, jak i autentyczność. Zobacz: Szyfrowanie i deszyfrowanie uwierzytelnione EVP na wiki OpenSSL.