String को SecureString में बदलें


127

कैसे कन्वर्ट करने के लिए Stringकरने के लिए SecureString?


यदि आपके पास एक स्ट्रिंग है, तो बहुत देर हो चुकी है। आपको एक बाइट सरणी में अपने डेटा की आवश्यकता है जिसे आप Array.Clear
जेम्स वेस्टगेट के

जवाबों:


137

तुम नहीं। SecureString ऑब्जेक्ट का उपयोग करने का पूरा कारण एक स्ट्रिंग ऑब्जेक्ट बनाने से बचने के लिए है (जो मेमोरी में लोड होता है और कचरा संग्रह तक प्लेनटेक्स्ट में रखा जाता है)। हालाँकि, आप वर्णों को जोड़कर किसी SecureString में जोड़ सकते हैं।

var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');

13
"संयोजन है 12345... यह उसी तरह की चीज है जैसे एक बेवकूफ अपने सामान पर है!"
कोलोब कैन्यन

8
मेरे द्वारा देखा गया*****
इयान बोयड

AppendCharरन टाइम तक निष्पादित नहीं होता है, इसलिए उन पात्रों को अभी भी आईएल से पढ़ा जा सकता है, सही है? हो सकता है कि कुछ संकलन-समय की आपत्ति के रूप में अच्छी तरह से मदद मिलेगी ... यानी, यदि आप हार्ड-कोडिंग पासवर्ड हैं।
samis

5
यह एक लंगड़ा तर्क है। आपको पासवर्ड कहां मिलता है? एक फॉर्म से या एक कमांड लाइन से। जब तक वे किसी उपकरण या कमांड लाइन तर्कों से सीधे सुरक्षित स्ट्रिंग को पढ़ने के लिए एक विधि नहीं बनाते हैं, तब तक हमें एक स्ट्रिंग को सिक्योरस्ट्रिंग में बदलने की आवश्यकता होगी।
क्वार्कली

1
@DonaldAirey आपको एक रहस्य प्रबंधक से एक पासवर्ड मिलता है। आमतौर पर हम जिन रहस्यों के बारे में यहां बात कर रहे हैं, वे उपयोगकर्ता पासवर्ड नहीं हैं, लेकिन ऐसी चीजें जो संभावित रूप से विशेषाधिकार वृद्धि या डेटा लीक की ओर ले जाती हैं। इसका मतलब है कि पासवर्ड अन्य सेवाओं के लिए हैं, और कमांड लाइनों पर या नेटवर्क चैनलों पर स्पष्ट रूप से पारित नहीं होना चाहिए।
बैरी केली

160

के बीच SecureStringऔर कन्वर्ट करने का एक और तरीका भी है String

1. String to SecureString

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;

2. SecureString स्ट्रिंग करने के लिए

string theString = new NetworkCredential("", theSecureString).Password;

यहाँ लिंक है


4
यह सबसे आम उपयोग-मामले के लिए अब तक का सबसे अच्छा समाधान है!
डैन बेहार्ड

16
SecureStringआपके कोड का उपयोग करने का कोई मतलब नहीं है यदि आपका कोड stringउस मूल्य के साथ ऑब्जेक्ट बनाता है जिसे आप सुरक्षित करना चाहते हैं। का लक्ष्य SecureStringप्रबंधित मेमोरी में स्ट्रिंग होने से बचना है, इसलिए उस मेमोरी की जांच करने वाला एक हमलावर उस मूल्य को देख सकता है जिसे आप छिपाना चाहते हैं। चूंकि जिस NetworkCredentialकंस्ट्रक्टर को आप कॉल कर रहे हैं, उसके लिए एक स्ट्रिंग की आवश्यकता होती है, यह जाने का तरीका नहीं है ... निश्चित रूप से, आपका कोड एक सिक्योरस्ट्रिंग से कन्वर्ट करने के लिए एक आसान तरीका है, लेकिन इसका उपयोग करने से आपका कोड एक सरलstring
जियान पाओलो

15
@GianPaolo जबकि सिद्धांत में सही है, व्यवहार में हमें अभी भी SecureStringकुछ पुस्तकालयों के साथ काम करते समय उपयोग करने की आवश्यकता है । और यहाँ ईमानदार होने देता है, अगर कोई आपके एप्लिकेशन की मेमोरी को सक्रिय रूप से स्कैन कर रहा है तो आप पहले ही खो चुके हैं। भले ही आपने SecureString का सही तरीके से उपयोग किया हो, जो मैंने कभी नहीं देखा है, निकालने के लिए अन्य मूल्यवान डेटा होने जा रहा है।
जोनाथन एलन

1
@JonathanAllen: आप शायद सही हैं, लेकिन केवल इसलिए कि हमारे पास सुरक्षा को बाद में मानने की संस्कृति है। यदि आप एक रेसिपी वेबसाइट बना रहे हैं, तो उत्तर कोरिया आपके प्रोग्राम की मेमोरी को स्कैन करने की कोशिश नहीं कर सकता है। यदि आप बैंकिंग सॉफ्टवेयर लिख रहे हैं, तो खतरा कहीं अधिक वास्तविक है।
एरिक जे।

58

नीचे विधि स्ट्रिंग को सुरक्षित स्ट्रिंग में बदलने में मदद करती है

private SecureString ConvertToSecureString(string password)
{
    if (password == null)
        throw new ArgumentNullException("password");

    var securePassword = new SecureString();

    foreach (char c in password)
        securePassword.AppendChar(c);

    securePassword.MakeReadOnly();
    return securePassword;
}

26
+1, लेकिन ध्यान दें कि पासवर्ड को एक स्ट्रिंग पैरामीटर के रूप में पास करना प्रबंधित मेमोरी में एक अनएन्क्रिप्टेड स्ट्रिंग इंस्टेंस बनाता है और पहले स्थान पर 'SecureString' के उद्देश्य को पराजित करता है। बस आने वाले भविष्य के लोगों के लिए इसे इंगित करना और इस कोड का उपयोग करना।
कोडी

19
@ कोडी यह सच है, और एक अच्छी बात है, लेकिन हम में से कई लोग इस बात की परवाह नहीं करते हैं कि सिक्योरस्ट्रिंग सुरक्षित है या नहीं और केवल इसका उपयोग कर रहे हैं क्योंकि कुछ Microsoft API को पैरामीटर के रूप में इसकी आवश्यकता होती है।
डैन बेहार्ड

3
@ कोडी ने बताया कि सिक्योरस्ट्रिंग क्लास भी स्ट्रिंग को एन्क्रिप्ट नहीं कर सकती है। यही कारण है कि एमएस github.com/dotnet/platform-compat/blob/master/docs/DE0001.md टाइप करने पर विचार कर रहा है ।
मार्टिन ब्राउन

19

आप इसका अनुसरण कर सकते हैं:

string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();

11

यहाँ एक सस्ता linq चाल है।

            SecureString sec = new SecureString();
            string pwd = "abc123"; /* Not Secure! */
            pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
            /* and now : seal the deal */
            sec.MakeReadOnly();

32
यह उत्तर एक अभ्यास है जो यह देख रहा है कि एक शॉट में सादे पाठ की कितनी अस्थायी प्रतियां उत्पन्न की जा सकती हैं
माइक कैरन

1
जैसा कि @ जॉन-डग्ग ने सुझाव दिया था कि यह विचार आपके पासवर्ड के साथ एक स्ट्रिंग सेट करने के लिए नहीं है क्योंकि यदि आप ऐसा करते हैं तो एक securestring का उपयोग करने के लिए कोई लाभ नहीं बचा है। आपके मामले में आपने सादा पाठ में पासवर्ड डाला है, आप बाद में एक securestring का उपयोग करके कुछ भी हासिल नहीं कर रहे हैं। मुझे आशा है कि आप समझ गए हैं कि धर्मनिरपेक्षता आपके स्ट्रिंग को डिसएफ़ीड या एक डिबगर को देखने वाले लोगों से सुरक्षित करने के लिए थी, इसलिए आईएल / मेमोरी में व्हाट्स देखें।
user734028

8

मैं इसे वहाँ फेंक दूंगा। क्यों?

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

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


1
मैं सिर्फ ProcessStartInfo के लिए पासवर्ड सेट करने और अलग-अलग उपयोगकर्ता के रूप में अपना निर्वासन चलाने के लिए इसका उपयोग करना चाहता हूं .. जो कि मेरे लिए काम करता है ...
डेवलपर

4
इसे सुरक्षित प्रणाली पर चलाने से मेरा आवेदन सुरक्षित है। मैं इस विशेष स्ट्रिंग को स्मृति में एन्क्रिप्ट किए जाने के बारे में कम परवाह नहीं कर सका। चिंता करने के लिए इस प्रणाली के बारे में जानकारी के कहीं अधिक महत्वपूर्ण टुकड़े हैं, इसे कभी भी समझौता किया जाना चाहिए। SecureString को बस एक Microsoft API की आवश्यकता होती है जिसे मेरे प्रोग्राम को उपयोग करने की आवश्यकता होती है। यह निहित है कि डेवलपर अपने स्वयं के उपयोग-मामले पर विचार करता है और यह निर्धारित करता है कि स्ट्रिंग्स को सिक्योरस्ट्रीम में परिवर्तित करना संदर्भ में एक वैध संचालन है।
डैन बेहार्ड

इस विधि से किसी को पासवर्ड देखने से नहीं रोका जा सकेगा यदि वह डीकॉपीक की तरह डिकंपाइलर का उपयोग करता है? क्या इस मामले में तार छिपाने का एक तरीका है?
M.Parent

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


5

कोई फैंसी लाइनक नहीं, हाथ से सभी वर्णों को नहीं जोड़ना, सिर्फ सादा और सरल:

var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);

यहां तक ​​कि
कट्टर

यहाँ एक लाइनर है:var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
bigworld12

4

मैं स्पेंस (+1) से सहमत हूं, लेकिन यदि आप इसे सीखने या परीक्षण के लिए प्रस्तावित कर रहे हैं, तो आप स्ट्रिंग में एक फोरचेक का उपयोग कर सकते हैं, प्रत्येक चार्ट को एपेंडचेयर विधि का उपयोग करके सेक्यूरस्ट्रिंग में जोड़ सकते हैं।


3

मैं सिर्फ यह कहते हुए सभी लोगों को इंगित करना चाहता हूं कि "यह बात नहीं है SecureString", कि यह सवाल पूछने वाले कई लोग एक आवेदन में हो सकते हैं, जहां भी, किसी भी कारण से, उचित या नहीं, वे विशेष रूप से चिंतित नहीं हैं पासवर्ड की एक अस्थायी प्रतिलिपि जीसी-सक्षम स्ट्रिंग के रूप में हीप पर बैठती है, लेकिन उन्हें एक एपीआई का उपयोग करना होगा जो आपको चाहिए। लेकिन शायद लायक यह सुनिश्चित करना है कि आवेदन पत्र वास्तव में है कि - यह एक छोटी सी असुविधा है कर की जरूरत उपयोग करने के लिए लेखकों लुभाना नहीं है या बिचौलियों। :-) केवलSecureString वस्तुओं को स्वीकार करता है। तो, आपके पास एक ऐप है जहाँ आप परवाह नहीं करते हैंक्या पासवर्ड ढेर पर है, शायद यह केवल आंतरिक उपयोग है और पासवर्ड केवल इसलिए है क्योंकि यह अंतर्निहित नेटवर्क प्रोटोकॉल द्वारा आवश्यक है, और आपको पता चलता है कि पासवर्ड को संग्रहीत करने वाले स्ट्रिंग का उपयोग नहीं किया जा सकता है, उदाहरण के लिए रिमोट पॉवरशेल सेट करना रनस्पेस - लेकिन कोई भी आसान, सीधा-आगे-एक-लाइनर नहीं हैSecureStringSecureStringSystem.StringSystem.Char[]


2

यदि आप एक के रूपांतरण सेक करना चाहते हैं तो stringएक के लिए SecureStringएक में LINQबयान इस प्रकार है कि आप इसे व्यक्त कर सकते हैं:

var plain  = "The quick brown fox jumps over the lazy dog";
var secure = plain
             .ToCharArray()
             .Aggregate( new SecureString()
                       , (s, c) => { s.AppendChar(c); return s; }
                       , (s)    => { s.MakeReadOnly(); return s; }
                       );

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

यह कहा जा रहा है कि उपरोक्त कथन क्या पेशकश कर सकता है, साथ में सृजन SecureString, डेटा के साथ इसकी शुरुआत और अंत में इसे संशोधन से लॉक कर रहा है।


2

निम्नलिखित 2 एक्सटेंशन को चाल करना चाहिए:

  1. एक charसरणी के लिए

    public static SecureString ToSecureString(this char[] _self)
    {
        SecureString knox = new SecureString();
        foreach (char c in _self)
        {
            knox.AppendChar(c);
        }
        return knox;
    }
  2. और किसके लिए string

    public static SecureString ToSecureString(this string _self)
    {
        SecureString knox = new SecureString();
        char[] chars = _self.ToCharArray();
        foreach (char c in chars)
        {
            knox.AppendChar(c);
        }
        return knox;
    }

सिफारिश के लिए जॉन डग्ग को धन्यवाद AppendChar


0

आप इस सरल स्क्रिप्ट का उपयोग कर सकते हैं

private SecureString SecureStringConverter(string pass)
{
    SecureString ret = new SecureString();

    foreach (char chr in pass.ToCharArray())
        ret.AppendChar(chr);

    return ret;
}

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