मुझे .NET में SecureString की आवश्यकता कब होगी?


179

मैं .NET के सिक्योरस्ट्रिंग के उद्देश्य को टटोलने की कोशिश कर रहा हूं। MSDN से:

System.String वर्ग का एक उदाहरण अपरिवर्तनीय है और, जब आवश्यकता नहीं होती है, तो कचरा संग्रहण के लिए प्रोग्रामेटिक रूप से निर्धारित नहीं किया जा सकता है; यह है, उदाहरण के पढ़ने के बाद ही इसे बनाया जाता है और यह अनुमान लगाना संभव नहीं है कि कंप्यूटर मेमोरी से इंस्टेंस को कब डिलीट किया जाएगा। नतीजतन, यदि किसी स्ट्रिंग ऑब्जेक्ट में संवेदनशील जानकारी जैसे पासवर्ड, क्रेडिट कार्ड नंबर, या व्यक्तिगत डेटा है, तो एक जोखिम है कि जानकारी का उपयोग किए जाने के बाद पता चल सकता है क्योंकि आपका एप्लिकेशन कंप्यूटर मेमोरी से डेटा को हटा नहीं सकता है।

एक SecureString ऑब्जेक्ट एक स्ट्रिंग ऑब्जेक्ट के समान है जिसमें इसका टेक्स्ट मान है। हालाँकि, एक SecureString ऑब्जेक्ट का मान स्वचालित रूप से एन्क्रिप्ट किया गया है, जब तक कि आपका एप्लिकेशन इसे केवल-पढ़ने के लिए चिह्नित नहीं करता है, तब तक इसे संशोधित किया जा सकता है, और आपके एप्लिकेशन या .NET फ्रेमवर्क कचरा कलेक्टर द्वारा कंप्यूटर मेमोरी से हटाया जा सकता है।

SecureString के एक उदाहरण का मान स्वचालित रूप से एन्क्रिप्ट किया जाता है जब उदाहरण को आरंभीकृत किया जाता है या जब मूल्य को संशोधित किया जाता है। आपका आवेदन अस्थिर उदाहरण प्रस्तुत कर सकता है और MakeReadOnly विधि को लागू करके आगे संशोधन को रोक सकता है।

क्या स्वचालित एन्क्रिप्शन बड़ा भुगतान है?

और मैं सिर्फ यह क्यों नहीं कह सकता:

SecureString password = new SecureString("password");

के बजाय

SecureString pass = new SecureString();
foreach (char c in "password".ToCharArray())
    pass.AppendChar(c);

SecureString का कौन सा पहलू मुझे याद आ रहा है?


3
11 साल बाद और एमएस अब SecureStringनए विकास के लिए अनुशंसा नहीं करते हैं : github.com/dotnet/platform-compat/blob/master/docs/DE0001.md
मैट थॉमस

जवाबों:


4

मैं SecureString का उपयोग करना बंद कर दूंगा। लगता है कि पीजी के लोग इसके लिए समर्थन छोड़ रहे हैं। संभवतः भविष्य में भी इसे खींच सकते हैं - https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring

हमें .NET Core में सभी प्लेटफ़ॉर्म पर SecureString से एन्क्रिप्शन को हटा देना चाहिए - हमें SecureString को अप्रचलित कर देना चाहिए - हमें शायद SecureString को .NET Core में उजागर नहीं करना चाहिए।


1
लिंक मृत है, लेकिन यह आगे बढ़ना प्रतीत होता है: docs.microsoft.com/en-us/dotnet/api/… .. पथ पर कुछ बहुत ही कमजोर मार्गदर्शन के साथ "निष्पादित क्रेडेंशियल्स का उपयोग न करें" - github.com/dotnet/platform- हमवतन / बूँद / मास्टर / डॉक्स / DE0001.md .. न तो आप अपने प्रमाणपत्र की निजी कुंजी की रक्षा के लिए एक पासवर्ड का उपयोग करने की हिम्मत नहीं!
felickz

1
11 वर्षों के बाद, यह उत्तर अब 'नया' सही है। लिंक बासी लग रहे हैं, लेकिन एमएस से मार्गदर्शन है: SecureString का उपयोग नहीं किया जाना चाहिए
रिचर्ड मॉर्गन

109

वर्तमान में उपयोग किए जाने वाले ढांचे के कुछ हिस्से SecureString:

मुख्य उद्देश्य हमले की सतह को कम करना है, बजाय इसे खत्म करना। SecureStringsरैम में "पिन किए गए" हैं, इसलिए कचरा कलेक्टर इसे चारों ओर नहीं ले जाएगा या इसकी प्रतियां नहीं बनाएगा। यह भी सुनिश्चित करता है कि सादे पाठ को स्वैप फ़ाइल या कोर डंप में नहीं लिखा जाएगा। एन्क्रिप्शन अधिक पसंद है और एक निर्धारित हैकर को रोक नहीं सकता है, हालांकि, जो एन्क्रिप्ट करने और इसे डिक्रिप्ट करने के लिए उपयोग की गई सममित कुंजी को खोजने में सक्षम होगा ।

जैसा कि दूसरों ने कहा है, आपको SecureStringचरित्र-दर-चरित्र बनाने का कारण यह है कि अन्यथा करने का पहला स्पष्ट दोष है: आपके पास संभवतः एक सादे स्ट्रिंग के रूप में गुप्त मूल्य है, इसलिए क्या बात है?

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


2
मैं इसे पूरी तरह से चलाने के लिए ProcessStartInfo की पासवर्ड संपत्ति देख रहा था; टाइप पर भी ध्यान नहीं दे रहा है, मैं बस इसे एक नियमित स्ट्रिंग पर सेट करता हूं जब तक कि कंपाइलर मुझ पर भौंक न जाए।
रिचर्ड मॉर्गन

यह सममित एन्क्रिप्शन कुंजी खोजने में आसान नहीं होगा, क्योंकि SecureString DPAPI पर आधारित है, जो बिल्कुल सादे में एक कुंजी स्टोर नहीं करता है ...
AviD

1
इसके अलावा, यह चिकन और अंडे की समस्या इतनी अधिक नहीं है, क्योंकि यह भंडारण में एन्क्रिप्शन के लिए प्रतिस्थापन नहीं है - लेकिन इसके अपरिवर्तनीय, प्रबंधित .NET स्ट्रिंग्स के लिए एक समाधान है।
एवीडी

2
"संभवतः आपके पास पहले से ही एक सादे स्ट्रिंग के रूप में गुप्त मूल्य है, तो क्या बात है?" क्या इस सवाल का जवाब है? ऐसा लगता है कि यदि आप लंबे समय तक स्मृति में संग्रहीत पासवर्ड रखने का इरादा रखते हैं, तो यह "कुछ नहीं से बेहतर" समाधान है।
xr280xr

2
उपयोग के कुछ सरल कोड उदाहरण होने के बारे में क्या? मेरा मानना ​​है कि मैं इसका उपयोग कैसे और कब करना बेहतर समझूंगा।
कोडिया

37

संपादित करें : SecureString का उपयोग न करें

वर्तमान मार्गदर्शन अब कहता है कि कक्षा का उपयोग नहीं किया जाना चाहिए। विवरण इस लिंक पर पाया जा सकता है: https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md

लेख से:

DE0001: SecureString का उपयोग नहीं किया जाना चाहिए

प्रेरणा

  • इसका उद्देश्य SecureStringप्रक्रिया स्मृति में सादे पाठ के रूप में संग्रहीत रहस्यों से बचना है।
  • हालाँकि, Windows पर भी, SecureStringOS अवधारणा के रूप में मौजूद नहीं है।
    • यह सिर्फ सादे पाठ को छोटा करने वाली खिड़की बनाता है; यह पूरी तरह से इसे रोकता नहीं है क्योंकि .NET को अभी भी स्ट्रिंग को एक सादे पाठ प्रतिनिधित्व में बदलना है।
    • लाभ यह है कि सादा पाठ निरूपण एक उदाहरण के रूप में घूमता नहीं है System.String- देशी बफर का जीवनकाल छोटा होता है।
  • .NET फ्रेमवर्क को छोड़कर सरणी की सामग्री अनएन्क्रिप्टेड है।
    • .NET फ्रेमवर्क में, आंतरिक चार सरणी की सामग्री एन्क्रिप्ट की गई है। .NET सभी वातावरणों में एन्क्रिप्शन का समर्थन नहीं करता है, या तो लापता एपीआई या प्रमुख प्रबंधन मुद्दों के कारण।

सिफ़ारिश करना

उपयोग न करें SecureStringनए कोड के लिए । .NET कोर में कोड पोर्ट करते समय, विचार करें कि सरणी की सामग्री मेमोरी में एन्क्रिप्टेड नहीं है।

क्रेडेंशियल्स से निपटने का सामान्य दृष्टिकोण उन्हें टालना है और इसके बजाय प्रमाण पत्र या विंडोज प्रमाणीकरण जैसे प्रमाणीकरण के लिए अन्य साधनों पर भरोसा करना है।

अंत संपादित करें: नीचे मूल सारांश

बहुत बढ़िया जवाब; यहाँ एक त्वरित सारांश है जिस पर चर्चा की गई है।

Microsoft ने संवेदनशील जानकारी (जैसे क्रेडिट कार्ड, पासवर्ड, आदि) के साथ बेहतर सुरक्षा प्रदान करने के प्रयास में SecureString वर्ग को लागू किया है। यह स्वचालित रूप से प्रदान करता है:

  • एन्क्रिप्शन (मेमोरी डंप या पेज कैशिंग के मामले में)
  • याद में पिन करना
  • केवल पढ़ने के लिए चिह्नित करने की क्षमता (किसी भी अन्य संशोधनों को रोकने के लिए)
  • एक निरंतर स्ट्रिंग को अंदर जाने की अनुमति नहीं देकर सुरक्षित निर्माण

वर्तमान में, SecureString उपयोग में सीमित है, लेकिन भविष्य में बेहतर गोद लेने की उम्मीद है।

इस जानकारी के आधार पर, SecureString के निर्माता को केवल एक स्ट्रिंग नहीं लेनी चाहिए और इसे चारो तरफ स्लाइस करना चाहिए क्योंकि स्ट्रिंग को सुरक्षित करने के उद्देश्य को हराया है।

अतिरिक्त जानकारी:

  • .NET सिक्योरिटी ब्लॉग की एक पोस्ट , जो यहाँ कवर की गई है, के बारे में बहुत कुछ बताती है।
  • और एक और एक यह समीक्षा और एक उपकरण है जो SecureString की सामग्री को डंप कर सकते हैं उल्लेख।

संपादित करें: मुझे सबसे अच्छा उत्तर चुनना कठिन लग रहा था क्योंकि कई में अच्छी जानकारी है; बहुत बुरा है कोई सहायक उत्तर विकल्प नहीं है।


19

संक्षिप्त जवाब

मैं अभी क्यों नहीं कह सकता:

SecureString password = new SecureString("password");

क्योंकि अब तुम्हारी passwordयाद में है; इसे पोंछने का कोई तरीका नहीं है - जो कि बिल्कुल सिक्योरस्ट्रिंग की बात है ।

लंबा जवाब

SecureString मौजूद है इसका कारण यह है कि जब आप इसके साथ संवेदनशील डेटा को पोंछने के लिए ZeroMemory का उपयोग नहीं कर सकते हैं। यह CLR के कारण मौजूद किसी समस्या को हल करने के लिए मौजूद है ।

एक नियमित देशी एप्लिकेशन में आप कॉल करेंगे SecureZeroMemory:

शून्य के साथ स्मृति का एक ब्लॉक भरता है।

नोट : SecureZeroMemory समान है ZeroMemory, सिवाय इसके कि कंपाइलर इसे ऑप्टिमाइज़ नहीं करेगा।

समस्या यह है कि आप .NET को कॉल या अंदर नहीं कर सकते । और .NET स्ट्रिंग्स में अपरिवर्तनीय हैं; आप स्ट्रिंग की सामग्री को भी नहीं लिख सकते हैं जैसे आप अन्य भाषाओं में कर सकते हैं:ZeroMemorySecureZeroMemory

//Wipe out the password
for (int i=0; i<password.Length; i++)
   password[i] = \0;

तो आप क्या कर सकते हैं? जब हम इसके साथ काम करते हैं तो हम पासवर्ड से या पासवर्ड से क्रेडिट कार्ड नंबर को मिटा देने की .NET में क्षमता कैसे प्रदान करते हैं?

एकमात्र तरीका यह किया जा सकता है कि स्ट्रिंग को कुछ देशी मेमोरी ब्लॉक में रखें, जहां आप फिर कॉल कर सकते हैं ZeroMemory। एक देशी मेमोरी ऑब्जेक्ट जैसे:

  • एक बीटीएस
  • एक HGLOBAL
  • CoTaskMem अप्रबंधित स्मृति

सिक्योरस्ट्रिंग खोई हुई क्षमता को वापस देता है

.NET में, स्ट्रिंग्स को मिटाया नहीं जा सकता है जब आप उनके साथ होते हैं:

  • वे अपरिवर्तनीय हैं; आप उनकी सामग्री को अधिलेखित नहीं कर सकते
  • आप Disposeउनमें से नहीं कर सकते
  • उनकी सफाई कूड़ा उठाने वाले की दया पर है

SecureString स्ट्रिंग्स सुरक्षा के चारों ओर से गुजरने के एक रास्ते के रूप में मौजूद है, और जब आपको आवश्यकता होती है तो उनकी सफाई की गारंटी देने में सक्षम हो।

आपने प्रश्न पूछा:

मैं अभी क्यों नहीं कह सकता:

SecureString password = new SecureString("password");

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

SecureString मेमोरी में एन्क्रिप्टेड स्ट्रिंग को स्टोर करने के लिए डेटा प्रोटेक्शन एपीआई का उपयोग करता है; इस तरह से स्ट्रिंग swapfiles, क्रैश डंप, या यहां तक ​​कि स्थानीय चर विंडो में किसी सहकर्मी के साथ आपकी इच्छा से मौजूद नहीं होगी।

मैं पासवर्ड कैसे पढ़ूं?

फिर सवाल है: मैं स्ट्रिंग के साथ कैसे बातचीत करूं? आप बिल्कुल ऐसा तरीका नहीं चाहते हैं:

String connectionString = secureConnectionString.ToString()

क्योंकि अब आप वापस वहीं हैं जहाँ आपने शुरू किया था - एक पासवर्ड जिससे आप छुटकारा नहीं पा सकते। आप डेवलपर्स को संवेदनशील स्ट्रिंग को सही ढंग से संभालने के लिए मजबूर करना चाहते हैं - ताकि इसे मेमोरी से मिटा दिया जा सके।

यही कारण है कि .NET एक सुरक्षित स्मृति में एक SecureString को सुरक्षित करने के लिए तीन आसान सहायक कार्य प्रदान करता है:

आप स्ट्रिंग को एक अप्रबंधित मेमोरी ब्लॉब में परिवर्तित करते हैं, इसे संभालते हैं, और फिर इसे फिर से पोंछते हैं।

कुछ एपीआई सिक्योरस्ट्रीम को स्वीकार करते हैं । उदाहरण के लिए ADO.net 4.5 में SqlConnection.Credential एक सेट SqlCredential लेता है :

SqlCredential cred = new SqlCredential(userid, password); //password is SecureString
SqlConnection conn = new SqlConnection(connectionString);
conn.Credential = cred;
conn.Open();

आप कनेक्शन स्ट्रिंग के भीतर पासवर्ड भी बदल सकते हैं:

SqlConnection.ChangePassword(connectionString, cred, newPassword);

और .NET के अंदर बहुत सारे स्थान हैं जहां वे संगतता उद्देश्यों के लिए एक सादे स्ट्रिंग को स्वीकार करना जारी रखते हैं, फिर जल्दी से एक पुट के चारों ओर इसे एक SecureString में बदल देते हैं।

सिक्योरस्ट्रिंग में टेक्स्ट कैसे डालें?

यह अभी भी समस्या छोड़ देता है:

मैं पहली बार SecureString में एक पासवर्ड कैसे प्राप्त करूं?

यह चुनौती है, लेकिन बात आपको सुरक्षा के बारे में सोचने की है।

कभी-कभी आपके लिए कार्यक्षमता पहले से ही प्रदान की जाती है। उदाहरण के लिए, WPF PasswordBox नियंत्रण आप एक के रूप में दर्ज पासवर्ड लौट सकते हैं SecureString सीधे:

PasswordBox.SecurePassword संपत्ति

वर्तमान में PasswordBox द्वारा सुरक्षित पासवर्ड के रूप में रखे गए पासवर्ड को प्राप्त करता है

यह मददगार है क्योंकि हर जगह जब आप एक कच्ची स्ट्रिंग के आसपास से गुजरते थे, तो अब आपके पास यह टाइप करने की प्रणाली है कि सिक्योरस्ट्रिंग स्ट्रिंग से असंगत है। आप अपने सिक्योरस्ट्रीमिंग को नियमित स्ट्रिंग में परिवर्तित करने से पहले जितना संभव हो उतना लंबा चलना चाहते हैं।

एक SecureString परिवर्तित करना काफी आसान है:

  • SecureStringToBSTR
  • PtrToStringBSTR

जैसे की:

private static string CreateString(SecureString secureString)
{
    IntPtr intPtr = IntPtr.Zero;
    if (secureString == null || secureString.Length == 0)
    {
        return string.Empty;
    }
    string result;
    try
    {
        intPtr = Marshal.SecureStringToBSTR(secureString);
        result = Marshal.PtrToStringBSTR(intPtr);
    }
    finally
    {
        if (intPtr != IntPtr.Zero)
        {
            Marshal.ZeroFreeBSTR(intPtr);
        }
    }
    return result;
}

वे वास्तव में आप ऐसा नहीं करना चाहते हैं।

लेकिन मैं सिक्योरस्ट्रिंग में स्ट्रिंग कैसे प्राप्त करूं? वैसे आपको जो करने की आवश्यकता है वह पहली जगह में एक स्ट्रिंग में एक पासवर्ड होना बंद कर देता है। आपको इसे किसी और चीज़ में रखने की ज़रूरत है । भले हीChar[] सरणी भी सहायक होगी।

जब आप प्रत्येक वर्ण को जोड़ सकते हैं और जब आप पूरा कर लेते हैं तो सादे को मिटा सकते हैं:

for (int i=0; i < PasswordArray.Length; i++)
{
   password.AppendChar(PasswordArray[i]);
   PasswordArray[i] = (Char)0;
}

आपको अपना पासवर्ड कुछ मेमोरी में संग्रहीत करना होगा जिसे आप मिटा सकते हैं। इसे वहां से SecureString में लोड करें।


tl; डॉ: SecureString के बराबर प्रदान करने के लिए मौजूद है ZeroMemory

कुछ लोग डिवाइस के लॉक होने पर उपयोगकर्ता के पासवर्ड को मेमोरी से पोंछने की स्थिति में नहीं दिखते हैं , या फिर वेहुथेंटेड के बाद मेमोरी से कीस्ट्रोक्स को पोंछते हुए । वे लोग SecureString का उपयोग नहीं करते हैं।


14

बहुत कम परिदृश्य हैं जहां आप समझदारी से फ्रेमवर्क के वर्तमान संस्करण में SecureString का उपयोग कर सकते हैं। यह वास्तव में केवल अप्रबंधित एपीआई के साथ बातचीत करने के लिए उपयोगी है - आप मार्शल का उपयोग करके इसे मार्शल कर सकते हैं। SecureStringToGlobalAllocUnicode।

जैसे ही आप इसे एक System.String से / में परिवर्तित करते हैं, आपने अपने उद्देश्य को हरा दिया है।

MSDN नमूना कंसोल इनपुट से एक बार में SecureString वर्ण उत्पन्न करता है और सुरक्षित स्ट्रिंग को एक अप्रबंधित API से गुजरता है। यह बल्कि दृढ़ और अवास्तविक है।

आप .NET के भविष्य के संस्करणों से अपेक्षा कर सकते हैं कि SecureString के लिए अधिक समर्थन है जो इसे और अधिक उपयोगी बना देगा, जैसे:

  • SecureString Console.ReadLineSecure () या नमूना में सभी जटिल कोड के बिना SecureString में कंसोल इनपुट पढ़ने के लिए समान है।

  • WinForms TextBox प्रतिस्थापन जो अपने TextBox.Text संपत्ति को एक सुरक्षित स्ट्रिंग के रूप में संग्रहीत करता है ताकि पासवर्ड सुरक्षित रूप से दर्ज किया जा सके।

  • पासवर्ड से सिक्योरस्ट्रिंग के रूप में पारित करने की अनुमति देने के लिए सुरक्षा से संबंधित एपीआई का विस्तार।

उपरोक्त के बिना, SecureString सीमित मूल्य का होगा।


12

मेरा मानना ​​है कि एक सपाट तात्कालिकता के बजाय आपको चरित्र को क्यों करना है, क्योंकि बैकग्राउंड "पासवर्ड" को सिक्योरस्ट्रिंग के निर्माणकर्ता के पास भेजना उस "पासवर्ड" स्ट्रिंग को स्मृति में सुरक्षित स्ट्रिंग के उद्देश्य को हरा देता है।

जोड़कर आप केवल स्मृति में एक समय में एक चरित्र डाल रहे हैं जो कि एक-दूसरे से सटे नहीं होने की संभावना है जो शारीरिक रूप से मूल स्ट्रिंग को फिर से संगठित करने के लिए बहुत कठिन बना देता है। मैं यहां गलत हो सकता हूं, लेकिन मुझे यह कैसे समझाया गया।

कक्षा का उद्देश्य सुरक्षित डेटा को मेमोरी डंप या इसी तरह के टूल के माध्यम से उजागर होने से रोकना है।


11

एमएस ने पाया कि सर्वर (डेस्कटॉप, जो भी हो) को क्रैश करने के कुछ उदाहरणों पर, ऐसे समय थे जब रनटाइम वातावरण मेमोरी में क्या है की सामग्री को उजागर करने वाला मेमोरी डंप करेगा। स्ट्रिंग की सामग्री को पुनः प्राप्त करने में सक्षम होने से रोकने के लिए सिक्योर स्ट्रिंग स्ट्रिंग मेमोरी में इसे एन्क्रिप्ट करता है।


5

सिक्योरस्ट्रिंग का एक बड़ा फायदा यह है कि इसे पेज कैशिंग के कारण आपके डेटा को डिस्क में स्टोर किए जाने की संभावना से बचा जाता है। यदि आपके पास मेमोरी में पासवर्ड है और फिर एक बड़े प्रोग्राम या डेटा सेट को लोड करते हैं, तो आपका पासवर्ड स्वैप फाइल को लिखा जा सकता है क्योंकि आपका प्रोग्राम मेमोरी से बाहर है। SecureString के साथ, कम से कम डेटा स्पष्ट पाठ में आपकी डिस्क पर अनिश्चित काल के आसपास नहीं बैठा होगा।


4

मुझे लगता है कि यह इसलिए है क्योंकि स्ट्रिंग सुरक्षित होने के लिए है, अर्थात एक हैकर को इसे पढ़ने में सक्षम नहीं होना चाहिए। यदि आप इसे एक स्ट्रिंग के साथ आरंभ करते हैं, तो हैकर मूल स्ट्रिंग को पढ़ सकता है।


4

खैर, जैसा कि विवरण बताता है, मान को एन्क्रिप्ट किया गया है, इसका मतलब है कि आपकी प्रक्रिया का मेमोरी डंप स्ट्रिंग के मूल्य (कुछ काफी गंभीर काम के बिना) को प्रकट नहीं करेगा।

कारण आप एक निरंतर स्ट्रिंग से सिर्फ एक SecureString का निर्माण नहीं कर सकते, क्योंकि तब आपके पास मेमोरी में स्ट्रिंग का एक अनएन्क्रिप्टेड संस्करण होगा । आपको टुकड़ों में स्ट्रिंग बनाने के लिए सीमित करने से एक ही बार में पूरे स्ट्रिंग को मेमोरी में रखने का जोखिम कम हो जाता है।


2
यदि वे एक निरंतर स्ट्रिंग से निर्माण को सीमित कर रहे हैं, तो लाइन फ़ॉरच ("पासवर्ड" में चार सी .ToCharArray ()) कि हार होगी, नहीं? यह पास होना चाहिए ।AppendChar ('पी'); pass.AppendChar ( 'एक'); आदि?
रिचर्ड मॉर्गन

हां, आप आसानी से पर्याप्त थ्रो फेंक सकते हैं जो सिक्योर स्ट्रिंग आपको देता है। वे पूरी तरह से अपने आप को पैर में गोली मारना कठिन बनाने की कोशिश कर रहे हैं। जाहिर है कि सिक्योरस्ट्रीमिंग में मूल्य प्राप्त करने और बाहर निकलने के लिए कोई रास्ता होना चाहिए, या आप इसे किसी भी चीज के लिए उपयोग नहीं कर सकते।
मार्क बेसे

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.