जवाबों:
तुम नहीं। 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');
12345
... यह उसी तरह की चीज है जैसे एक बेवकूफ अपने सामान पर है!"
*****
AppendChar
रन टाइम तक निष्पादित नहीं होता है, इसलिए उन पात्रों को अभी भी आईएल से पढ़ा जा सकता है, सही है? हो सकता है कि कुछ संकलन-समय की आपत्ति के रूप में अच्छी तरह से मदद मिलेगी ... यानी, यदि आप हार्ड-कोडिंग पासवर्ड हैं।
के बीच SecureString
और कन्वर्ट करने का एक और तरीका भी है String
।
1. String to SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString स्ट्रिंग करने के लिए
string theString = new NetworkCredential("", theSecureString).Password;
यहाँ लिंक है
SecureString
आपके कोड का उपयोग करने का कोई मतलब नहीं है यदि आपका कोड string
उस मूल्य के साथ ऑब्जेक्ट बनाता है जिसे आप सुरक्षित करना चाहते हैं। का लक्ष्य SecureString
प्रबंधित मेमोरी में स्ट्रिंग होने से बचना है, इसलिए उस मेमोरी की जांच करने वाला एक हमलावर उस मूल्य को देख सकता है जिसे आप छिपाना चाहते हैं। चूंकि जिस NetworkCredential
कंस्ट्रक्टर को आप कॉल कर रहे हैं, उसके लिए एक स्ट्रिंग की आवश्यकता होती है, यह जाने का तरीका नहीं है ... निश्चित रूप से, आपका कोड एक सिक्योरस्ट्रिंग से कन्वर्ट करने के लिए एक आसान तरीका है, लेकिन इसका उपयोग करने से आपका कोड एक सरलstring
SecureString
कुछ पुस्तकालयों के साथ काम करते समय उपयोग करने की आवश्यकता है । और यहाँ ईमानदार होने देता है, अगर कोई आपके एप्लिकेशन की मेमोरी को सक्रिय रूप से स्कैन कर रहा है तो आप पहले ही खो चुके हैं। भले ही आपने SecureString का सही तरीके से उपयोग किया हो, जो मैंने कभी नहीं देखा है, निकालने के लिए अन्य मूल्यवान डेटा होने जा रहा है।
नीचे विधि स्ट्रिंग को सुरक्षित स्ट्रिंग में बदलने में मदद करती है
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;
}
यहाँ एक सस्ता linq चाल है।
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
मैं इसे वहाँ फेंक दूंगा। क्यों?
आप तार को सुरक्षित करने के लिए अपने सभी तारों को बदल नहीं सकते हैं और अचानक आपका आवेदन "सुरक्षित" है। सुरक्षित स्ट्रिंग को स्ट्रिंग को यथासंभव लंबे समय तक एन्क्रिप्ट रखने के लिए डिज़ाइन किया गया है, और केवल एक छोटी सी अवधि के लिए डिक्रिप्ट किया गया है, एक ऑपरेशन के बाद मेमोरी को पोंछते हुए।
मुझे यह कहते हुए खतरा होगा कि आपके एप्लिकेशन स्ट्रिंग्स को सुरक्षित करने की चिंता करने से पहले आपके पास कुछ डिज़ाइन स्तर के मुद्दे हो सकते हैं। हमें आपकी क्या करने की कोशिश के बारे में कुछ और जानकारी दें और हम बेहतर मदद करने में सक्षम हो सकते हैं।
कोई फैंसी लाइनक नहीं, हाथ से सभी वर्णों को नहीं जोड़ना, सिर्फ सादा और सरल:
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);
मैं सिर्फ यह कहते हुए सभी लोगों को इंगित करना चाहता हूं कि "यह बात नहीं है SecureString
", कि यह सवाल पूछने वाले कई लोग एक आवेदन में हो सकते हैं, जहां भी, किसी भी कारण से, उचित या नहीं, वे विशेष रूप से चिंतित नहीं हैं पासवर्ड की एक अस्थायी प्रतिलिपि जीसी-सक्षम स्ट्रिंग के रूप में हीप पर बैठती है, लेकिन उन्हें एक एपीआई का उपयोग करना होगा जो आपको चाहिए। लेकिन शायद लायक यह सुनिश्चित करना है कि आवेदन पत्र वास्तव में है कि - यह एक छोटी सी असुविधा है कर की जरूरत उपयोग करने के लिए लेखकों लुभाना नहीं है या बिचौलियों। :-) केवलSecureString
वस्तुओं को स्वीकार करता है। तो, आपके पास एक ऐप है जहाँ आप परवाह नहीं करते हैंक्या पासवर्ड ढेर पर है, शायद यह केवल आंतरिक उपयोग है और पासवर्ड केवल इसलिए है क्योंकि यह अंतर्निहित नेटवर्क प्रोटोकॉल द्वारा आवश्यक है, और आपको पता चलता है कि पासवर्ड को संग्रहीत करने वाले स्ट्रिंग का उपयोग नहीं किया जा सकता है, उदाहरण के लिए रिमोट पॉवरशेल सेट करना रनस्पेस - लेकिन कोई भी आसान, सीधा-आगे-एक-लाइनर नहीं हैSecureString
SecureString
System.String
System.Char[]
यदि आप एक के रूपांतरण सेक करना चाहते हैं तो 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 एक्सटेंशन को चाल करना चाहिए:
एक char
सरणी के लिए
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
और किसके लिए 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
।
आप इस सरल स्क्रिप्ट का उपयोग कर सकते हैं
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
Array.Clear