तुम्हें पता नहीं कर सकते हैं भविष्य
आप मौलिक या किसी भी भाषा में ऐसा नहीं हो सकता है हो सकता है कि भविष्य में क्या optimisers अनुमान नहीं लगा सकते।
भविष्य को देखने के लिए, ओएस के लिए सबसे अच्छा बाधाएं समय-समय पर निरंतर परीक्षण प्रदान करने के लिए होती हैं, इस तरह उन्हें सभी वातावरण में सही ढंग से परीक्षण और उपयोग किया जा सकता है।
यह काफी समय से पहले से चल रहा है। जैसे Libc में timingsafe_bcmp() फ़ंक्शन पहले ओपनबीएसडी 4.9 में दिखाई दिया। (मई 2011 में जारी)।
जाहिर है प्रोग्रामिंग वातावरण इन्हें चुनने और/या अपने स्वयं के कार्यों को प्रदान करने की आवश्यकता है जो वे गारंटी देते हैं कि उन्हें अनुकूलित नहीं किया जाएगा।
विधानसभा कोड
का निरीक्षण वहाँ optimisers here की कुछ चर्चा है। यह सी (और सी ++) दिमाग में है, लेकिन यह वास्तव में स्वतंत्र भाषा है कि आप केवल वर्तमान ऑप्टिमाइज़र क्या कर सकते हैं, भविष्य में अनुकूलक क्या कर सकते हैं, यह देख सकते हैं। वैसे भी वे सही तरीके से असेंबली कोड की जांच करने की सलाह देते हैं ताकि यह जानने के लिए कि आपका अनुकूलक क्या करता है।
जावा के लिए यह आवश्यक नहीं है कि सी या सी ++ के रूप में "आसान" के रूप में यह आवश्यक न हो, लेकिन विशिष्ट सुरक्षा कार्यों के लिए यह वास्तव में असंभव नहीं होना चाहिए कि वर्तमान वातावरण के लिए वास्तव में ऐसा प्रयास करें।
बचाव संभव
हो सकता है आप समय का दौरा पड़ने से बचने की कोशिश कर सकता है।
उदा .:
सहज यादृच्छिक समय के अलावा करने के लिए टिंग लग सकता है, यह काम नहीं करेगा: हमलावरों को पहले से ही समय हमलों में सांख्यिकीय विश्लेषण उपयोग कर रहा है, तो आप केवल कुछ और शोर जोड़ें।
https://security.stackexchange.com/questions/96489/can-i-prevent-timing-attacks-with-random-delays
फिर भी: यह मतलब नहीं है कि आप एक समय लगातार कार्यान्वयन आपके आवेदन काफी धीमी गति से हो सकता है, अगर नहीं कर सकता। i.e .: काफी देर तक प्रतीक्षा करें। जैसे आप टाइमर को जाने के लिए इंतजार कर सकते हैं और फिर भी समय पर हमले से बचने की तुलना के परिणाम को संसाधित करना जारी रख सकते हैं।
जांच
यह अनुप्रयोगों में हमले जोखिम समय निरंतर तुलना समय के एक कार्यान्वयन का उपयोग करने का पता लगाने में लिखने के लिए संभव हो जाना चाहिए।
ईथर: कि initialisation
सामान्य कार्यों के एक भाग के रूप में एक ही परीक्षण नियमित रूप से चलाया जाता है के दौरान
फिर से ऑप्टिमाइज़र को निपटने के लिए मुश्किल हो रही है क्योंकि यह (और कभी-कभी) चीजों के निष्पादन के क्रम को भी बदल सकती है। लेकिन उदा। इनपुट का उपयोग करके प्रोग्राम में उसके कोड (जैसे बाहरी फ़ाइल) नहीं है, और इसे दो बार चला रहा है: एक बार सामान्य तुलना और समान तारों के साथ, एक बार पूरी तरह से अलग तारों (xored eg) के साथ और फिर फिर उन इनपुट के साथ निरंतर समय की तुलना करें। अब आपके पास 4 समय हैं: सामान्य तुलना समान नहीं होनी चाहिए, निरंतर समय की तुलना धीमी और समान होनी चाहिए। यदि यह विफल रहता है: एप्लिकेशन के उपयोगकर्ता/रखरखाव को चेतावनी दें कि उत्पादन के उपयोग में निरंतर समय की सामग्री टूट जाती है।
- एक सैद्धांतिक विकल्प वास्तविक समय स्वयं को रिकॉर्ड करना है (रिकॉर्ड विफल/सफलता भी) और सांख्यिकीय रूप से उनका विश्लेषण करें। लेकिन अभ्यास में प्रदर्शन करना मुश्किल होगा क्योंकि आपके माप को बेहद सटीक होने की आवश्यकता होगी क्योंकि आप इसे कुछ मिलियन बार लूप नहीं कर सकते हैं, आप केवल एक तुलना को मापने के साथ काम कर रहे हैं और इसे सटीक रूप से पर्याप्त मापने के लिए संकल्प नहीं होगा। ..
शॉर्ट सर्किट को रोकने के बाहर एक लॉग स्टेटमेंट कैसे होगा? –
@SleimanJneidi परिणाम के रूप में 'res' लॉग है, इसकी गणना अंत तक की जानी चाहिए, इसलिए लूप को संक्षिप्त-सर्किट नहीं किया जा सकता है। –
... जब तक आपको किसी बिंदु पर 'res == -1' नहीं मिलता है और फिर आप लूप से बाहर निकल सकते हैं। लेकिन यह एक अलग परीक्षण होगा और मैं कल्पना कर सकता हूं कि ऐसा करने वाला एक कंपाइलर नहीं है। – maaartinus