दिलचस्प पोस्ट
100 से अधिक डिवाइसों में निजी कार्यक्रम को कैसे वितरित करें? फ़ंक्शन / विधि के लिए मुझे 'इनलाइन' कीवर्ड लिखना चाहिए? संयोजन: नहीं सीएसएस में चयनकर्ता व्यवस्थापक विशेषाधिकारों के साथ किसी प्रक्रिया से प्रशासक विशेषाधिकारों के बिना नई प्रक्रिया कैसे आरंभ करें? नक्शे के सी + + नक्शे के माध्यम से कैसे लूप करें? जावा वर्ग को तुलनीय क्यों लागू करना चाहिए? आपकी पसंदीदा विज़ुअल स्टूडियो ऐड-इन / सेटिंग क्या है? PHP से कई कार्यपत्रकों के साथ एक एक्सेल दस्तावेज़ कैसे उत्पन्न करें? यदि कोई सरणी में एक स्ट्रिंग शामिल है, तो कैसे पता करें पायथन में यादृच्छिक संख्या को दोहराते हुए उत्पन्न करना बाश में, मैं कैसे जांच सकता हूँ अगर कोई स्ट्रिंग कुछ मान से शुरू होती है? यूनिकोड एन्कोड त्रुटि: 'एस्सीआई' कोडेक स्थिति 0-5 में वर्णों को एन्कोड नहीं कर सकता है: क्रमिक नहीं श्रेणी में (128) कैसे सिम्युलेटर में परीक्षण आईएडी बैनर प्रदर्शित करने के लिए .NET में उपयोग के बाद ऑब्जेक्ट्स रिक्त / कुछ भी नहीं सेट करना गैर आभासी विधियों को नकल कैसे करें?

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

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

मैं एक साधारण सिस्टम को कैसे रूपांतरित कर सकता हूँ। सुरक्षा। System.String को सुरक्षित करना?

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

मुझे मार्शल के बारे में पता है। सटीक स्ट्रिंग टॉबट्र, लेकिन मुझे नहीं पता कि उस बिल को कैसे लें और एक सिस्टम बनाएं.इससे बाहर की तरफ।

उन लोगों के लिए जो जानना चाहेंगे कि मैं ऐसा क्यों करना चाहता हूं, ठीक है, मैं उपयोगकर्ता से एक पासवर्ड ले रहा हूं और इसे एक वेब साइट पर लॉग ऑन करने के लिए एक HTML फार्म POST के रूप में सबमिट कर रहा हूं। इसलिए … यह वास्तव में प्रबंधित, अनएन्क्रिप्टेड बफ़र्स के साथ किया जाना चाहिए। यदि मैं अप्रबंधित, अनएन्क्रिप्टेड बफ़र तक पहुंच प्राप्त कर सकता हूं तो मुझे लगता है कि मैं नेटवर्क स्ट्रीम पर बाइट-बाय-बाइट स्ट्रीम लिख सकता हूं और आशा करता हूं कि पासवर्ड को पूरे तरीके से सुरक्षित रखता है। मैं इन परिस्थितियों में से कम से कम एक उत्तर के लिए उम्मीद कर रहा हूं

Solutions Collecting From Web of "कैसे System.String करने के लिए SecureString कन्वर्ट करने के लिए?"

System.Runtime.InteropServices.Marshal उपयोग करें। समय। System.Runtime.InteropServices.MarshalSystem.Runtime.InteropServices.Marshal वर्ग:

 String SecureStringToString(SecureString value) { IntPtr valuePtr = IntPtr.Zero; try { valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value); return Marshal.PtrToStringUni(valuePtr); } finally { Marshal.ZeroFreeGlobalAllocUnicode(valuePtr); } } 

यदि आप एक प्रबंधित स्ट्रिंग ऑब्जेक्ट बनाने से बचना चाहते हैं, तो आप Marshal.ReadInt16(IntPtr, Int32) का उपयोग करके कच्चे डेटा तक पहुंच सकते हैं:

 void HandleSecureString(SecureString value) { IntPtr valuePtr = IntPtr.Zero; try { valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value); for (int i=0; i < value.Length; i++) { short unicodeChar = Marshal.ReadInt16(valuePtr, i*2); // handle unicodeChar } } finally { Marshal.ZeroFreeGlobalAllocUnicode(valuePtr); } } 

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

यदि आप एक-लाइनर चाहते हैं, तो यह प्रयास करें: (केवल नेट 4 और ऊपर)

 string password = new System.Net.NetworkCredential(string.Empty, securePassword).Password; 

जहां सुरक्षित पासवर्ड एक सिक्योरस्ट्रिंग है

डैंग। सही पोस्ट करने के बाद मुझे इस लेख में गहरा जवाब मिला। लेकिन अगर कोई जानता है कि IntPtr unmanaged, unencrypted बफ़र का उपयोग कैसे करें कि यह विधि एक बार में एक बाइट को उजागर करती है, ताकि मुझे अपनी सुरक्षा को उच्च रखने के लिए इसके बाहर एक प्रबंधित स्ट्रिंग ऑब्जेक्ट बनाने की आवश्यकता नहीं है, कृपया एक उत्तर जोड़ें। 🙂

 static String SecureStringToString(SecureString value) { IntPtr bstr = Marshal.SecureStringToBSTR(value); try { return Marshal.PtrToStringBSTR(bstr); } finally { Marshal.FreeBSTR(bstr); } } 

मुझे लगता है कि यह SecureString निर्भर कार्यों के लिए सबसे अच्छा होगा ताकि स्मृति पर डिक्रिप्टेड स्ट्रिंग पर बेहतर नियंत्रण के लिए एक अनाम फ़ंक्शन में उनके निर्भर तर्क को SecureString किया जा सके (एक बार पिन किया हुआ हो)।

इस स्निपेट में सिक्योरसटिंग को डिक्रिप्ट करने के लिए कार्यान्वयन निम्न होगा:

  1. मेमोरी में स्ट्रिंग पिन करें (जो आप करना चाहते हैं, लेकिन यहां अधिकतर उत्तर से गायब दिखता है)।
  2. फेंक / एक्शन प्रतिनिधि के लिए अपना संदर्भ पास करें
  3. इसे स्मृति से साफ़ करें और finally ब्लॉक में जीसी रिलीज करें।

यह स्पष्ट रूप से "मानकीकरण" करना और कॉलर्स बनाम बनाते हैं जो कम वांछनीय विकल्पों पर निर्भर करता है:

  • एक स्ट्रिंग से डिक्रिप्टेड स्ट्रिंग रिटर्निंग string DecryptSecureString(...) सहायक फ़ंक्शन।
  • यह कोड जहां भी आवश्यक है, उसे डुप्लिकेट करना।

ध्यान दें, आपके पास दो विकल्प हैं:

  1. static T DecryptSecureString<T> जो आपको कॉलर से DecryptSecureStringWithFunc प्रतिनिधि के परिणाम तक पहुंचने की अनुमति देता है (जैसा कि DecryptSecureStringWithFunc परीक्षण विधि में दिखाया गया है)।
  2. static void DecryptSecureString बस एक "शून्य" संस्करण है जो ऐसे मामलों में एक Action प्रतिनिधि को कार्यरत करता है जहां आप वास्तव में नहीं चाहते / कुछ भी वापस करने की आवश्यकता नहीं है (जैसा कि DecryptSecureStringWithAction टेस्ट विधि में दिखाया गया है)।

StringsTest क्लास में दोनों के लिए उदाहरण उपयोग में शामिल किया जा सकता है।

Strings.cs

 using System; using System.Runtime.InteropServices; using System.Security; namespace SecurityUtils { public partial class Strings { /// <summary> /// Passes decrypted password String pinned in memory to Func delegate scrubbed on return. /// </summary> /// <typeparam name="T">Generic type returned by Func delegate</typeparam> /// <param name="action">Func delegate which will receive the decrypted password pinned in memory as a String object</param> /// <returns>Result of Func delegate</returns> public static T DecryptSecureString<T>(SecureString secureString, Func<string, T> action) { var insecureStringPointer = IntPtr.Zero; var insecureString = String.Empty; var gcHandler = GCHandle.Alloc(insecureString, GCHandleType.Pinned); try { insecureStringPointer = Marshal.SecureStringToGlobalAllocUnicode(secureString); insecureString = Marshal.PtrToStringUni(insecureStringPointer); return action(insecureString); } finally { insecureString = null; gcHandler.Free(); Marshal.ZeroFreeGlobalAllocUnicode(insecureStringPointer); } } /// <summary> /// Runs DecryptSecureString with support for Action to leverage void return type /// </summary> /// <param name="secureString"></param> /// <param name="action"></param> public static void DecryptSecureString(SecureString secureString, Action<string> action) { DecryptSecureString<int>(secureString, (s) => { action(s); return 0; }); } } } 

StringsTest.cs

 using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Security; namespace SecurityUtils.Test { [TestClass] public class StringsTest { [TestMethod] public void DecryptSecureStringWithFunc() { // Arrange var secureString = new SecureString(); foreach (var c in "UserPassword123".ToCharArray()) secureString.AppendChar(c); secureString.MakeReadOnly(); // Act var result = Strings.DecryptSecureString<bool>(secureString, (password) => { return password.Equals("UserPassword123"); }); // Assert Assert.IsTrue(result); } [TestMethod] public void DecryptSecureStringWithAction() { // Arrange var secureString = new SecureString(); foreach (var c in "UserPassword123".ToCharArray()) secureString.AppendChar(c); secureString.MakeReadOnly(); // Act var result = false; Strings.DecryptSecureString(secureString, (password) => { result = password.Equals("UserPassword123"); }); // Assert Assert.IsTrue(result); } } } 

जाहिर है, यह इस कार्य के दुरुपयोग को निम्नलिखित तरीके से नहीं रोकता है, इसलिए सावधान रहें कि ऐसा न करें:

 [TestMethod] public void DecryptSecureStringWithAction() { // Arrange var secureString = new SecureString(); foreach (var c in "UserPassword123".ToCharArray()) secureString.AppendChar(c); secureString.MakeReadOnly(); // Act string copyPassword = null; Strings.DecryptSecureString(secureString, (password) => { copyPassword = password; // Please don't do this! }); // Assert Assert.IsNull(copyPassword); // Fails } 

हैप्पी कोडिंग!

मेरी राय में, इस तरीके को हल करने के लिए विस्तार विधियां सबसे आसान तरीका है।

मैंने स्टीव को सीओ के उत्कृष्ट उत्तर में लिया और इसे एक विस्तार वर्ग में रखा, साथ में एक दूसरी विधि के साथ मैं दूसरी दिशा (स्ट्रिंग -> सुरक्षित स्ट्रिंग) का समर्थन करने के लिए जोड़ा, ताकि आप एक सुरक्षित स्ट्रिंग बना सकें और उसे इसमें बदल सकें बाद में एक सामान्य स्ट्रिंग:

 public static class Extensions { // convert a secure string into a normal plain text string public static String ToPlainString(this System.Security.SecureString secureStr) { String plainStr=new System.Net.NetworkCredential(string.Empty, secureStr).Password; return plainStr; } // convert a plain text string into a secure string public static System.Security.SecureString ToSecureString(this String plainStr) { var secStr = new System.Security.SecureString(); secStr.Clear(); foreach (char c in plainStr.ToCharArray()) { secStr.AppendChar(c); } return secStr; } } 

इसके साथ, अब आप बस अपनी स्ट्रिंग्स को पीछे और पीछे की तरह बदल सकते हैं:

 // create a secure string System.Security.SecureString securePassword = "MyCleverPwd123".ToSecureString(); // convert it back to plain text String plainPassword = securePassword.ToPlainString(); // convert back to normal string 

लेकिन ध्यान रखें कि डीकोडिंग पद्धति का उपयोग केवल परीक्षण के लिए किया जाना चाहिए।

 // using so that Marshal doesn't have to be qualified using System.Runtime.InteropServices; //using for SecureString using System.Security; public string DecodeSecureString (SecureString Convert) { //convert to IntPtr using Marshal IntPtr cvttmpst = Marshal.SecureStringToBSTR(Convert); //convert to string using Marshal string cvtPlainPassword = Marshal.PtrToStringAuto(cvttmpst); //return the now plain string return cvtPlainPassword; } 

यदि आप किसी string बजाय string का उपयोग करते हैं, तो जब आप किया जाए तो आप वास्तविक मान को अधिलेखित कर सकते हैं। इस तरह से पासवर्ड स्मृति में चारों ओर लटका नहीं रहेगा जब तक कि कचरा संग्रह इसे ऊपर उठाए न जाए।

 StringBuilder.Append(plainTextPassword); StringBuilder.Clear(); // overwrite with reasonably random characters StringBuilder.Append(New Guid().ToString());