2010-07-22 8 views
5

मैं सिस्टम.Security.SecureString क्लास को संसाधित होने पर स्मृति में क्रेडिट कार्ड नंबर रखने के लिए देख रहा हूं। क्या किसी ने क्रेडिट कार्ड नंबर रखने के लिए सिक्योरस्टिंग क्लास का उपयोग किया है, या अधिकांश सामान्य सिस्टम का उपयोग करते हैं। स्ट्रिंग क्लास?क्रेडिट कार्ड नंबरों के लिए सिक्योरस्ट्रिंग का उपयोग करें

+1

बेहतर प्रश्न: System.SecureString वास्तव में इस एप्लिकेशन के लिए पर्याप्त सुरक्षित है? –

+0

@ जेएसबीएंग्स: ठीक है, जो मैं समझता हूं, सिस्टम से सुरक्षित है। निश्चित रूप से इस उद्देश्य के लिए है। हालांकि, क्योंकि .NET ढांचे के भीतर कई अन्य एपीआई अभी भी सामान्य सिस्टम का उपयोग करते हैं। स्टिंग क्लास, पूरे एप्लिकेशन में स्ट्रिंग की सुरक्षा को बनाए रखना मुश्किल है। मुझे लगता है कि मेरा प्रश्न वास्तव में है: क्या स्मृति में एंड-टू-एंड से डेटा को आजमाने और सुरक्षित करने के प्रयास के लायक हैं, या एपीआई में बहुत सारे अंतराल हैं जहां यह समर्थित नहीं है कि सच्ची सुरक्षा वैसे भी हासिल नहीं की जाएगी ? – NYSystemsAnalyst

उत्तर

9

एक PCI-DSS दृष्टिकोण से, वहाँ केवल स्मृति में संग्रहीत कार्ड नंबर की रक्षा के लिए कोई आवश्यकता नहीं है।

पीसीआई केवल डिस्क कार्ड पर बने कार्ड नंबरों को बताता है, या किसी नेटवर्क पर प्रेषित होना चाहिए एन्क्रिप्ट किया जाना चाहिए। इस मुद्दे के लिए यह एक सामान्य ज्ञान दृष्टिकोण है। SecureString का उपयोग करना सुनिश्चित करेगा कि स्ट्रिंग डिस्क पर कभी कैश नहीं की जाती है, लेकिन जैसा कि आप कहते हैं - इसका उपयोग करने में परेशानी होती है। इस पोस्ट में कुछ अच्छे सुझाव हैं हालांकि: https://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes#123141

सिद्धांत रूप में, स्मृति की सुरक्षा की तरह यह शक्ति को जोड़ देगा, लेकिन सच में यदि किसी बुरे व्यक्ति को रैम तक पहुंच है, तो वैसे भी इसका बहुत अधिक खेल है।

+0

पीसीआई आवश्यकताएं यहां उत्तर देने के लिए सही स्थान हैं ^^ – cRichter

1

मैं अन्य सामान (क्रेडिट कार्ड नहीं) के लिए सिक्योरस्ट्रिंग का उपयोग करता हूं, अगर इसे विस्तारित समय के लिए स्मृति में कैश किया जा रहा है।

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

मैं विस्तार तरीकों उनके साथ काम करने में थोड़ा कम करने के लिए की एक जोड़ी बना चुके हैं:

public static unsafe SecureString Secure(this string source) 
    { 
     if (source == null) 
      return null; 
     if (source.Length == 0) 
      return new SecureString(); 

     fixed (char* pChars = source.ToCharArray()) 
     { 
      SecureString secured = new SecureString(pChars, source.Length); 
      return secured; 
     } 
    } 


    public static string Unsecure(this SecureString source) 
    { 
     if (source == null) 
      return null; 

     IntPtr bstr = Marshal.SecureStringToBSTR(source); 
     try 
     { 
      return Marshal.PtrToStringUni(bstr); 
     } 
     finally 
     { 
      Marshal.ZeroFreeBSTR(bstr); 
     } 
    } 
+3

यह उद्देश्य को हरा देता है। जैसे ही आप सिस्टम से बदलते हैं। स्ट्रिंग, यह अब सुरक्षित नहीं है। –

+0

@ हंस - मेरा मानना ​​है कि मैंने अपनी प्रतिक्रिया के दूसरे अनुच्छेद में कमी को संबोधित किया। – Toby

2

2010 से पहले से स्वीकार किए जाते हैं जवाब समय पर सही हो सकता है, लेकिन PCI DSS 3.0 खंड 6.5, जिसमें कहा गया है की कृपया ध्यान रखें:

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

अंत में यह उद्योग सर्वोत्तम प्रथाओं का पालन करने के बारे में है।

हाल के वर्षों में उच्च प्रोफ़ाइल उल्लंघनों को देखते हुए, जहां मैलवेयर, हमलावर इत्यादि द्वारा संवेदनशील डेटा (क्रेडिट कार्ड जानकारी सहित) को कैप्चर किया जाता है, स्मृति को स्क्रैप करने पर संवेदनशील जानकारी को सुरक्षित रखने पर अधिक ध्यान दिया जा रहा है।

जहां संभव हो सिक्योरस्ट्रिंग का उपयोग करें।

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

यदि क्रेडिट कार्ड नंबर पूरी तरह से एक Winform ऐप के भीतर कैप्चर कर रहा है, तो कार्ड नंबर को स्मृति में सुरक्षित रखना काफी कामयाब है।

एएसपी.NET वेब ऐप के साथ, हालांकि, मुझे यकीन नहीं है ... मैंने कोशिश नहीं की है, लेकिन general consensus पर ऐसा लगता है कि यह इसके लायक नहीं है। इसके अतिरिक्त, MSDN विशेष रूप से एएसपी.NET ऐप्स का उल्लेख करते हुए कहते हैं:

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

शायद आप अपनी परियोजना के साथ कर चुके हैं, लेकिन उम्मीद है कि यह दूसरों की सहायता करेगा।

0

सुरक्षितस्टिंग का उपयोग न करें। पीजी इसे कम कर रहा है। वीडियो देखें और वे इसके साथ कई सुरक्षा समस्याओं की रूपरेखा तैयार करते हैं। https://github.com/dotnet/apireviews/tree/master/2015-07-14-securestring