2017-11-30 61 views
9

https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Helpers/Crypto.cs#L159यह लूप जानबूझकर अनुकूलित क्यों नहीं किया गया है?

// Compares two byte arrays for equality. The method is specifically written so that the loop is not optimized. 
[MethodImpl(MethodImplOptions.NoOptimization)] 
private static bool ByteArraysEqual(byte[] a, byte[] b) 
{ 
    if (ReferenceEquals(a, b)) 
    { 
     return true; 
    } 

    if (a == null || b == null || a.Length != b.Length) 
    { 
     return false; 
    } 

    bool areSame = true; 
    for (int i = 0; i < a.Length; i++) 
    { 
     areSame &= (a[i] == b[i]); 
    } 
    return areSame; 
} 
+5

https://security.stackexchange.com/questions/160808/why-should-memcmp-not-be-used-to-compare-security-critical-data – Ryan

उत्तर

7

यह आदेश timing attacks की संभावना रोकता करने के लिए इस तरह से लिखा है।

यदि कोड में स्पष्ट प्रारंभिक ऑप्टिमाइज़ेशन था, तो यह निष्पादित करने के लिए किए गए समय के माध्यम से तुलना के परिणाम के बारे में जानकारी "रिसाव" करेगा - बराबर सरणी की तुलना करने में अधिक समय लगेगा।

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

यह पहली नज़र में एक अप्रत्याशित विधि की तरह लगता है, लेकिन यह एक वास्तविक खतरा है - देखना this paper एक उदाहरण के लिए।

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