2009-08-10 14 views
5

मैं एक वेब सेवा है कि मुझे आवश्यकता है कस्टम सत्र और यादृच्छिक पासवर्ड आदिस्थिर RNGCryptoServiceProvider - क्या यह सत्र और यादृच्छिक पासवर्ड उत्पन्न करने के लिए सुरक्षित और थ्रेडसेफ है?

मैं अगर एक स्थिर वर्ग बनाने और पूरी वेबसाइट के लिए एक अच्छा विचार है 1 स्थिर RNGCryptoServiceProvider उदाहरण उपयोग कर रहा है सोच रहा था उत्पन्न करने के लिए निर्माण कर रहा हूँ? 1. क्या यह एकाधिक http अनुरोध उदाहरणों से थ्रेडसेफ है? 2. क्या यह सुरक्षित है? अगर मैं किसी को थोड़े समय में कई सत्र उत्पन्न करने की इजाजत देता हूं, तो क्या आरएनजी की स्थिति को समझना और अगले सत्रों की भविष्यवाणी करना संभव होगा?

मेरी सेवा में अन्य उपयोगकर्ताओं को पता है कि कोई व्यक्ति साइन इन करता है, और मूल रूप से एक सत्र उत्पन्न करने के लिए लॉगिन करते समय मैंने मूल रूप से एक नया आरएनजी क्रिप्टो सेवा सेवा प्रदाता बनाया, लेकिन मेरी चिंता यह है कि यदि वर्तमान डेटाटाइम पर आधारित है, तो क्या कोई सैद्धांतिक रूप से केवल किसी अन्य उपयोगकर्ता के सत्र को "अनुमान लगाने" के लिए कुछ हज़ार सत्रों में जाने के लिए यदि उन्हें पता था कि वे किस दूसरे में लॉग इन करते हैं?

public static class random 
{ 
    private static RandomNumberGenerator _rng; 
    protected static RandomNumberGenerator rng 
    { 
     get 
     { 
      if (_rng == null) _rng = new RNGCryptoServiceProvider(); 
      return _rng; 
     } 
    } 
    public static byte[] Bytes(int number) 
    { 
     var value = new byte[number]; 
     rng.GetBytes(value); 
     return value; 
    } 
    public static byte Byte { get { return Bytes(1)[0]; } } 
    public static int Int { get { return BitConverter.ToInt32(Bytes(4), 0); } } 
    public static long Long { get { return BitConverter.ToInt64(Bytes(8), 0); } } 
} 

उत्तर

5

1) यदि यह क्रिप्टोग्राफी द्वारा सुरक्षित है, जो यह माना जाता रहा है, तो अनुमान लगा की इस तरह संभव नहीं होना चाहिए।

2) एक तरफ ध्यान दें पर, मैं स्थिर संपत्ति में JIT इन्स्टेन्शियशन निकालने की सलाह annd बजाय निम्न कार्य:

protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider(); 
8

CLR में सीएसपी आधारित RNG सिर्फ एक आवरण के आसपास CryptGenRandom है। सभी सीएसपी कार्यों की तरह, वे HCRYPTPROV संदर्भ संभाल के आसपास काम करते हैं। अगर मुझे सही ढंग से याद है कि 'संदर्भ' दर्ज करते समय प्रदाता करता है तो एक महत्वपूर्ण खंड प्राप्त करना है जो 'संदर्भ' की रक्षा करता है। इसलिए जब फ़ंक्शन थ्रेड में सबसे अधिक स्थिर हो, तो आपको वास्तव में विवाद से बचने के लिए प्रत्येक थ्रेड के लिए एक अलग उपयोग करना चाहिए।

अद्यतन

इस MSDN Magazine के अनुसार

CLR भविष्य कार्यान्वयन में एक ढेर एक के बजाय एक उदाहरण बफर का उपयोग कर सकते, RNGCryptoServiceProvider धागे भर में असुरक्षित बना रही है:

ध्यान दें कि, के रूप में वर्तमान में में .NET Framework 2.0, पैरामीटर रहित कन्स्ट्रक्टर में लागू किया गया RNGCryptoServiceProvider thr बनाता है ईद-सुरक्षित उदाहरण जैसे, हम हमारे निजी सदस्य बनाया जा सकता था बजाय एक निजी स्थिर सदस्य किया गया है, और ऐसा करने में करने की जरूरत नहीं CryptoRandom के प्रत्येक उदाहरण के लिए एक नया RNGCryptoServiceProvider उदाहरण पैदा करते हैं। हालांकि, यह थ्रेड-सुरक्षा वर्तमान में दस्तावेज नहीं है और न ही यह किसी भी तरह से वर्ग के अनुबंध या इंटरफ़ेस में बेक किया गया है। यह देखते हुए, हमारे पास हमारे कार्यान्वयन के लिए पर निर्भर नहीं है।

ध्यान दें कि यह उपयोग मूल API थ्रेड सुरक्षा से संबंधित नहीं है, बफर समस्या एक सीएलआर रैपर समस्या है। इसके अलावा, यदि आप RNGCryptoServiceProvider कन्स्ट्रक्टर का उपयोग करते हैं जो बाइट [] लेता है, तो यह सुनिश्चित करने के लिए असुरक्षित है

+0

+1। –

+3

'RNGCryptoServiceProvider' वर्ग .NET 3.5 के बाद से थ्रेड सुरक्षित है: https://msdn.microsoft.com/en-us/library/5f45t420%28v=vs.90%29.aspx देखें (लेकिन सिल्वरलाइट में नहीं)। –

-1
[ThreadStatic] protected static readonly RandomNumberGenerator _rng = new RNGCryptoServiceProvider(); 

ThreadStaticAttribute यह सुनिश्चित करना चाहिए कि प्रत्येक धागा स्वयं ही प्राप्त हो। महत्वपूर्ण विवरण के लिए

+1

आपके पास 'थ्रेडस्टैटिक' ऑब्जेक्ट्स के लिए प्रारंभकर्ता नहीं हो सकते हैं, इससे समस्याएं पैदा हो जाएंगी: https://confluence.jetbrains.com/display/ReSharper/%27 थ्रेडस्टैटएट्रिब्यूट%27+usage –

संबंधित मुद्दे