Dosyaları şifrelemek / şifrelerini çözmek için OpenSSL nasıl kullanılır?


205

Bir şifreyi kullanarak bir dosyayı şifrelemek ve şifresini çözmek istiyorum.

Bunu yapmak için OpenSSL'yi nasıl kullanabilirim?


2
Kullanarak şifreden bir Anahtar ve IV türetmelisiniz PKCS5_PBKDF2_HMAC. EVP_*Şifrelemek ve şifresini çözmek için işlevleri kullanmalısınız . OpenSSL wiki'sinde EVP Simetrik Şifreleme ve Şifre Çözme konusuna bakın . Aslında, hem gizlilik hem de özgünlük sağladığı için muhtemelen kimliği doğrulanmış şifreleme kullanmalısınız . Bkz . OpenSSL wiki'sinde EVP Kimlik Doğrulamalı Şifreleme ve Şifre Çözme .
jww

3
Sorunuzdan neden OpenSSL'yi istediğinizi anlamayın. Aşağıdaki yorum GPG'nin daha iyi olduğunu göstermektedir - güvenlik nedeniyle de. stackoverflow.com/a/31552829/952234 Ben oy veriyorum.
Yaroslav Nikitenko

Yanıtlar:


261

Güvenlik Uyarısı : AES-256-CBC kimliği doğrulanmış şifreleme sağlamaz ve kehanet saldırılarına karşı savunmasızdır . Bunun yerine yaş gibi bir şey kullanmalısınız.

şifrele:

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

azalmak:

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

Çeşitli bayraklar hakkında daha fazla bilgi


18
OP'nin kullanım durumuna bağlı olarak cevap muhtemelen uygun değildir (bu yazıdan itibaren). Spesifik olarak "-a" parametreleri muhtemelen uygun değildir ve cevap kullanımını açıklamamaktadır. "-a" tipik olarak şifrelenmiş çıktı ASCII / metin biçiminde iletilecekse ve ikili biçime kıyasla çıktı boyutunu arttırma etkisine sahip olduğunda kullanılır. Orijinal poster çıktı biçimini belirtmez ve bu yüzden en azından bunun belirtilmesi gerektiğini hissediyorum. Bu görev için neden openssl yerine neden gpg kullanmanız gerektiğine ilişkin bir not içeren bir cevaba bakınız: stackoverflow.com/a/31552829/952234 .
moo

7
Anahtar türetme olmadığından yukarıdaki komutu kullanmayın. Daha fazlasını buradan oku: openssl zayıf anahtar türevi
jonasl

Ayrıca bir anahtar belirtmeli veya nereden geldiğini belirtmelidir. Güçlendirildi mi?
00'da ayarlanabilir

2
@jonasl, son man sayfasına göre şunları söylüyor: “Varsayılan özet, openssl 1.1.0'da MD5'ten SHA256 olarak değiştirildi.” Kaynak: github.com/openssl/openssl/blob/master/doc/man1/enc.pod
Kebman

2
@Kebman'ın açıklamasına ekleyerek, -md sha256bu dosyayı başka bir makinede kullanmayı planlıyorsanız kodlama ve kod çözme komutunuza ekleyebilirsiniz . Bu, OpenSSL sürüm uyumsuzluklarına / farklılıklarına karşı sizi kapsamalıdır
dev-rowbot

162

Kısa cevap:

Bunun gpgyerine kullanmak isteyebilirsiniz , bu cevabın sonunda "Ek Notlar" aopenssl bakınız . Ancak soruyu cevaplamak için :openssl

Şifrelemek için:

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

Şifresini çözmek için:

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

Not: Şifreleme veya şifresini çözme sırasında sizden şifre istenir.


Uzun cevap:

İçin en iyi bilgi kaynağınız openssl encmuhtemelen şöyle olacaktır: https://www.openssl.org/docs/man1.1.1/man1/enc.html

Komut satırı: openssl enc aşağıdaki formu alır:

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]

Sorunuzla ilgili en yararlı parametrelerin açıklaması:

-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.

Ek Notlar:

OpenSSL hakkında özellikle sormuş olsanız da, bu makaleye dayalı şifreleme amacıyla GPG kullanmayı düşünebilirsiniz, ancak site dışı yedeklemeleri şifrelemek için OpenSSL vs GPG?

Aynı işlemi yapmak için GPG kullanmak için aşağıdaki komutları kullanırsınız:

Şifrelemek için:

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

Şifresini çözmek için:

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

Not: Şifreleme veya şifresini çözme sırasında sizden şifre istenir.


8
OpenSSL yerine GPG'yi tercih etme hakkında harika bir yorum. OpenSSL'nin anahtar için böyle zayıf bir şifre türetilmiş hash kullanması inanılmaz buluyorum!
Mark

2
"-Md md5" seçeneğini, -md seçeneği belirtilmeden eski openssl'de şifrelenmiş dosyalarla uyumluluk için kullandığınızdan emin olun, aksi takdirde dosyaların daha yeni sistemlerde şifresini çözmeyeceğini göreceksiniz
Sam Liddicott

1
Varsayılan değerler openssl sürümleri arasında değişir. 1.0.x, -md seçeneği için varsayılan md5 kullanır. Sürüm 1.1.x sha256 kullanır. Şifresini çözüp ": dijital zarf yordamları: EVP_DecryptFinal_ex: hatalı şifre çözme" hatası alırsanız. "-md md5" veya "-md sha256" belirtmeyi deneyin.
txyoji

1
"Şifrede veya şifresini çözerken sizden şifre istenecektir." gpgşifre sorulmadan bir dosyanın şifresini çözmeme izin veriyor. Parola istemediğim bir süre saklanıyor gibi görünüyor.
user76284

1
@moo Ayrıca, gpg'yi --no-symkey-cachekullanırken --symmetricaracı çalıştırılsa bile seçeneğin önbelleğe almayı devre dışı bıraktığı görülmektedir .
user76284

32

şifrele:

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

azalmak:

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

Ayrıntılar için openssl(1)dokümanlara bakın .


11
Düz metin parola kullanmak için veya-k symmetrickey-pass stdin-pass 'pass:PASSWORD'
Zenexer

3
Anahtar türetme olmadığından yukarıdaki komutu kullanmayın. Daha fazlasını buradan oku: openssl zayıf anahtar türevi
jonasl

4
@ Jonasl'in yorumuyla ilgili -k symmetrickey, yanıltıcı not . Bu -kseçenek, OpenSSL'nin simetrik anahtarı türettiği bir parola belirlemek için kullanılır. Simetrik anahtarı belirtmek istiyorsanız, -Kseçeneği kullanmanız gerekir .
user1071847

13

AÇIK VARSAYILAN ANAHTAR TÜREV KULLANMAYIN.

Şu anda kabul edilen cevap bunu kullanıyor ve artık tavsiye edilmiyor ve güvenli değil.

Bir saldırganın anahtarı zorla kaba kuvvetle zorlaması çok mümkündür.

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

PBKDF1, anahtarları türetmek için MD2 [6], MD5 [19] veya SHA-1 [18] olacak bir karma fonksiyonu uygular. Türetilen anahtarın uzunluğu, MD2 ve MD5 için 16 oktet ve SHA-1 için 20 oktet olan karma fonksiyon çıktısının uzunluğu ile sınırlıdır. PBKDF1, PKCS # 5 v1.5'teki anahtar türetme işlemiyle uyumludur. PBKDF1 yalnızca mevcut uygulamalarla uyumluluk için önerilir, çünkü ürettiği tuşlar bazı uygulamalar için yeterince büyük olmayabilir.

PBKDF2, anahtarları türetmek için bir takma ad işlevi kullanır (örnek için Ek B.1'e bakın). Türetilen anahtarın uzunluğu esasen sınırsızdır. (Bununla birlikte, türetilmiş anahtar için maksimum etkili arama alanı, altta yatan sahte işlev işlevinin yapısı ile sınırlı olabilir. Daha fazla tartışma için Ek B.1'e bakın.) Yeni uygulamalar için PBKDF2 önerilir.

Bunu yap:

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

Not : Şifre çözmedeki tekrarlamalar, şifreleme yinelemeleriyle aynı olmalıdır.

Yinelemeler en az 10000 olmalıdır. İşte yineleme sayısı için iyi bir cevap: https://security.stackexchange.com/a/3993

Ayrıca ... burada GPG öneren yeterli sayıda insan var. Lanet soruyu okuyun.


4

Şifrelemek için:

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

Şifresini çözmek için:

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

bf === CBC modunda balon balığı



3

OpenSSL CLI'nin parolayı bir anahtara dönüştürmek için zayıf, standart olmayan bir algoritma kullandığını ve GPG'yi yüklediğinizde ana dizininize eklenen çeşitli dosyalara ve çalışan bir gpg aracısı arka plan işlemine dikkat edin. Mevcut araçlarla maksimum taşınabilirlik ve kontrol istiyorsanız, alt düzey API'lere erişmek ve doğrudan tam bir AES Anahtarı ve IV'ü geçmek için PHP veya Python kullanabilirsiniz.

Bash üzerinden PHP çağırma örneği:

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

Bu çıktılar:

$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456

openssl_pbkdf2Bir parolayı güvenli bir şekilde bir anahtara dönüştürmek için PHP'nin işlevini de kullanabilirsiniz .


Openssl CLI artık kullanıcıları şifre karma işlemi için PBKDF2 kullanmaları gerektiği konusunda uyarıyor ve uyarıyor. Ancak varsayılan yineleme sayısı çok düşüktür ve çok daha büyük olması gerekir.
Anthony

2

Çevrimiçi bulduğum açık kaynaklı bir program var, dosyaları şifrelemek ve şifresini çözmek için openssl kullanıyor. Bunu tek bir şifre ile yapar. Bu açık kaynak kod ile ilgili en iyi şey, dosyayı parçalayarak orijinal şifrelenmemiş dosyayı silmesidir. Ancak tehlikeli olan şey orijinal şifrelenmemiş dosya gittiğinde, şifrenizi hatırladığınızdan emin olmanız gerekir, aksi takdirde dosyanızın şifresini çözmenin başka bir yolu yoktur.

İşte bağlantı github üzerinde

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


Dosya şifreleme için openssl kullanıldığında işler değişti, şifrelenmiş dosyaların şifresini çözebilmeniz için hatırlanması gereken çok daha fazla seçenek var. Bunun bir çözümü "uzaklaştırma" antofthy.gitlab.io/software/#keepout
anthony

2

Diğer yanıtlarda belirtildiği gibi, openssl'nin önceki sürümleri, paroladan bir AES şifreleme anahtarı türetmek için zayıf bir anahtar türetme işlevi kullandı. Bununla birlikte, openssl v1.1.1, anahtarın pbkdf2rasgele oluşturulmuş bir tuz kullanılarak şifreden türetildiği ve sha256 karma (varsayılan olarak 10.000) çoklu yinelemeleriyle daha güçlü bir anahtar türetme işlevini destekler .

Bir dosyayı şifrelemek için:

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

Bir dosyanın şifresini çözmek için:

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

Bu seçenekler değişmeye devam ederken, her bir openssl şifreli dosyayı oluştururken hangi seçeneklerin kullanıldığının kaydını tutmanız gerektiği anlamına gelir. Özellikle yineleme sayısı zamanla arttığından! Bir çözüm için openssl enc etrafında nispeten basit sarıcı olarak bakın ... "keepout" antofthy.gitlab.io/software/#keepout Bu daha fazla openssl içerecek şekilde genişletilebilir zaman geçiyor.
Anthony

@anthony yararlı bir projeye benziyor. Ayrıca bkz. Github.com/meixler/web-browser-based-file-encryption-decryption
mti2935

0

Mti2935 iyi cevap için ek yorumlar.

Görünüşe göre daha yüksek yineleme kaba kuvvete karşı daha iyi koruma sağlar ve performansı / kaynağı akıllıca karşılayabileceğiniz için yüksek bir yineleme kullanmalısınız.

Benim eski Intel i3-7100 oldukça büyük bir dosya 1.5GB şifreleme:

 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

Gerçekten bir fark yok, yine de bellek kullanımını kontrol etmedi (?)

Bugünün GPU'ları ve hatta daha hızlı yarınlarla, sanırım milyar kaba kuvvet yinelemesi her saniye mümkün görünüyor.

12 yıl önce NVIDIA GeForce 8800 Ultra200.000 milyon / sn'den fazla yineleme yinelendi (MD5 hashing olsa da)

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.