बनाएँ पर tar.gz फ़ाइल एन्क्रिप्ट करें


33

मेरे पास एक स्क्रिप्ट है जो कई निर्देशिकाओं का एक रात का बैकअप बनाती है।

इसका उपयोग करके बनाया गया है tar -czf, और गंतव्य tar.gz फ़ाइल पथ एक माउंटेड नेटवर्क निर्देशिका पर है। परिणामस्वरूप फ़ाइल 1.2Gb बड़ी है।

नेटवर्क की गति काफी तेज है (नेटवर्क ड्राइव से लोकल में कॉपी करना ~ 28MB / sec पर होता है)।

अब मैं नेटवर्क ड्राइव पर स्थानांतरित करने से पहले tar.gz फ़ाइल को एन्क्रिप्ट करने के लिए सार्वजनिक-कुंजी एन्क्रिप्शन का उपयोग करना चाहता हूं, और यह जानना चाहूंगा कि ऐसा करने का सबसे अच्छा तरीका क्या है।

क्या मुझे फ़ाइल को पहले स्थानीय रूप से बनाना चाहिए, उसे एन्क्रिप्ट करना चाहिए और फिर कॉपी करना चाहिए? या एक एन्क्रिप्शन प्रक्रिया के माध्यम से टार आउटपुट को "स्ट्रीम" करने का एक तरीका है, और सीधे नेटवर्क ड्राइव पर परिणाम लिखते हैं?

जवाबों:


34

your_dirएक एन्क्रिप्टेड संग्रह your_archive.tgz.gpg(सममित एन्क्रिप्शन) में पैक करें :

tar -cz your_dir | gpg -c -o your_archive.tgz.gpg

इसे अनपैक करें:

gpg -d your_archive.tgz.gpg | tar xz

सममित एन्क्रिप्शन के बजाय असममित का उपयोग करने के लिए GPG के डॉक्स देखें।


2
GPG का उपयोग करने से लगता है कि उपयोगकर्ता होम होल्डर में कुंजियाँ बनाता है, और पासफ़्रेज़ के लिए संकेत देता है। मूल रूप से, यह प्रक्रिया मेरे स्वाद के लिए बहुत ही अपारदर्शी लगती है ...
जोएल एल

क्या इसके बजाय tar xzदूसरे सेट का आदेश होना tar -xzचाहिए?
केनी एविट

1
@KennyEvitt: आप के साथ या बिना उपयोग कर सकते हैं-
फ्लोरियन Diesch

यह gpg-zip के साथ एन्क्रिप्टेड फ़ाइलों के लिए भी काम करता है!
ट्रेफेक्स

2
gpg पहले से ही फ़ाइलों को संपीड़ित करता है, ऐसा मत सोचो कि zविकल्प बहुत ज्यादा जोड़ता है
फेकली

12

निम्न प्रक्रिया स्थानीय डिस्क पर फ़ाइल को पहले एन्क्रिप्ट करती है, और फिर नेटवर्क पर भेजी जा सकती है (या फिर आवश्यक रूप से संग्रहीत)


सबसे पहले, सार्वजनिक और निजी कुंजी उत्पन्न करें (केवल एक बार ही):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout

फिर, प्रत्येक बैकअप पर:

  1. लंबे यादृच्छिक पासफ़्रेज़ जेनरेट करें, फ़ाइल में सहेजें

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. Passphase के साथ एन्क्रिप्ट फ़ाइल

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. सार्वजनिक कुंजी के साथ पासफ़्रेज़ को एन्क्रिप्ट करें

    • openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt

इसके बाद एन्क्रिप्टेड.डैट और एनकाउंटर को सेव करें। जहां वांछित हो।


डिक्रिप्ट करने के लिए:

  1. निजी कुंजी के साथ एन्क्रिप्टेड पासफ़्रेज़ को डिक्रिप्ट करें

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. डिक्रिप्ट फ़ाइल

    • openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE

यह फ्लोरियन के एवेज़र की तुलना में बहुत लंबा है, लेकिन मैंने इसका इस्तेमाल करने का फैसला किया है, इसलिए मैं इस प्रक्रिया को बेहतर ढंग से समझ सकता हूं, और सर्वर-निर्भर जीपीजी कॉन्फ़िगरेशन चर आदि पर निर्भर नहीं हूं। मुझे कोई उपयोगी जीपीजी प्रलेखन भी नहीं मिला।


1
रैंडम पासफ्रेज भी आसानी से बनाया जा सकता है जैसे कि ओपनसेल के साथ openssl rand 32 -out key.txt
वोल्फगैंग

@ वुल्फगैंग - मैं वास्तव में एक पायथन स्क्रिप्ट (जो बैकअप प्रक्रिया को चलाता है) से पासफेज जेनरेट कर रहा हूं, लेकिन टिप के लिए धन्यवाद!
जोएल एल

2
FYI करें: आपको खुलने वाली फ़ाइलों को एन्क्रिप्ट क्यों नहीं करना चाहिए: stackoverflow.com/questions/28247821/…
डैनियल हिलर

वास्तव में यह फ़ाइल 'enc.key.txt' क्या है? मैं एक ऐसी प्रक्रिया को देख रहा हूं जो मेरी सर्वर फ़ाइलों का बैकअप लेती है और केवल सर्वर पर संग्रहीत कुंजी का उपयोग करके डिक्रिप्ट करने में सक्षम होना चाहती है।
एलेक्स स्टीवर्ट

6

मैं असममित कुंजी एन्क्रिप्शन के साथ ऐसा करता हूं। इसका मतलब है कि मेरे पास एक सार्वजनिक कुंजी है (कि मैं किसी के साथ साझा कर सकता हूं जो मुझे एन्क्रिप्टेड पैकेज भेजना चाहता है) जो मुझे पैकेज को एन्क्रिप्ट करने की अनुमति देता है। मेरे पास एक निजी कुंजी भी है (जो मैं साझा नहीं करता हूं) जो मुझे पैकेज को डिक्रिप्ट करने की अनुमति देता है।

मेरे आदेश वर्तमान कार्य निर्देशिका को एन्क्रिप्ट करने के लिए: -ई एन्क्रिप्ट करने के लिए, -r एक "प्राप्तकर्ता" या उपयोग करने के लिए कुंजी निर्दिष्ट करने के लिए, आउटपुट फ़ाइल निर्दिष्ट करने के लिए -o।

$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg

और वर्तमान कार्य निर्देशिका को डिक्रिप्ट करने के लिए:

$ gpg -d backup.tgz.gpg | tar -xz

या बाद में अनपैकिंग के लिए एक मानक tgz फ़ाइल को डिक्रिप्ट करना:

$ gpg -o backup.tgz -d backup.tgz.gpg

बेशक, यह केवल तभी काम करता है जब मैंने पहले से ही एक सार्वजनिक-निजी कुंजी जोड़ी उत्पन्न की है और इसे gpg के साथ स्थापित किया है। मेरे मामले में, मैंने https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu पर डिजिटल महासागर के गाइड का उपयोग करके ऐसा किया है। -12-04-वीपीएस । एन्क्रिप्शन कमांड में ABCD1234 मेरे सिस्टम पर स्थापित सार्वजनिक कुंजी में से एक को संदर्भित करता है। यह मार्गदर्शिका यह भी बताती है कि अपनी सार्वजनिक कुंजी कैसे साझा करें और एन्क्रिप्टेड फाइलें भेजने और प्राप्त करने के लिए दूसरों की सार्वजनिक कुंजियों को स्थापित करें।


0

GnuPG वह है जिसे मैंने इस प्रक्रिया के लिए उपयोग करने के लिए चुना है और क्योंकि आपने कहा है कि डिक्रिप्शन कदम जहां अपारदर्शी (मैं इस उपयोग उदाहरण में सहमत हूं) मैंने समस्या के उस तरफ भी काम किया है। प्रोजेक्ट्स ट्रैविस-सीआई बिल्ड लॉग की जांच करें कि वर्तमान में डिज़ाइन किए गए फीचर्स और ट्रैविस.आईएमएल फाइल के साथ-साथ लॉग इन आउटपुट के साथ निम्नलिखित के लिए क्या काम करता है । मूल रूप से आपको इस परियोजना से तीन लिपियों की आवश्यकता होगी; कीजेन स्क्रिप्ट, डिक्रिप्शन हेल्पर स्क्रिप्ट और पाइप श्रोता स्क्रिप्ट का नाम। कीजन स्क्रिप्ट और डिक्रिप्शन हेल्पर स्क्रिप्ट का उपयोग उस डिवाइस पर किया जाना चाहिए जो डिक्रिप्शन को प्रीफ़ॉर्म करेगा और नामांकित पाइप श्रोता लिपि डिवाइस पर एन्क्रिप्शन को प्रीफॉर्म करने पर होना चाहिए।

एन्क्रिप्टेड नाम पाइप श्रोता स्क्रिप्ट एक बार सेटअप के स्ट्रिंग्स, फ़ाइल पथ या निर्देशिका पथ को स्वीकार करता है और एक पूर्वानुमानित फैशन में एन्क्रिप्टेड परिणामों को आउटपुट करता है।

नीचे उदाहरण कमांड हैं जिन्हें एन्क्रिप्शन के लिए और निर्देशिका संपीड़न + एन्क्रिप्शन के लिए आपकी रात की बैकअप स्क्रिप्ट में रखा जा सकता है

echo "some messages text" > /path/to/named.pipe
## Message text is ASCII armor encrypted and appended to specified file when script was stated
echo "${HOME}/Documents" > /path/to/named.pipe
## Directories are compressed with tar and encrypted with output to time stamped file in bulk output directory
echo "${HOME}/.bash_history"  > /path/to/named.pipe

डिक्रिप्शन के लिए, आप यह देखना चाहेंगे कि बिल्ड स्क्रिप्ट .travis-ci/script_decrypt.shऔर .travis-ci/test_search_script_decrypt.shएन्क्रिप्ट किए गए डेटा के एपेंड किए गए तार कैसे पुनर्प्राप्त किए जाते हैं और बल्क फाइल्स / डायरेक्टरी को कैसे पुनर्स्थापित किया जाता है।

बेशक इस प्रायोगिक सामान के साथ प्राथमिक कुंजी पैरिस का उपयोग न करना सबसे अच्छा है (किना लिपि क्यों लिखी गई है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.