2012-09-30 19 views
72

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

मैं एक डेटाबेस का उपयोग नहीं करना चाहते हैं, तो मैं संसाधन फाइलों के साथ कुछ बातें की कोशिश की।
लेकिन चूंकि मैं इसके साथ नया हूं, मैं पूरी तरह से सुनिश्चित नहीं हूं कि मैं क्या कर रहा हूं और जहां मुझे समाधान की तलाश करनी चाहिए।

+4

सबसे पहले, पासवर्ड को सुरक्षित न करें। इसे (शायद नमक मूल्य के साथ) हैश करें, और इसके बजाय इसे सेव करें। – carlosfigueira

+0

"उपयोगकर्ता" आपका मतलब नियमित विंडोज उपयोगकर्ता या कुछ और है? (मुझे लगता है कि आप का मतलब है कि आप में से कुछ "उपयोगकर्ता" हैं क्योंकि नियमित विंडोज उपयोगकर्ता पहले से ही एक दूसरे के डेटा को नहीं देख सकता है ...) –

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

उत्तर

120

यदि आप दर्ज उपयोगकर्ता नाम और पासवर्ड को सत्यापित/सत्यापित करने जा रहे हैं, तो Rfc2898DerivedBytes कक्षा (जिसे पासवर्ड आधारित कुंजी व्युत्पन्न फ़ंक्शन 2 या पीबीकेडीएफ 2 भी कहा जाता है) का उपयोग करें। यह ट्रिपल डीईएस या एईएस जैसे एन्क्रिप्शन का उपयोग करने से अधिक सुरक्षित है क्योंकि RFC2898DerivedBytes के पासवर्ड से पासवर्ड पर जाने का कोई व्यावहारिक तरीका नहीं है। आप केवल परिणाम से पासवर्ड से जा सकते हैं। WinRT/Metro के लिए .NET या String encrypt/decrypt with password c# Metro Style के लिए उदाहरण और चर्चा के लिए Is it ok to use SHA1 hash of password as a salt when deriving encryption key and IV from password string? देखें।

यदि आप पुन: उपयोग के लिए पासवर्ड संग्रहीत कर रहे हैं, जैसे इसे किसी तृतीय पक्ष को आपूर्ति करना, Windows Data Protection API (DPAPI) का उपयोग करें। यह सूचना को एन्क्रिप्ट और डिक्रिप्ट करने के लिए ऑपरेटिंग सिस्टम जेनरेट और संरक्षित कुंजी और Triple DES एन्क्रिप्शन एल्गोरिदम का उपयोग करता है। इसका मतलब यह है आपके आवेदन पैदा करने और जब क्रिप्टोग्राफी का उपयोग कर एन्क्रिप्शन कुंजी, एक प्रमुख चिंता का विषय की सुरक्षा के बारे में चिंता करने की जरूरत नहीं है।

सी # में, System.Security.Cryptography.ProtectedData वर्ग का उपयोग करें। उदाहरण के लिए, डेटा का एक टुकड़ा एन्क्रिप्ट करने के लिए, ProtectedData.Protect() का उपयोग करें:

// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes(). 
byte[] plaintext; 

// Generate additional entropy (will be used as the Initialization vector) 
byte[] entropy = new byte[20]; 
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) 
{ 
    rng.GetBytes(entropy); 
} 

byte[] ciphertext = ProtectedData.Protect(plaintext, entropy, 
    DataProtectionScope.CurrentUser); 

स्टोर एन्ट्रापी और इस तरह तो केवल वर्तमान उपयोगकर्ता यह पढ़ सकते हैं सेट अनुमतियों के साथ एक फ़ाइल या रजिस्ट्री कुंजी में के रूप में सुरक्षित रूप से सिफर,। मूल डेटा तक पहुँच प्राप्त करने के लिए, ProtectedData.Unprotect() का उपयोग करें:

byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy, 
    DataProtectionScope.CurrentUser); 

नोट अतिरिक्त सुरक्षा कारणों से देखते हैं कि। उदाहरण के लिए, एक string के रूप में पासवर्ड जैसी रहस्य भंडारण से बचें।स्ट्रिंग्स अपरिवर्तनीय हैं, क्योंकि उन्हें स्मृति में अधिसूचित नहीं किया जा सकता है, इसलिए कोई व्यक्ति एप्लिकेशन की मेमोरी या मेमोरी डंप को देखकर पासवर्ड देख सकता है। इसके बजाय SecureString या बाइट [] का उपयोग करें और जैसे ही पासवर्ड की आवश्यकता नहीं है, उन्हें निपटाने या शून्य करने के लिए याद रखें।

+0

हाय, मैंने यह कोशिश की, लेकिन मुझे एन्ट्रॉपी = rng.GetBytes (20) में एक त्रुटि मिली: यह int से बाइट [] – Robin

+0

@CrispyGMR में कनवर्ट नहीं किया जा सकता है मैंने जवाब में कोड का टुकड़ा तय कर दिया है। अच्छी पकड़। – akton

+0

बहुत बहुत धन्यवाद। मैंने पहली बार हैशिंग के लिए एमडी 5 का इस्तेमाल किया, लेकिन मैं इसके बारे में उलझन में था। यह रास्ता और अधिक सुरक्षित लगता है। हालांकि एक और सवाल है। मैं इस तरह के कुछ डेटा को एक पाठ फ़ाइल में सहेजना चाहता हूं। मैं देखता हूं कि जब मैं अपनी फाइल खोलता हूं तो यह यादृच्छिक पात्रों का एक गुच्छा है, लेकिन क्या यह ऐसा करने के लिए पर्याप्त सुरक्षित है? या आप डेटा संग्रह करने का एक और तरीका सुझाते हैं? – Robin

6

मैंने पहले इस का इस्तेमाल किया है और मैं आदेश जारी रहती है यकीन है कि क्रेडेंशियल बनाने के लिए लगता है और एक सबसे अच्छा सुरक्षित तरीके से

  1. आप ConfigurationManager वर्ग
  2. का उपयोग करके ऐप कॉन्फ़िग फ़ाइल के लिए उन्हें लिख सकते हैं SecureString वर्ग
  3. का उपयोग कर पासवर्ड सुरक्षित करना Cryptography नामस्थान में टूल का उपयोग करके इसे एन्क्रिप्ट करना।

यह लिंक बहुत मदद की हो जाएगा मुझे आशा है कि: Click here

3

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

2

यह केवल विंडोज पर काम करता है, इसलिए यदि आप डॉटनेट कोर क्रॉस-प्लेटफ़ॉर्म का उपयोग करने की योजना बना रहे हैं, तो आपको कहीं और देखना होगा। देखें https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md