Bir şifreyi kullanarak bir dosyayı şifrelemek ve şifresini çözmek istiyorum.
Bunu yapmak için OpenSSL'yi nasıl kullanabilirim?
Bir şifreyi kullanarak bir dosyayı şifrelemek ve şifresini çözmek istiyorum.
Bunu yapmak için OpenSSL'yi nasıl kullanabilirim?
Yanıtlar:
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
-md sha256
bu 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
Bunun gpg
yerine 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.
İçin en iyi bilgi kaynağınız openssl enc
muhtemelen şö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.
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.
gpg
şifre sorulmadan bir dosyanın şifresini çözmeme izin veriyor. Parola istemediğim bir süre saklanıyor gibi görünüyor.
--no-symkey-cache
kullanırken --symmetric
aracı çalıştırılsa bile seçeneğin önbelleğe almayı devre dışı bıraktığı görülmektedir .
ş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 .
-k symmetrickey
-pass stdin
-pass 'pass:PASSWORD'
-k symmetrickey
, yanıltıcı not . Bu -k
seçenek, OpenSSL'nin simetrik anahtarı türettiği bir parola belirlemek için kullanılır. Simetrik anahtarı belirtmek istiyorsanız, -K
seçeneği kullanmanız gerekir .
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.
Ş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ığı
Rastgele oluşturulmuş bir ortak anahtar kullanarak güncelleme yapın.
encypt:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
azalmak:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
Bu konuda http://bigthinkingapplied.com/key-based-encryption-using-openssl/ adresinde tam bir eğiticim var.
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_pbkdf2
Bir parolayı güvenli bir şekilde bir anahtara dönüştürmek için PHP'nin işlevini de kullanabilirsiniz .
Ç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
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 pbkdf2
rasgele 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
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 Ultra
200.000 milyon / sn'den fazla yineleme yinelendi (MD5 hashing olsa da)
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 .