2009-09-22 13 views
82

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

उत्तर

83

हां, यह है। कई धागे का उपयोग कर रहे हैं, तो एक भी SecureRandom, वहाँ विवाद है कि प्रदर्शन दर्द होता है हो सकता है यह Random है, जो हमेशा एक वास्तविक threadsafe कार्यान्वयन था फैली हुई है, और, से Java 7, explicitly guarantees threadsafety.

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

+3

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

+2

'सिक्योररैंडम' शुरू करने से न केवल धीमा हो सकता है, लेकिन संभावित रूप से लापता एंट्रॉपी –

+1

@ वाल्टरट्रॉस हैंग के कारण संभावित रूप से लटका सकता है? मैंने सिस्टम को 10 या 15 मिनट लगते हैं, लेकिन मैंने कभी एक लटका नहीं देखा है। एक कार्यान्वयन जो धीरे-धीरे अपने एन्ट्रॉपी पूल को खिलाने के लिए गारंटी नहीं देता है, ओएस में एक बग की तरह लगता है। – erickson

1

हां। यह पूरी तरह से थ्रेड-सुरक्षित है। दरअसल, मैं शिकायत करता हूं कि ताला बहुत आक्रामक है। संपूर्ण engineNextBytes() सिंक्रनाइज़ किया गया है।

आपके साथ स्पष्ट होने के लिए, मुझे नहीं पता कि यह सुरक्षित नहीं है या नहीं। थ्रेडिंग समस्या शायद अधिक यादृच्छिकता पेश करती है :)

+9

यह * सुरक्षित * यादृच्छिक है, इसे सटीक रूप से उपयोग करना बहुत महत्वपूर्ण है। मुझे नहीं लगता कि यह अधिक यादृच्छिकता पेश करता है। जैसे गैर थ्रेड सुरक्षित यादृच्छिक कई धागे में एक ही यादृच्छिक संख्या उत्पन्न कर सकता है - इसका मतलब यह हो सकता है कि एक धागा किसी अन्य थ्रेड के लिए उत्पन्न संख्या को चुरा सकता है, इसका उपयोग हैकर द्वारा किया जा सकता है। – kan

8

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

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

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

SecureRandom rnd = ...; 

    byte[] b = new byte[NRANDOM_BYTES]; 
    synchronized (rnd) { 
     rnd.nextBytes(b); 
    } 
संबंधित मुद्दे