क्या मुझे उपयोग करना चाहिए /dev/random
या /dev/urandom
?
किन स्थितियों में मैं एक को पसंद करूंगा?
क्या मुझे उपयोग करना चाहिए /dev/random
या /dev/urandom
?
किन स्थितियों में मैं एक को पसंद करूंगा?
जवाबों:
/dev/urandom
अधिकांश व्यावहारिक उद्देश्यों के लिए उपयोग करें ।
लंबे समय तक उत्तर यूनिक्स के स्वाद पर निर्भर करता है जो आप चला रहे हैं।
ऐतिहासिक रूप से, /dev/random
और /dev/urandom
दोनों एक ही समय में पेश किए गए थे।
जैसा कि @DavidSchwartz ने एक टिप्पणी में बताया है , का उपयोग /dev/urandom
करना अधिकांश मामलों में पसंद किया जाता है। उन्होंने और अन्य लोगों ने लेख के बारे/dev/urandom
में उत्कृष्ट मिथकों के लिए एक लिंक प्रदान किया जिसे मैं आगे पढ़ने के लिए सलाह देता हूं।
संक्षेप में:
/dev/random
ब्लॉक जब यह एन्ट्रापी से बाहर निकलता है/dev/urandom
कभी भी ब्लॉक नहीं होगा, इससे पढ़ने से /dev/random
प्रक्रियाओं का निष्पादन रुक सकता है।/dev/urandom
नहीं हो सकती है और उच्च गुणवत्ता वाली यादृच्छिकता का उत्पादन नहीं कर सकती है।/dev/urandom
एन्ट्रापी पूल (द्वारा उपयोग किया गया /dev/random
) को पूरा नहीं करता है, लेकिन अपस्ट्रीम से CSPRNG आउटपुट का उपयोग करता है।/dev/urandom
।नियम के अपवाद
में क्रिप्टोग्राफी स्टैक एक्सचेंज का उपयोग करने के लिए जब /dev/random
से अधिक /dev/urandom
लिनक्स में
@otus दो उपयोग के मामलों देता है :
कम एन्ट्रापी डिवाइस पर बूट करने के कुछ समय बाद, यदि पर्याप्त एन्ट्रापी अभी तक ठीक से बीज के लिए उत्पन्न नहीं हुई है /dev/urandom
।
यदि आप (1) के बारे में चिंतित हैं, तो आप में उपलब्ध एन्ट्रापी की जांच/dev/random
कर सकते हैं ।
यदि आप कर रहे हैं (2) आप इसे पहले से ही जानते हैं :)
नोट: आप जाँच सकते हैं कि क्या / देव / यादृच्छिक से पढ़ना अवरुद्ध करेगा , लेकिन संभावित दौड़ की स्थितियों से सावधान रहें।
वैकल्पिक: न तो उपयोग करें!
@otus ने यह भी बताया कि यदि प्रारंभिक बीज एन्ट्रापी अनुपलब्ध है तो getrandom()
सिस्टम से ही पढ़ेगा /dev/urandom
और ब्लॉक करेगा ।
कर रहे हैं बदलने के साथ मुद्दों /dev/urandom
का उपयोग करने केgetrandom()
लिए, लेकिन यह कल्पना है कि एक नए है /dev/xrandom
डिवाइस पर आधारित बनाई गई है getrandom()
।
इससे कोई फर्क नहीं पड़ता, जैसा कि विकिपीडिया कहता है :
macOS SHA1 पर आधारित 160-बिट यारो का उपयोग करता है । / Dev / random / / dev / urandom में कोई अंतर नहीं है; दोनों समान रूप से व्यवहार करते हैं। Apple के iOS में भी यारो का इस्तेमाल होता है।
इससे कोई फर्क नहीं पड़ता, जैसा कि विकिपीडिया कहता है :
/dev/urandom
/dev/random
ठीक से बोया गया है जब तक सिर्फ और सिर्फ एक लिंक है ।
इसका मतलब यह है कि बूट के बाद, FreeBSD प्रतीक्षा करने के लिए पर्याप्त स्मार्ट है जब तक कि यादृच्छिक अच्छाई की कभी खत्म न होने वाली स्ट्रीम देने से पहले पर्याप्त बीज एन्ट्रॉपी इकट्ठा नहीं किया गया हो।
उपयोग करें /dev/urandom
, यह मानते हुए कि आपके सिस्टम ने /dev/random
उचित प्रारंभिक बोने को सुनिश्चित करने के लिए कम से कम एक बार पढ़ा है ।
/dev/urandom
कभी ब्लॉक नहीं करता।
/dev/random
कभी-कभी ब्लॉक करता है। यदि सिस्टम की स्थिति पूर्वानुमेय होने के लिए जानी जाती है, तो बूट पर जल्दी ब्लॉक कर देगा।जब वे बेतरतीब ढंग से उत्पन्न डेटा, उदाहरण के लिए क्रिप्टोग्राफ़िक कुंजी या सिमुलेशन के लिए बीज की आवश्यकता होती है, तो अनुप्रयोगों को / dev / urandom से पढ़ना चाहिए।
सिस्टम को विवेकपूर्ण तरीके से उत्पन्न करने वाली कुंजियों से बचने के लिए, इंटरनेट से बात करने वाली या अन्यथा क्रिप्टोग्राफी की आवश्यकता होने पर किसी भी सेवा को चलाने से पहले बूट पर / देव / यादृच्छिक से कम से कम एक बार विवेकपूर्ण ढंग से पढ़ने के लिए इंजीनियर होना चाहिए।
/dev/urandom
- ओपेनबीएसडी जैसी कोई चीज नहीं है /dev/urandom
। OpenBSD के पास है /dev/arandom
, लेकिन आप इसका उपयोग करने वाले नहीं हैं, आपको arc4random(3)
इसके बजाय फ़ंक्शन का उपयोग करना चाहिए । शायद यादृच्छिक उपकरणों और कार्यों के बारे में सलाह लोगों को छोड़ दी जानी चाहिए जो वास्तव में समझते हैं कि यह सब क्या है?
/dev/random
जब यह एंट्रॉपी से बाहर निकलता है तो ब्लॉक हो जाता है" - लिनक्स पर, यह निर्भर करता है कि आप डिवाइस को कैसे खोलते हैं। यदि open
झंडे शामिल हैं O_NONBLOCK
तो यह ब्लॉक नहीं होगा। यदि कोई एंट्रॉपी नहीं है, तो कॉल तुरंत वापस आ जाएगी और 0 बाइट्स पढ़ने का संकेत देगी।
/dev/random
केवल (पूर्व :) 60 बाइट्स हैं, dd
तो आपको 60 बाइट फ़ाइल मिलेगी। head
उसी परिदृश्य में उपयोग करना संभवतः ऐसा लगेगा जैसे यह हमेशा के लिए लटका हुआ है। न तो वह कर रहा है जो आप चाहते हैं, लेकिन, कम से कम मेरे लिए, यह अधिक स्पष्ट है कि head
वह नहीं कर रहा है जो अपेक्षित था।
परंपरागत रूप से, केवल एक अंतर है /dev/urandom
और /dev/random
क्या होता है जब कर्नेल को लगता है कि सिस्टम में कोई एंट्रॉपी नहीं है - /dev/random
बंद /dev/urandom
विफल रहता है , खुले में विफल रहता है। दोनों चालकों से एन्ट्रापी सोर्सिंग कर रहे थे add_disk_randomness()
, add_interrupt_randomness()
और add_input_randomness()
। /drivers/char/random.c
बारीकियों के लिए देखें ।
जोड़ने के लिए संपादित: लिनक्स 4.8 के रूप में /dev/urandom
CSPRNG का उपयोग करने के लिए फिर से काम किया गया था।
तो आपको कब बंद होना चाहिए? किसी भी प्रकार के क्रिप्टोग्राफिक उपयोग के लिए, विशेष रूप से डीआरबीजी को बोना। /dev/urandom
RSA कुंजियाँ बनाते समय और पर्याप्त एन्ट्रॉपी न होने पर उपयोग करने के परिणामों की व्याख्या करने वाला एक बहुत अच्छा पेपर है । अपने पीएस और क्यू खनन खनन पढ़ें ।
यह कुछ हद तक "मुझे भी" जवाब है, लेकिन यह टॉम हेल की सिफारिश को मजबूत करता है। यह स्क्वायर लिनक्स पर लागू होता है।
/dev/urandom
/dev/random
लिनक्स कर्नेल क्रिप्टो मेलिंग सूची पर थियोडोर त्सो के अनुसार, /dev/random
एक दशक के लिए पदावनत कर दिया गया है। से पुन: [आरएफसी PATCH v12 3/4] लिनक्स यादृच्छिक संख्या जनरेटर :
व्यावहारिक रूप से कोई भी उपयोग नहीं करता है / देव / यादृच्छिक। यह अनिवार्य रूप से एक पदावनत इंटरफ़ेस है; प्राथमिक इंटरफेस जो एक दशक से अधिक समय से अनुशंसित हैं / dev / urandom, और अब, getrandom (2)।
हम नियमित रूप से परीक्षण करते हैं /dev/random
और यह लगातार विफलताओं से ग्रस्त है। परीक्षण तीन चरण करता है: (1) /dev/random
गैर-अवरोधक मोड में 10K बाइट्स के लिए पूछकर नाली ; (2) ब्लॉक मोड में 16 बाइट्स का अनुरोध करें (3) यह देखने के लिए ब्लॉक को संपीड़ित करने का प्रयास करें कि क्या इसका यादृच्छिक (खराब आदमी का परीक्षण) है। परीक्षण पूरा होने में कुछ मिनट लगते हैं।
डिबैन सिस्टम (i686, x86_64, ARM और MIPS) पर समस्या इतनी खराब है कि हमने GCC कंपाइल फ़ार्म को rng-tools
अपनी परीक्षण मशीनों के लिए पैकेज स्थापित करने के लिए कहा। से स्थापित gcc67 और gcc68 पर RNG उपकरण :
मैं निवेदन करना चाहता हूं कि gng67 और gcc68 पर rng-tools को स्थापित किया जाना चाहिए। वे डेबियन सिस्टम हैं, और / देव / बेतरतीब ढंग से एनग्रेविंग परीक्षण के बिना, जब डिवाइस का उपयोग करने वाले पुस्तकालयों पर अत्याचार करते हैं, तो बिना रेंग-उपकरण के एन्ट्रापी की कमी होती है।
बीएसडी और ओएस एक्स ठीक दिखाई देते हैं। समस्या निश्चित रूप से लिनक्स है।
यह भी ध्यान देने योग्य हो सकता है कि लिनक्स जनरेटर विफलताओं को लॉग नहीं करता है। वे सिस्टम लॉग को भरने वाली प्रविष्टियों को नहीं चाहते थे। आज तक, अधिकांश असफलताएं चुप हैं और अधिकांश उपयोगकर्ताओं द्वारा अवांछित हैं।
कर्नेल कम से कम एक विफलता संदेश मुद्रित करने जा रहा है के बाद से स्थिति जल्द ही बदल रही है। से चुप्पी संकलक चेतावनी और ठीक दौड़: [PATCH] यादृच्छिक कर्नेल क्रिप्टो मेलिंग सूची पर:
विशेष रूप से, मैंने जोड़ा
depends on DEBUG_KERNEL
। इसका अर्थ है कि ये उपयोगी चेतावनी केवल अन्य कर्नेल डेवलपर्स को रोकेंगी। शायद यही हम चाहते हैं। यदि विभिन्न संबद्ध डेवलपर्स अपने विशेष उपतंत्र से आने वाली चेतावनी देखते हैं, तो वे इसे ठीक करने के लिए अधिक प्रेरित होंगे। वितरण कर्नेल पर साधारण उपयोगकर्ताओं को चेतावनी या स्पैम बिल्कुल नहीं देखना चाहिए, क्योंकि आमतौर पर उपयोगकर्ता DEBUG_KERNEL का उपयोग नहीं कर रहे हैं।मुझे लगता है कि सुरक्षा इंजीनियरिंग के दृष्टिकोण से सभी संदेशों को दबाना एक बुरा विचार है।
कई लोग डिबग गुठली नहीं चलाते हैं। अधिकांश उपयोगकर्ताओं को जो मुद्दों के बारे में जानना चाहते हैं या उन्हें इसकी आवश्यकता नहीं है। गौर कीजिए, हमने सिस्टमडे की समस्याओं के बारे में जो सीखा था, वह dmesg के कारण था।
सभी कॉन्फ़िगरेशन के लिए सभी संदेशों को दबाकर आवश्यक से अधिक व्यापक जाल डाले। संभावित रूप से पाए जाने वाले कॉन्फ़िगरेशन और निश्चित संभावना पर किसी का ध्यान नहीं जाएगा। यदि समस्या को प्रकाश में नहीं लाया जाता है, तो इसे ठीक नहीं किया जाएगा।
मुझे ऐसा लगता है कि कर्नेल कुछ संगठनों के लिए नीतिगत निर्णय ले रहा है। उन लोगों के लिए जिनके पास हार्डवेयर है जो प्रभावी रूप से अप्राप्य है, तो संगठन को यह तय करना होगा कि उनके जोखिम प्रतिकूलता के आधार पर क्या करना है। वे जोखिम के साथ जीने का फैसला कर सकते हैं, या वे हार्डवेयर को ताज़ा करने का निर्णय ले सकते हैं। हालांकि, इस मुद्दे पर जानकारी के बिना, उन्हें एहसास भी नहीं हो सकता है कि उनके पास एक कार्रवाई योग्य वस्तु है।
बाद में थ्रेड में समझौता बाद में कम से कम एक dmesg प्रति कॉलिंग मॉड्यूल था।