2011-09-25 12 views
5

प्रश्न सरल है: जब मैं जावा क्लास MessageDigest पर रीसेट() फ़ंक्शन को कॉल करूँ?क्या मुझे इसका उपयोग करने से पहले MessageDigest.reset() को कॉल करने की आवश्यकता है?

प्रश्न मुख्य रूप से OWASP reference, जहां एक कोड नमूने में, वे करते हैं से आता है:

MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
    digest.reset(); 
    digest.update(salt); 
    byte[] input = digest.digest(password.getBytes("UTF-8")); 

तो, एक पाश में, वे करते हैं:

for (int i = 0; i < iterationNb; i++) { 
     digest.reset(); 
     input = digest.digest(input); 
    } 

अब, मुझे करने के लिए है, यह ऐसा लगता है कि रीसेट केवल तभी आवश्यक होता है जब डायजेस्ट इंस्टेंस को अपडेट करने के लिए कॉल के साथ पहले ही प्रदूषित किया जा सके। इसलिए, पहले नमूने में से एक आवश्यक नहीं लगता है। यदि यह आवश्यक है, तो क्या यह संकेत है कि MessageDigest.getInstance द्वारा लौटाया गया उदाहरण थ्रेड सुरक्षित नहीं है?

उत्तर

4

मुझे लगता है कि तुम ठीक कह रहे, प्रारंभिक reset() आवश्यक नहीं है। documentation states:

एक संदेशडिजिस्ट ऑब्जेक्ट प्रारंभ होता है।

क्लास प्रलेखन के उदाहरण में प्रारंभिक रीसेट भी शामिल नहीं है।

इसका थ्रेड-सुरक्षा से कोई लेना-देना नहीं है, .reset() की आवश्यकता केवल यह संकेत देगी कि getInstance() प्रारंभिकरण नहीं करता है।

आपको एक ही संदेशडिजिस्ट ऑब्जेक्ट का उपयोग एकाधिक थ्रेड से सिंक्रनाइज़ेशन के बिना नहीं करना चाहिए: एक हैश केवल सार्थक है यदि आप जानते हैं कि भागों को किस क्रम में रखा गया था, अन्यथा यह केवल एक फैंसी नहीं है-पूरी तरह से निर्धारिती पीआरएनजी है।

+0

टीवाई, समझ में आता है। Google रेफरी पर बहुत कुछ देख रहा था, क्लास हेडर को फिर से पढ़ना भूल गया और getInstance() दस्तावेज़, इसलिए मैं उलझन में आया। –

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

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