2013-12-08 11 views
10

ठीक है, मैं एक पासवर्ड हैश करने के लिए चाहते थे, और मैं कैसे ASP.net पहचान Microsoft.AspNet.Identity.Crypto क्लास में करता है पर एक नज़र था, और मैं इस समारोह साथ आया था (जो 2 पासवर्ड हैश तुलना करने के लिए प्रयोग किया जाता है):MethodImpl (NoOptimization), यह क्या करता है? और क्या यह वास्तव में निराशाजनक है?

[MethodImpl(MethodImplOptions.NoOptimization)] 
private static bool ByteArraysEqual(byte[] a, byte[] b) 
{ 
    if (object.ReferenceEquals(a, b)) 
    { 
     return true; 
    } 
    if (((a == null) || (b == null)) || (a.Length != b.Length)) 
    { 
     return false; 
    } 
    bool flag = true; 
    for (int i = 0; i < a.Length; i++) 
    { 
     flag &= a[i] == b[i]; 
    } 
    return flag; 
} 

यह वह जगह है परावर्तक उत्पादन से एक सीधा कॉपी ...

अब मेरे सवाल है, है क्या NoOptimization के लिए अच्छा गुण है, और वह वहाँ क्यों होना चाहिए (क्या होगा अगर मैं इसे हटाने के)? मेरे लिए, यह for -loop तक डिफ़ॉल्ट बराबर() कार्यान्वयन की तरह दिखता है।

मैं आईएल पर एक नजर है की कोशिश की लेकिन यह मेरे लिए सब बकवास है: एक "स्मार्ट" संकलक कुछ है कि false रिटर्न जैसे ही एक बेमेल पाया गया था, यह हो सकता है कि में समारोह चालू किया है तो/

उत्तर

16

इस फ़ंक्शन का उपयोग करके "टाइमिंग अटैक" के लिए कमजोर कोड बनाते हैं --- एक हमलावर कल्पना कर सकता है कि स्ट्रिंग में पहला मिलान किस प्रकार काम पर लौटने के लिए था।

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

+1

इसके लिए धन्यवाद, मैं अक्सर प्रदर्शन कारणों के लिए समयपूर्व लूप समाप्ति का उपयोग करता हूं, लेकिन मैंने कभी भी हमले के बारे में सोचा नहीं! चीयर्स! – Nefarion

+0

इस बहुत ही रोचक जवाब के लिए धन्यवाद। यह सोच रहा था कि मूल्य गलत होने पर रोकने के लिए लूप को अनुकूलित क्यों नहीं किया गया था। बहुत बढ़िया जवाब! –

2

कुछ मामलों में JIT कम्पाइलर या तो

  1. अपने अनुकूलन की प्रक्रिया में कोई त्रुटि है या क्योंकि इसमें कुछ अप्रत्याशित तरीके से कोड का अनुकूलन
  2. कोड अनुकूलन एक त्रुटि का उत्पादन हो सकता हो सकता है।

मुझे ऐसी परिस्थितियों का सामना करना पड़ा है जहां एक अनुकूलित विधि गैर अनुकूलित से अलग तरीके से व्यवहार की जाती है। (मुझे विश्वास है कि यह ऊपर से मामला ए था)।

[MethodImpl(MethodImplOptions.NoOptimization)] 

समस्या को हल करने के लिए बस एक विधि को घोषित करना।

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