2008-09-02 18 views
31

मेरे पास ऐसा कुछ कोड है जो Winforms ऐप में है जिसे मैं उपयोगकर्ता के मेल बॉक्स संग्रहण कोटा से पूछताछ करने के लिए लिख रहा था।Winforms एप्लिकेशन में पासवर्ड कैसे स्टोर करें?

DirectoryEntry mbstore = new DirectoryEntry(
     @"LDAP://" + strhome, 
     m_serviceaccount, 
     [m_pwd], 
     AuthenticationTypes.Secure); 

कोई फर्क नहीं पड़ता दृष्टिकोण मैंने कोशिश की है (जैसे SecureString), मैं आसानी से पासवर्ड (m_pwd) या तो निष्पादन के लिए प्रोसेस एक्सप्लोरर के तार परावर्तक का उपयोग कर या का उपयोग करते हुए टैब को देखने के लिए कर रहा हूँ।

मुझे पता है कि मैं इस कोड को सर्वर पर डाल सकता हूं या प्रतिनिधिमंडल जैसे तंत्र का उपयोग करके सुरक्षा को मजबूत कर सकता हूं और सेवा खाते में केवल आवश्यक विशेषाधिकार दे सकता हूं।

क्या कोई हैकर्स को पासवर्ड प्रकट किए बिना स्थानीय एप्लिकेशन में पासवर्ड स्टोर करने का एक उचित सुरक्षित तरीका सुझा सकता है?

हैशिंग संभव नहीं है क्योंकि मुझे सही पासवर्ड जानने की आवश्यकता है (केवल मिलान उद्देश्य के लिए हैश नहीं)। एन्क्रिप्शन/डिक्रिप्शन तंत्र काम नहीं कर रहे हैं क्योंकि वे मशीन निर्भर हैं।

उत्तर

24

पवित्र विधि CryptoAPI और डेटा संरक्षण API का उपयोग करने के लिए है

, एन्क्रिप्ट कुछ इस तरह (C++) का उपयोग करें:।।

DATA_BLOB blobIn, blobOut; 
blobIn.pbData=(BYTE*)data; 
blobIn.cbData=wcslen(data)*sizeof(WCHAR); 

CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut); 
_encrypted=blobOut.pbData; 
_length=blobOut.cbData; 

डिक्रिप्शन है विपरीत:

DATA_BLOB blobIn, blobOut; 
blobIn.pbData=const_cast<BYTE*>(data); 
blobIn.cbData=length; 

CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut); 

std::wstring _decrypted; 
_decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR)); 

आप तो एन्क्रिप्टेड पासवर्ड सुरक्षित ढंग से रजिस्ट्री या कॉन्फ़िग फ़ाइल में संग्रहित किया जा सकता CRYPTPROTECT_LOCAL_MACHINE निर्दिष्ट नहीं करते हैं और केवल आप इसे डिक्रिप्ट कर सकते हैं। यदि आप LOCAL_MACHINE निर्दिष्ट करते हैं, तो मशीन तक पहुंचने वाला कोई भी व्यक्ति इसे प्राप्त कर सकता है।

2

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

4

मुझे यह पुस्तक किथ ब्राउन द्वारा .NET डेवलपर गाइड टू विंडोज सिक्योरिटी द्वारा मिली। इसमें कुछ अच्छे नमूने हैं जो सभी प्रकार के सुरक्षा परिदृश्यों को कवर करते हैं। मुफ्त Online version भी उपलब्ध है।

11

जैसा कि बताया गया है, डेटा प्रोटेक्शन एपीआई ऐसा करने का एक अच्छा तरीका है। ध्यान दें कि यदि आप .NET 2.0 या अधिक का उपयोग कर रहे हैं, तो आपको डीपीएपीआई को आमंत्रित करने के लिए पी/Invoke का उपयोग करने की आवश्यकता नहीं है। फ्रेमवर्क सिस्टम के साथ कॉल को लपेटता है। सुरक्षा। क्रिप्टोग्राफी। संरक्षित डेटा वर्ग।

+1

क्या वेब पर एक उदाहरण है कि यह कैसे किया जाता है? – karlipoppins

+1

@m_oLogin: मेरे अन्य उत्तरों में से एक देखें [यहां] (http://stackoverflow.com/questions/154430/persistent-storage-of-encrypted-data-using-net/154687#154687) –