क्या SecureRandom धागा सुरक्षित है?


103

क्या SecureRandomधागा सुरक्षित है? यही है, इसे शुरू करने के बाद, अगले रैंडम नंबर तक पहुंच सुरक्षित धागे पर निर्भर हो सकती है? स्रोत कोड की जांच करने से पता चलता है कि यह है, और यह बग रिपोर्ट इंगित करती है कि धागे के सुरक्षित होने के रूप में इसके प्रलेखन की कमी एक javadoc मुद्दा है। क्या किसी ने पुष्टि की है कि यह वास्तव में सुरक्षित है?

जवाबों:


108

हाँ यही है। यह फैली हुई है Random, जिसमें हमेशा एक डी थ्रेडोसेफ़ कार्यान्वयन था, और, जावा 7 से, स्पष्ट रूप से थ्रेडसैफिटी की गारंटी देता है।

यदि कई थ्रेड एकल का उपयोग कर रहे हैं SecureRandom, तो ऐसा कोई विवाद हो सकता है जो प्रदर्शन को नुकसान पहुंचाता है। दूसरी ओर, एक SecureRandomउदाहरण को शुरू करना अपेक्षाकृत धीमी गति से हो सकता है। चाहे एक वैश्विक RNG साझा करना सबसे अच्छा है, या प्रत्येक थ्रेड के लिए एक नया बनाना आपके आवेदन पर निर्भर करेगा। ThreadLocalRandomवर्ग का समर्थन करता है एक समाधान प्रदान करने के लिए एक पद्धति के रूप में इस्तेमाल किया जा सकता SecureRandom


3
अद्यतन के लिए धन्यवाद। अजीब तरह से, बग को "बंद नहीं होगा" के रूप में चिह्नित किया गया है। लेकिन उन्होंने इसे वैसे भी तय कर दिया। ओह ठीक है, मैं उन्हें अपने बग डेटाबेस के आकार से ईर्ष्या नहीं करता।
यिशई

4
शुरू में SecureRandomन केवल धीमी गति से हो सकता है, बल्कि लापता एंट्रोपी के कारण संभावित रूप से लटका सकता है
वाल्टर ट्रॉस

8
कृपया ध्यान रखें कि थ्रेडलोकल्रैन्ड्रम क्रैक करना बहुत आसान है, इसलिए यदि आप दुनिया के लिए उत्पन्न मूल्य को उजागर करने की योजना बनाते हैं, तो इसके बजाय SecureRandom का
walv

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

2
@JamesKPolk सुपरटाइप की संपत्ति को संरक्षित करने में विफलता प्रतिस्थापन सिद्धांत का उल्लंघन होगा।
इरिकसन

11

वर्तमान कार्यान्वयन SecureRandomथ्रेड सुरक्षित है, विशेष रूप से दो उत्परिवर्तन विधियों nextBytes(bytes[])और setSeed(byte[])सिंक्रनाइज़ हैं।

खैर, जहाँ तक मैं बताने में सक्षम रहा हूँ, सभी उत्परिवर्तन विधियों को अंततः उन दो विधियों के माध्यम से रूट किया जाता है और यह सुनिश्चित करने के लिए SecureRandomकुछ तरीकों को ओवरराइड करता Randomहै। जो काम करता है लेकिन अगर भविष्य में कार्यान्वयन बदल जाता है तो वह भंगुर हो सकता है।

सबसे अच्छा समाधान SecureRandomपहले उदाहरण पर मैन्युअल रूप से सिंक्रनाइज़ करना है । इसका मतलब है कि प्रत्येक कॉल स्टैक एक ही वस्तु पर दो ताले प्राप्त करेगा, लेकिन यह आमतौर पर आधुनिक जेवीएम पर बहुत सस्ता है। यही है, अपने आप को स्पष्ट रूप से सिंक्रनाइज़ करने में बहुत नुकसान नहीं है। उदाहरण के लिए:

    SecureRandom rnd = ...;

    byte[] b = new byte[NRANDOM_BYTES];
    synchronized (rnd) {
        rnd.nextBytes(b);
    }

3
कम से कम JDK 10 में, SecureRandom एक प्रदाता पर आधारित है और जाँचता है कि क्या प्रदाता थ्रेड सुरक्षित है, केवल सिंक्रोनाइज़ करना अगर यह नहीं है, तो नेक्स्ट बाइट्स में।
nafg

java.security.SecureRandom#nextBytesजावा में 8 सिंक्रनाइज़ नहीं है। क्या आप कृपया बता सकते हैं कि जावा संस्करण में आपको एक सिंक्रनाइज़ #nextBytesक्या मिला?
नवंबर को Jaime Hablutzel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.