एक जावा 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
वर्ग में है, जो परीक्षण करता है अगर हस्ताक्षर बाइट सरणी इसे पास कर देती है तो इसे कुछ आंतरिक बाइट सरणी से तुलना करके वैध है। फिक्स से पहले, उस विधि के चलने वाले समय को मापकर, आप एक बाइट सरणी उत्पन्न करने का प्रयास कर सकते हैं जो तुलना पास करेगा (जितनी देर तक चलने वाली विधि का तात्पर्य है कि दो सरणी का बड़ा उपसर्ग बराबर है)।