2009-06-12 12 views
12

मेरे पास स्थिर उपयोगिता वर्ग बनाने का उच्च-स्तरीय लक्ष्य है जो मेरे .NET अनुप्रयोग के लिए एन्क्रिप्शन को समाहित करता है। अंदर मैं ऑब्जेक्ट रचनाओं को कम करना चाहता हूं जो आवश्यक नहीं हैं।.NET एन्क्रिप्शन कक्षाओं की थ्रेड सुरक्षा?

मेरा प्रश्न है: कक्षाओं की थ्रेड-सुरक्षा क्या है जो .NET Framework के भीतर सममित एन्क्रिप्शन को लागू करती है? विशेष रूप से System.Security.Cryptography.RijndaelManaged और ICryptoTransform प्रकार उत्पन्न करता है।

उदाहरण के लिए, मेरे वर्ग निर्माता में मैं बस निम्नलिखित पंक्तियों के साथ कुछ कर सकता हूं?

static MyUtility() 
{ 
    using (RijndaelManaged rm = new RijndaelManaged()) 
    { 
     MyUtility.EncryptorTransform = rm.CreateEncryptor(MyUtility.MyKey, MyUtility.MyIV); 
     MyUtility.DecryptorTransform = rm.CreateDecryptor(MyUtility.MyKey, MyUtility.MyIV); 
    } 
} 

साइड-कदम का मुद्दा यह कुंजी के लिए सुरक्षित और चतुर्थ इस वर्ग भीतर मौजूद हैं, इस उदाहरण ब्लॉक अन्य प्रश्न के एक नंबर लाता है:

  1. मैं लगातार पुन: उपयोग कर सकते हैं एन्क्रिप्टर ट्रान्सफॉर्म और डिक्रिप्टर ट्रांसफॉर्म ओवर और ओवर? *.CanReuseTransform और *.CanTransformMultipleBlocks गुण "हां" का अर्थ है, लेकिन क्या कोई चेतावनी है जिसके बारे में मुझे अवगत होना चाहिए?

  2. RijndaelManaged के बाद से लागू करता IDisposable मेरी झुकाव एक using ब्लॉक खासकर जब से यह शायद बाहरी ओएस-स्तर libs में बांध के अंदर डाल दिया है। क्या इसके साथ कोई चेतावनी है क्योंकि मैं ICryptoTransform ऑब्जेक्ट्स को आसपास रख रहा हूं?

  3. अत्यधिक बहुप्रचारित वातावरण में संभावित रूप से सबसे महत्वपूर्ण सवाल, क्या मैं ICryptoTransform धागे के बीच वस्तुओं को साझा करने के साथ मुद्दों में भाग लेगा?

  4. यदि # 3 का उत्तर यह है कि यह थ्रेड-सुरक्षित नहीं है, तो क्या मैं ICryptoTransform ऑब्जेक्ट्स का उपयोग करते समय लॉकिंग से गंभीर प्रदर्शन में गिरावट का अनुभव करूंगा? (मुझे लगता है कि भार पर निर्भर करता है।)

  5. क्या यह हर बार नए RijndaelManaged को तुरंत चालू करने के लिए अधिक सक्षम होगा? या एक RijndaelManaged स्टोर करें और हर बार new RijndaelManaged().CreateEncryptor(...) उत्पन्न करें?

मुझे उम्मीद है कि वहां कोई व्यक्ति जानता है कि यह काम हुड के नीचे कैसे काम करता है या इसी तरह के कार्यान्वयन से मुद्दों के साथ अनुभव किया जाता है। मैंने पाया है कि इस तरह के कई प्रकार के प्रदर्शन और थ्रेड-संबंधित मुद्दे आम तौर पर तब तक प्रकट नहीं होते जब तक कि बड़ी मात्रा में भार न हो।

धन्यवाद!

उत्तर

14

1) हां।

2) एक आप इसे के निपटान, आप इसका इस्तेमाल नहीं कर सकते। तब तक, आप साझा कर सकते हैं/इसका इस्तेमाल (लेकिन नीचे देखें) MSDN से

3-4):।

"कोई भी सार्वजनिक स्थैतिक (विजुअल बेसिक) इस प्रकार के सदस्यों में साझा धागा सुरक्षित हैं किसी भी उदाहरण सदस्यों सुरक्षित थ्रेड होने की गारंटी नहीं कर रहे हैं। "

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

5) मैं इन्हें आवश्यकतानुसार बनाने की सलाह दूंगा, और फिर बाद में इसे अनुकूलित करने की कोशिश कर रहा हूं यदि बाद में आपको लगता है कि आपके पास प्रदर्शन समस्या है। एक नया संस्करण बनाने के प्रदर्शन के प्रभावों के बारे में चिंता न करें जब तक कि आप यह देखते हुए कि प्रोफाइलिंग के बाद यह कोई समस्या नहीं है।

+0

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

+2

सच है कि आपको समय-समय पर अनुकूलन करने में समय नहीं बिताना चाहिए, लेकिन बस यहां छोड़ना चाहते हैं कि हमारे मामले में हमने पाया कि ~ 500 छोटे एन्क्रिप्शन (सभी एक ही पासवर्ड के साथ) करने में लगभग 10 सेकंड लग गए थे जो आपदा थी। लगभग हर समय एन्क्रिप्टर बनाने में खर्च किया गया था। ICryptoTransforms का पुन: उपयोग करना स्पष्ट समाधान था। – Bernard

+0

मेरे 2 सेंट, मैंने पाया कि _not_ आईसीआरपीटी ट्रान्सफॉर्म का पुन: उपयोग करने से हमारे आवेदन का बहुत खराब प्रदर्शन हुआ। – gorillapower

3

एक एक कैश एक समवर्ती ढेर के आधार पर के साथ बस संगामिति समस्या को हल कर सकते हैं:

static ConcurrentStack<ICryptoTransform> decryptors = new ConcurrentStack<ICryptoTransform>(); 

void Encrypt() 
{ 
    // Pop decryptor from cache... 
    ICryptoTransform decryptor; 
    if (!decryptors.TryPop(out decryptor)) 
    { 
     // ... or create a new one since cache is depleted 
     AesManaged aes = new AesManaged(); 
     aes.Key = key; 
     aes.IV = iv; 
     decryptor = aes.CreateDecryptor(aes.Key, aes.IV); 
    } 

    try 
    { 
     //// use decryptor 
    } 
    finally 
    { 
     decryptors.Push(decryptor); 
    } 
}