2012-06-15 24 views
9

यह ऐप एक टेक्स्टबॉक्स के साथ एक फॉर्म प्रदर्शित करता है जहां उपयोगकर्ता को दस्तावेज़ को डिक्रिप्ट करने के लिए उपयोग किया जाने वाला पासवर्ड दर्ज करना होता है।, पासवर्ड जैसे संवेदनशील डेटा को संभालने का सही तरीका क्या है?

मैं कोड है कि इस तरह दिखता है:

string password = passwordTextBox.Text; 
... 
DecryptDocument(password); 

लेकिन मुझे बताया गया था कि, तकनीकी तौर पर, यह एक सुरक्षा दोष है, क्योंकि डेटा है कि पासवर्ड का प्रतिनिधित्व करता है स्मृति में रहना हो सकता है के बाद भी आवेदन है बन्द है।

मैं System.Security.SecureString वर्ग का उपयोग करने की कोशिश की लेकिन अब मैं CoTaskMem जो समस्या को बदतर बनाने के लिए लगता है की ओर इशारा के साथ काम कर रहा हूँ:

SecureString password = new SecureString(); 
foreach(char i in passwordTextBox.Text.ToCharArray()) 
password.AppendChar(i); 

IntPtr ptr = Marshal.SecureStringToCoTaskMemAnsi(password); 
int length = password.Length; 
byte[] bytes = new byte[length]; 

Marshal.Copy(ptr, bytes, 0, length); 

DecryptDocument(Encoding.Default.GetString(bytes)); 

Marshal.FreeCoTaskMem(ptr); 

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

क्या इस समस्या को हल करने का कोई तरीका है या क्या मुझे इस सुरक्षा भेद्यता से निपटना चाहिए?

+0

"लेकिन मुझे बताया गया कि तकनीकी रूप से यह एक सुरक्षा दोष है, क्योंकि एप्लिकेशन बंद होने के बावजूद पासवर्ड का प्रतिनिधित्व करने वाला डेटा स्मृति में भी रह सकता है।" ** - हालांकि यह सच है स्मृति में एक यादृच्छिक स्थान में हो। आप कुछ भी नहीं चिंतित हैं। ** "क्या इस समस्या को हल करने का कोई तरीका है या क्या मुझे इस सुरक्षा भेद्यता से निपटना चाहिए?" ** यह क्या भेद्यता होगी? ** –

+2

यह भेद्यता होगी: http: // cwe .mitre.org/डेटा/परिभाषाएं/316.html –

+2

@ रैमहाउंड, यदि आप मेमोरी में यादृच्छिक स्थान में टेक्स्ट रखने के बारे में चिंतित नहीं हैं, तो सिक्योरस्टिंग का उपयोग करने के लायक नहीं है। निष्पक्ष होने के लिए, यह वास्तव में केवल थोड़ी सी सुरक्षा जोड़ता है; मुख्य चिंता क्रैश डंप है, हालांकि वे पहले से ही संवेदनशील जानकारी के सभी प्रकार को रिसाव कर सकते हैं (यानी सबकुछ जो कामकाजी उद्देश्यों के लिए वर्तमान में डिक्रिप्ट किया गया था)। एकमात्र चीज सिक्योरस्ट्रिंग वास्तव में आपको खरीदती है, एक पासफ्रेज लीक करने की कम संभावना है, जो संभावित रूप से एक कुंजी (या शामिल उपयोगकर्ता द्वारा उपयोग की जाने वाली अन्य सेवाओं को समझौता कर सकती है, अगर वे अपना पासफ्रेज पुन: उपयोग करते हैं।) –

उत्तर

7

यदि आप वास्तव में सिक्योरस्ट्रिंग का उपयोग करना चाहते हैं, तो इसे अंत में उपयोग करने की आवश्यकता है, अधिमानतः केवल एक ही समय में एक चरित्र से बातचीत करना। जब भी स्ट्रिंग को किसी वर्ण सरणी में डिक्रिप्ट किया जाता है, तो आप इसका उपयोग करते समय स्मृति को स्पष्ट रूप से साफ़ करना चाहते हैं। इसके परिणाम:

  1. आपको सुरक्षित टेक्स्टबॉक्स नियंत्रण का उपयोग करना चाहिए जो सीधे सिक्योरस्ट्रिंग के साथ संचालित होता है। एक अच्छे उदाहरण के लिए here देखें।

  2. आपको सीधे सिक्योरस्ट्रिंग लेने के लिए डिक्रिप्ट दस्तावेज़ को संशोधित करना चाहिए।

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