मैं एक पासवर्ड का उपयोग करके एक फ़ाइल को क्रिप्ट और डिक्रिप्ट करना चाहता हूं।
मैं ऐसा करने के लिए ओपनएसएसएल का उपयोग कैसे कर सकता हूं?
मैं एक पासवर्ड का उपयोग करके एक फ़ाइल को क्रिप्ट और डिक्रिप्ट करना चाहता हूं।
मैं ऐसा करने के लिए ओपनएसएसएल का उपयोग कैसे कर सकता हूं?
जवाबों:
सुरक्षा चेतावनी : एईएस -256-सीबीसी प्रमाणित एन्क्रिप्शन प्रदान नहीं करता है और पैडिंग ऑरेकल हमलों के लिए असुरक्षित है । आपको उम्र के बजाय कुछ का उपयोग करना चाहिए ।
एन्क्रिप्ट:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
डिक्रिप्ट:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
-md sha256
यदि आप किसी अन्य मशीन पर इस फ़ाइल का उपयोग करने की योजना बनाते हैं, तो आप अपने एनकोड और डीकोड कमांड में जोड़ सकते हैं । आपको ओपनएसएसएल संस्करण की
आप इस उत्तर के अंत में "अतिरिक्त नोट्स" को देखने के gpg
बजाय उपयोग करना चाहते हैं । लेकिन इस सवाल का जवाब देने के लिए :openssl
openssl
एन्क्रिप्ट करने के लिए:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
डिक्रिप्ट करने के लिए:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
नोट: एन्क्रिप्ट या डिक्रिप्ट होने पर आपको पासवर्ड के लिए कहा जाएगा।
आपके लिए जानकारी का सबसे अच्छा स्रोत openssl enc
शायद होगा: https://www.openssl.org/docs/man1.1.1/man1/enc.html
कमांड लाइन:
openssl enc
निम्न रूप लेता है:
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]
आपके प्रश्न के संबंध में सबसे उपयोगी मापदंडों की व्याख्या:
-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 के बारे में पूछा है कि आप इस लेख के आधार पर एन्क्रिप्शन के उद्देश्य से GPG का उपयोग करने पर विचार कर सकते हैं OpenSSL बनाम GPG को ऑफ-साइट बैकअप एन्क्रिप्ट करने के लिए?
निम्न आदेशों का उपयोग करने के लिए GPG का उपयोग करने के लिए:
एन्क्रिप्ट करने के लिए:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
डिक्रिप्ट करने के लिए:
gpg --output un_encrypted.data --decrypt encrypted.data
नोट: एन्क्रिप्ट या डिक्रिप्ट होने पर आपको पासवर्ड के लिए कहा जाएगा।
gpg
पासवर्ड के लिए संकेत दिए बिना मुझे एक फ़ाइल को डिक्रिप्ट करने दे रहा है। ऐसा लगता है कि पासवर्ड कुछ समय के लिए संग्रहीत है, जो मुझे नहीं चाहिए।
--no-symkey-cache
जीपीजी का उपयोग करते समय कैशिंग को निष्क्रिय कर देता है --symmetric
, भले ही एजेंट चल रहा हो।
एन्क्रिप्ट:
openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey
डिक्रिप्ट:
openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey
विवरण के लिए, openssl(1)
डॉक्स देखें ।
-k symmetrickey
के साथ -pass stdin
या-pass 'pass:PASSWORD'
-k symmetrickey
भ्रामक है। -k
विकल्प के लिए एक पासवर्ड, जिसमें से OpenSSL सममित कुंजी निकला है निर्दिष्ट करने के लिए प्रयोग किया जाता है। यदि आप सममित कुंजी निर्दिष्ट करना चाहते हैं, तो आपको -K
विकल्प का उपयोग करना होगा ।
OPENSSL प्रमुख कुंजी वितरण का उपयोग न करें।
वर्तमान में स्वीकृत उत्तर इसका उपयोग करता है और यह अब अनुशंसित और सुरक्षित नहीं है।
यह एक हमलावर के लिए बहुत ही महत्वपूर्ण है कि वह केवल बल को दबाए रखे।
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1 एक हैश फ़ंक्शन लागू करता है, जो MD2 [6], MD5 [19] या SHA-1 [18] होगा, जो कुंजी प्राप्त करने के लिए होगा। व्युत्पन्न कुंजी की लंबाई हैश फ़ंक्शन आउटपुट की लंबाई से बंधी हुई है, जो एमडी 2 और एमडी 5 के लिए 16 ऑक्टेट और एसएचए -1 के लिए 20 ओकटेट है। PBKDF1 PKCS # 5 v1.5 में प्रमुख व्युत्पत्ति प्रक्रिया के साथ संगत है। PBKDF1 को केवल मौजूदा अनुप्रयोगों के साथ संगतता के लिए अनुशंसित किया जाता है क्योंकि यह जिन कुंजियों का उत्पादन करता है वे कुछ अनुप्रयोगों के लिए पर्याप्त बड़े नहीं हो सकते हैं।
PBKDF2 चाबियाँ प्राप्त करने के लिए एक छद्म आयामी फ़ंक्शन (उदाहरण के लिए परिशिष्ट B.1 देखें) पर लागू होता है। व्युत्पन्न कुंजी की लंबाई अनिवार्य रूप से अबाधित है। (हालांकि, व्युत्पन्न कुंजी के लिए अधिकतम प्रभावी खोज स्थान अंतर्निहित छद्म-आयामी सूची की संरचना द्वारा सीमित हो सकता है। आगे की चर्चा के लिए परिशिष्ट B.1 देखें।) नए अनुप्रयोगों के लिए PBKDF2 की सिफारिश की गई है।
यह करो:
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
नोट : डिक्रिप्शन में बदलाव के लिए एन्क्रिप्शन में पुनरावृत्तियों के समान होना चाहिए।
Iterations का न्यूनतम 10000 होना है। यहाँ पुनरावृत्तियों की संख्या पर एक अच्छा उत्तर दिया गया है: https://security.stackexchange.com/a/3993
इसके अलावा ... हम यहाँ पर्याप्त लोगों को GPG की सिफारिश कर रहे हैं। लानत सवाल पढ़ें।
एन्क्रिप्ट करने के लिए:
$ openssl bf < arquivo.txt > arquivo.txt.bf
डिक्रिप्ट करने के लिए:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
सीबीसी मोड में bf === ब्लोफिश
यादृच्छिक जनित सार्वजनिक कुंजी का उपयोग करके अपडेट करें।
Encypt:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
डिक्रिप्ट:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
मेरा इस पर एक पूरा ट्यूटोरियल है http://bigthinkingapplied.com/key-based-enc एन्क्रिप्शन-using-openssl/
ध्यान दें कि ओपनएसएसएल सीएलआई पासफ़्रेज़ को कुंजी में बदलने के लिए एक कमजोर गैर-मानक एल्गोरिथ्म का उपयोग करता है, और आपके घर निर्देशिका में जोड़े गए विभिन्न फाइलों में जीपीजी परिणामों को स्थापित करने और एक जीएसपी-एजेंट पृष्ठभूमि प्रक्रिया चल रही है। यदि आप मौजूदा उपकरणों के साथ अधिकतम पोर्टेबिलिटी और नियंत्रण चाहते हैं, तो आप निचले स्तर के एपीआई तक पहुंचने के लिए PHP और पायथन का उपयोग कर सकते हैं और सीधे पूर्ण एईएस कुंजी और IV में पास कर सकते हैं।
उदाहरण Bash के माध्यम से PHP मंगलाचरण:
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
यह आउटपुट:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
आप openssl_pbkdf2
पासफ़्रेज़ को कुंजी में सुरक्षित रूप से परिवर्तित करने के लिए PHP के फ़ंक्शन का भी उपयोग कर सकते हैं ।
एक खुला स्रोत कार्यक्रम है जो मुझे लगता है कि यह ऑनलाइन एन्क्रिप्ट और डिक्रिप्ट फ़ाइलों का उपयोग करता है। यह एक ही पासवर्ड के साथ ऐसा करता है। इस ओपन सोर्स स्क्रिप्ट के बारे में महान बात यह है कि यह मूल अनएन्क्रिप्टेड फ़ाइल को फ़ाइल से हटाकर हटा देती है। लेकिन मूल रूप से अनएन्क्रिप्टेड फ़ाइल के चले जाने के बारे में खतरनाक बात यह है कि आपको यह सुनिश्चित करना होगा कि आप अपना पासवर्ड याद रखें अन्यथा वे आपकी फ़ाइल को डिक्रिप्ट करने का कोई अन्य तरीका नहीं है।
यहाँ लिंक यह github पर है
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
जैसा कि अन्य उत्तरों में उल्लेख किया गया है, पासवर्ड से AES एन्क्रिप्शन कुंजी प्राप्त करने के लिए खुलने के पिछले संस्करणों ने एक कमजोर कुंजी व्युत्पत्ति फ़ंक्शन का उपयोग किया। हालाँकि, Opensl v1.1.1 एक मजबूत कुंजी व्युत्पत्ति फ़ंक्शन का समर्थन करता है, जहां कुंजी pbkdf2
एक बेतरतीब ढंग से उत्पन्न नमक के साथ पासवर्ड से ली गई है , और sha256 हैशिंग (डिफ़ॉल्ट रूप से 10,000) के कई पुनरावृत्तियों।
किसी फ़ाइल को एन्क्रिप्ट करने के लिए:
openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename
फ़ाइल को डिक्रिप्ट करने के लिए:
openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
अतिरिक्त टिप्पणियाँ mti2935 अच्छे उत्तर के लिए।
ऐसा लगता है कि उच्च बल ब्रूट बल के खिलाफ बेहतर सुरक्षा है, और आपको एक उच्च पुनरावृत्ति का उपयोग करना चाहिए क्योंकि आप प्रदर्शन / संसाधन को समझ सकते हैं।
मेरे पुराने Intel i3-7100 पर कोई बड़ी फ़ाइल 1.5GB एन्क्रिप्ट करना:
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
वास्तव में कोई अंतर नहीं है, हालांकि स्मृति उपयोग की जांच नहीं की (?)
आज के GPU के साथ, और इससे भी तेज़ कल, मुझे लगता है कि हर सेकंड में बिलियन ब्रूट-फ़ोर्स पुनरावृत्ति संभव है।
12 साल पहले NVIDIA GeForce 8800 Ultra
200.000 मिलियन / सेकंड पुनरावृत्तियों पर पुनरावृति हो सकती थी (MD5 हैशिंग हालांकि)
PKCS5_PBKDF2_HMAC
। आपकोEVP_*
फ़ंक्शन को एन्क्रिप्ट और डिक्रिप्ट करने के लिए उपयोग करना चाहिए । ओपनएसएसएल विकी पर ईवीपी सिमेट्रिक एन्क्रिप्शन और डिक्रिप्शन देखें । वास्तव में, आपको संभवतः प्रमाणित एन्क्रिप्शन का उपयोग करना चाहिए क्योंकि यह गोपनीयता और प्रामाणिकता दोनों प्रदान करता है। ओपनएसएसएल विकी पर ईवीपी प्रमाणित एन्क्रिप्शन और डिक्रिप्शन देखें ।