2012-01-16 29 views
8

मैं बैकअप फ़ाइलों को "क्लाउड" पर एक ऐप के साथ खेल रहा हूं :) और मैं उन्हें स्टोर करने से पहले फ़ाइलों को एन्क्रिप्ट करना चाहता हूं। उस भाग में मैंने कवर किया है, लेकिन चूंकि यह ऐप बदले गए फ़ाइलों को बदलने और अपलोड करने के लिए फ़ोल्डर की निगरानी करेगा, मुझे उस कुंजी को स्टोर करने की आवश्यकता है जिसका उपयोग मैं फ़ाइलों को एन्क्रिप्ट करने के लिए करता हूं। विचार यह है कि उपयोगकर्ता पासवर्ड प्रदान करता है और एक कुंजी उत्पन्न होती है।फ़ाइलों को एन्क्रिप्ट करने के लिए उपयोग की जाने वाली कुंजी को संग्रहीत करने के लिए

फिलहाल मैं एन्क्रिप्शन करने के लिए .NET Framework का उपयोग कर रहा हूं। मैं कुंजी प्राप्त करने के लिए एन्क्रिप्ट/डिक्रिप्ट और पासवर्डडिएरबाइट क्लास के लिए रिजेंडेल प्रबंधित वर्ग का उपयोग कर रहा हूं।

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

+0

यह मदद कर सकता है http://stackoverflow.com/questions/723653/storing-encryption-keys-best-practices –

उत्तर

12

मैं आपकी फ़ाइलों के एन्क्रिप्शन के लिए असममित एन्क्रिप्शन का उपयोग करने से बचने की सलाह दूंगा। असममित एन्क्रिप्शन समान शक्ति के सममित एन्क्रिप्शन एल्गोरिदम की तुलना में काफी महंगा (संगणकीय रूप से) है। बड़ी फ़ाइलों को एन्क्रिप्ट करने के लिए मैं किसी भी दिन आरएसए पर एईएस की सिफारिश करता हूं।

आपके प्रश्न के अनुसार - डेटा प्रोटेक्शन एपीआई (डीपीएपीआई) गौरव का उल्लेख विंडोज पर आपका सबसे अच्छा शर्त है। How to: Use Data Protection

डीपीएपीआई ProtectedMemory और ProtectedData प्रदान करता है। पूर्व आपको स्मृति में रहस्यों की रक्षा करने की इजाजत देता है, उत्तरार्द्ध डिस्क पर बने रहस्यों की सुरक्षा प्रदान करता है। एपीआई आपके लिए एन्क्रिप्शन & डिक्रिप्शन का ख्याल रखता है, और (निर्दिष्ट स्कोप के आधार पर) आपके उपयोगकर्ताओं को अन्य उपयोगकर्ताओं या अन्य मशीनों द्वारा एक्सेस/डिक्रिप्शन से सुरक्षित रखेगा।

अपने परिदृश्य में डीपीएपीआई का उपयोग करने के लिए, मैं उपयोगकर्ताओं को पासवर्ड लेने की सलाह दूंगा, एक सममित एन्क्रिप्शन कुंजी (उदा। PasswordDeriveBytes) उत्पन्न करना, डीपीएपीआई का उपयोग करके और वर्तमान उपयोगकर्ता तक पहुंच प्रतिबंधित करना।

आपका एप्लिकेशन सभी अपलोड एन्क्रिप्ट करने के लिए उस कुंजी का उपयोग कर सकता है। आपका एप्लिकेशन उपयोगकर्ता को फिर से संकेत दिए बिना कुंजी प्राप्त कर सकता है, और कुंजी को उपयोगकर्ता द्वारा एक नई प्रणाली पर पुन: उत्पन्न किया जा सकता है।

एक नकारात्मक पक्ष यह होगा कि एक ही उपयोगकर्ता द्वारा निष्पादित एक दुर्भावनापूर्ण एप्लिकेशन संभावित रूप से गुप्त कुंजी प्राप्त कर सकता है। इस परिदृश्य के खिलाफ सुरक्षा के लिए अतिरिक्त एन्ट्रॉपी (प्रभावी रूप से एक नमक) Protect & Unprotect में प्रदान किया जाना चाहिए। हालांकि इसे लागू करने से आपके उद्देश्य से भटक जाएगा - क्योंकि अब आपको उस उपयोगकर्ता के लिए संकेत देने की आवश्यकता होगी जो पासवर्ड की तरह बहुत भयानक लगता है।

इसके अलावा: दिलचस्प पढ़ने:

तुम भी Backblaze से इस पोस्ट एक दिलचस्प पढ़ने मिल सकता है। हालांकि वे कैसे वे अपने परिदृश्य का समर्थन की व्याख्या नहीं करते (एन्क्रिप्टेड अपलोड कि बादल प्रदाता समझने नहीं कर सकते हैं - केवल यह है कि वे इस तरह के एक सेवा प्रदान करते हैं): http://blog.backblaze.com/2008/11/12/how-to-make-strong-encryption-easy-to-use/

अस्वीकरण: मैं एक संतुष्ट Backblaze ग्राहक हूँ, लेकिन कोई दूसरा रास्ता नहीं में हूँ उनकी सेवा से संबद्ध।

पीएस: स्वीकार्य उत्तरों को चिह्नित करने के लिए समय निकालें। समुदाय आपको इनाम देगा।

+0

आप पूंछ, बहुत विस्तृत जवाब धन्यवाद। कुछ परीक्षणों के बाद, ऐसा लगता है कि मुझे वही करना है :) –

+1

और इस उत्तर के लिए एक अच्छी युक्ति यह है कि यदि उपयोगकर्ता उपयोगकर्ता अपनी खिड़कियां बदलता है तो संरक्षित डेटा (यहां कुंजी) उपयोगी नहीं होगा, इसलिए यदि डेटा है बहुत महत्वपूर्ण और खिड़कियां बदल दी जा सकती हैं, सामान्य एन्क्रिप्शन विधियों का उपयोग करके कुंजी (ओं) को ऐसी स्थितियों के लिए डिक्रिप्ट करने में सक्षम होने के लिए बेहतर है (उदाहरण के लिए आप कुंजी एन्क/डीसी एल्गोरिदम के लिए निरंतर पासवर्ड प्रदान कर सकते हैं)। –

4

मैं आपको here वर्णित एसिमेट्रिक एन्क्रिप्शन का उपयोग करने का सुझाव देता हूं। इससे आपको प्रत्येक फ़ाइल को अलग-अलग सममित कुंजी से एन्क्रिप्ट किया जाएगा, भले ही सुरक्षा (और बैकअप) की रक्षा करने के लिए केवल एक ही निजी कुंजी हो।

आप Windows (वास्तव में CryptoAPI) रक्षाRSACryptoServiceProvider के साथ एक CspParameters (और सही झंडे) का उपयोग कुंजी कर सकते हैं। अपने झंडे के आधार पर आपके पास उपयोगकर्ता पर लॉग इन करने के लिए कुंजी उपलब्ध होगी (इसलिए यह उपयोगकर्ता लॉगिन पासवर्ड के रूप में सुरक्षित के रूप में प्राप्त हो जाता है)।

1

DPAPI इस चुनौती को हल करने के लिए डिज़ाइन किया गया था।

0

मैं डीपीएपीआई सुझाव के साथ सहमत हूं। संरक्षित डेटा वर्ग का उपयोग करने का तरीका दिखाने के लिए यहां कुछ कोड दिया गया है। यह आपके सटीक परिदृश्य के लिए बिल्कुल जर्मन नहीं है, लेकिन आप extrapolate कर सकते हैं।

byte[] GetEncryptionKey() 
{ 
    var path = Path.Combine(
     Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 
     AppDomain.CurrentDomain.FriendlyName, 
     "nothing interesting... move along", 
     "top secret encryption key"); 

    Debug.WriteLine("Encryption Key File: " + path); 

    var file = new FileInfo(path); 
    if (!file.Directory.Exists) 
     file.Directory.Create(); 

    // determine if current user of machine 
    // or any user of machine can decrypt the key 
    var scope = DataProtectionScope.CurrentUser; 

    // make it a bit tougher to decrypt 
    var entropy = Encoding.UTF8.GetBytes("correct horse battery staple :)"); 

    if (file.Exists) 
    { 
     return ProtectedData.Unprotect(
      File.ReadAllBytes(path), entropy, scope);  
    } 

    // generate key 
    byte[] key; 
    using(var rng = RNGCryptoServiceProvider.Create()) 
     key = rng.GetBytes(1024); 

    // encrypt the key 
    var encrypted = ProtectedData.Protect(key, entropy, scope); 

    // save for later use 
    File.WriteAllBytes(path, encrypted); 

    return key; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे