अगर मेरी धारणाएं यहां गलत हैं, तो मुझे सुधारने के लिए स्वतंत्र महसूस करें, लेकिन मुझे यह बताने दें कि मैं क्यों पूछ रहा हूं।
MSDN से लिया गया, a SecureString
:
पाठ का प्रतिनिधित्व करता है जिसे गोपनीय रखा जाना चाहिए। पाठ का उपयोग किए जाने पर गोपनीयता के लिए एन्क्रिप्ट किया जाता है, और जब आवश्यकता नहीं होती है तो कंप्यूटर मेमोरी से हटा दिया जाता है।
मुझे यह मिलता है, यह एक पासवर्ड या अन्य निजी जानकारी को एक SecureString
से अधिक में संग्रहीत करने के लिए पूर्ण समझ में आता है System.String
, क्योंकि आप यह नियंत्रित कर सकते हैं कि यह कैसे और कब वास्तव में मेमोरी में संग्रहीत है, क्योंकि System.String
:
दोनों अपरिवर्तनीय है और, जब आवश्यकता नहीं होती है, तो कचरा संग्रह के लिए प्रोग्रामेटिक रूप से निर्धारित नहीं किया जा सकता है; यह है कि, उदाहरण केवल पढ़ने के बाद ही बनाया जाता है और यह अनुमान लगाना संभव नहीं है कि कंप्यूटर मेमोरी से इंस्टेंस कब डिलीट होगा। नतीजतन, यदि किसी स्ट्रिंग ऑब्जेक्ट में संवेदनशील जानकारी जैसे पासवर्ड, क्रेडिट कार्ड नंबर, या व्यक्तिगत डेटा है, तो एक जोखिम है कि जानकारी का उपयोग किए जाने के बाद पता चल सकता है क्योंकि आपका एप्लिकेशन कंप्यूटर मेमोरी से डेटा को हटा नहीं सकता है।
हालांकि, GUI एप्लिकेशन के मामले में (उदाहरण के लिए, एक ssh क्लाइंट), SecureString
a से निर्मित किया जाना चाहिए System.String
। सभी पाठ नियंत्रण इसके अंतर्निहित डेटा प्रकार के रूप में एक स्ट्रिंग का उपयोग करते हैं ।
तो, इसका मतलब यह है कि हर बार जब उपयोगकर्ता एक कुंजी दबाता है, तो पुराना स्ट्रिंग जो वहां छोड़ दिया गया था, और एक नया स्ट्रिंग यह दर्शाने के लिए बनाया गया है कि टेक्स्ट बॉक्स के अंदर का मान क्या है, भले ही पासवर्ड मास्क का उपयोग कर रहा हो। और जब या तो उन मूल्यों को स्मृति से खारिज कर दिया जाता है या हम नियंत्रित नहीं कर सकते ।
अब सर्वर में लॉग इन करने का समय आ गया है। अंदाज़ा लगाओ? प्रमाणीकरण के लिए आपको कनेक्शन पर एक स्ट्रिंग पास करने की आवश्यकता है । तो चलो हमारे SecureString
एक में परिवर्तित करें System.String
.... और अब हमारे पास ढेर पर एक स्ट्रिंग है, जिसमें कचरा संग्रह के माध्यम से जाने के लिए मजबूर नहीं किया गया है (या इसके बफर में 0 लिखें)।
मेरी बात है : कोई फर्क नहीं पड़ता कि आप क्या करते, रेखा के साथ कहीं न कहीं, कि SecureString
है के लिए जा रहा एक में परिवर्तित करने System.String
, यह अर्थ कुछ बिंदु पर ढेर पर कम से कम अस्तित्व में (कचरा संग्रहण के किसी भी गारंटी के बिना) होगा।
मेरी बात यह नहीं है : क्या एक ssh कनेक्शन के लिए एक स्ट्रिंग भेजने को दरकिनार करने के तरीके हैं, या एक नियंत्रण स्टोर एक स्ट्रिंग (एक कस्टम नियंत्रण करें) को दरकिनार कर रहे हैं। इस प्रश्न के लिए, आप "ssh कनेक्शन" को "लॉगिन फ़ॉर्म", "पंजीकरण फ़ॉर्म", "भुगतान फ़ॉर्म", "खाद्य पदार्थ-आप-खिला-पिला सकते हैं, लेकिन अपने-अपने बच्चों के रूप में नहीं" से बदल सकते हैं, आदि।
- तो,
SecureString
वास्तव में व्यावहारिक रूप से उपयोग करना किस बिंदु पर है ? - क्या कभी किसी
System.String
वस्तु के उपयोग को पूरी तरह से खत्म करने के लिए अतिरिक्त विकास समय के लायक है ? - क्या
SecureString
केवल एकSystem.String
ढेर पर समय की मात्रा को कम करने का पूरा बिंदु (एक भौतिक स्वैप फ़ाइल में जाने के अपने जोखिम को कम करना) है? - यदि किसी हमलावर के पास पहले से ही ढेर निरीक्षण के लिए साधन हैं, तो वह सबसे अधिक संभावना है (ए) के पास पहले से ही कीस्ट्रोक्स पढ़ने का साधन है, या (बी) के पास पहले से ही भौतिक रूप से मशीन है ... इसलिए उसका उपयोग
SecureString
करने से रोकने के लिए होगा। डेटा वैसे भी? - क्या यह सिर्फ "अश्लीलता के माध्यम से सुरक्षा" है?
क्षमा करें, यदि मैं बहुत मोटे सवालों पर सवाल उठा रहा हूं, तो जिज्ञासा मुझे बेहतर लगी। किसी भी या मेरे सभी सवालों का जवाब देने के लिए स्वतंत्र महसूस करें (या मुझे बताएं कि मेरी धारणाएं पूरी तरह से गलत हैं)। :)
SecureString
वास्तव में एक सुरक्षित स्ट्रिंग नहीं है। यह केवल समय खिड़की को कम करने का एक तरीका है जिसमें कोई आपकी स्मृति का निरीक्षण कर सकता है और संवेदनशील डेटा को सफलतापूर्वक प्राप्त कर सकता है। यह बुलेटप्रूफ नहीं है और यह होने का इरादा नहीं था। लेकिन आप जिन बिंदुओं को उठा रहे हैं, वे बहुत मान्य हैं। संबंधित: stackoverflow.com/questions/14449579/...