2015-11-10 21 views
9

मेरे पास दो प्रश्न हैं जिन्हें मैं समझ नहीं पा रहा हूं। कृपया मुझे देखने में मदद करें। धन्यवाद।संदेशडिगेस्ट.इस जावा में उपयोग की जाने वाली फ़ंक्शन का उपयोग

  1. जावा में MessageDigest.isEqual समारोह का उपयोग क्या है?

  2. बताएं कि जावा एसई 6 अपडेट 17 से पहले कुछ संस्करणों में, यह एक समय पर हमले के लिए कमजोर था।

उत्तर

7

एक जावा SE 6 अद्यतन 10 कार्यान्वयन को देखते हुए, हम देखते हैं:

public static boolean isEqual(byte digesta[], byte digestb[]) { 

    if (digesta.length != digestb.length) 
     return false; 

    for (int i = 0; i < digesta.length; i++) { 
     if (digesta[i] != digestb[i]) { 
      return false; 
     } 
    } 
    return true; 
} 

जबकि ठीक बाद हम देखते हैं:

public static boolean isEqual(byte[] digesta, byte[] digestb) { 
    if (digesta.length != digestb.length) { 
     return false; 
    } 

    int result = 0; 
    // time-constant comparison 
    for (int i = 0; i < digesta.length; i++) { 
     result |= digesta[i]^digestb[i]; 
    } 
    return result == 0; 
} 

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

नए कार्यान्वयन में हमेशा एक ही चलने का समय होता है (उसी लंबाई के सरणी के लिए), क्योंकि यह पूरे सरणी पर फिर से होता है (भले ही सरणी उनके पहले बाइट में भिन्न हो)।

मैंने खोज की कि यह विधि कहां कहलाती है। एक उदाहरण engineVerify(byte[] signature)com.sun.org.apache.xml.internal.security.algorithms.implementations.IntegrityHmac वर्ग में है, जो परीक्षण करता है अगर हस्ताक्षर बाइट सरणी इसे पास कर देती है तो इसे कुछ आंतरिक बाइट सरणी से तुलना करके वैध है। फिक्स से पहले, उस विधि के चलने वाले समय को मापकर, आप एक बाइट सरणी उत्पन्न करने का प्रयास कर सकते हैं जो तुलना पास करेगा (जितनी देर तक चलने वाली विधि का तात्पर्य है कि दो सरणी का बड़ा उपसर्ग बराबर है)।

2

वेबपेज लिंक के रूप में नीचे का संदर्भ लें: http://codahale.com/a-lesson-in-timing-attacks/

मैं चुन सकते हैं क्या संदेश मैं होना चाहता हूँ मान लीजिए कि किसी विशिष्ट उपयोगकर्ता से एक सत्र कुकी आईडी और उसके बाद 256 संभव मूल्यों की गणना प्रमाणीकृत-करते हैं:

0000000000000000000000000000000000000000 
0100000000000000000000000000000000000000 
0200000000000000000000000000000000000000 
... snip 250 ... 
FD00000000000000000000000000000000000000 
FE00000000000000000000000000000000000000 
FF00000000000000000000000000000000000000 

मैं इनमें से प्रत्येक मान के माध्यम से जाना जब तक मैं एक- A100000000000000000000000000000000000000-कि का एक अंश लेता है लगता है दूसरों की तुलना में एक मिलीसेकंद लंबा है। अब मुझे पता है कि उस संदेश के लिए एचएमएसी के पहले बाइट ए 1 होना चाहिए। शेष 1 9 बाइट्स के लिए प्रक्रिया दोहराएं, और अचानक मैं आपके जैसे लॉग इन हूं।

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

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