2011-01-27 8 views
33

कुछ पृष्ठभूमि जानकारी: मैं/dev/random से कुछ डेटा पढ़ने के लिए Red Hat सर्वर पर एक स्क्रिप्ट चलाने के लिए देख रहा था और बाद में उपयोग के लिए हेक्स स्ट्रिंग में कनवर्ट करने के लिए पर्ल अनपैक() कमांड का उपयोग करता हूं (डेटाबेस ऑपरेशंस बेंचमार्किंग)। मैंने कुछ/सिर/यादृच्छिक पर "हेड -1" चलाया और यह ठीक काम कर रहा था, लेकिन इसे कुछ बार कॉल करने के बाद, यह थोड़ी देर लटका होगा। कुछ मिनटों के बाद, अंत में यह टेक्स्ट के एक छोटे से ब्लॉक को आउटपुट करेगा, फिर खत्म करें।/देव/यादृच्छिक बेहद धीमी?

मैं/dev/urandom में स्विच (मैं वास्तव में नहीं चाहते थे करने के लिए, अपनी धीमी और मैं अनियमितता की है कि गुणवत्ता की जरूरत नहीं है) और यह पहले दो या तीन कॉल के लिए ठीक काम किया है, तो यह भी लटका शुरू किया । मैं सोच रहा था कि क्या यह "हेड" कमांड था जो इसे बमबारी कर रहा था, इसलिए मैंने पर्ल का उपयोग करके कुछ सरल I/O करने का प्रयास किया, और यह भी लटक रहा था। आखिरी खाई के प्रयास के रूप में, मैंने "dd" कमांड का उपयोग टर्मिनल की बजाय फ़ाइल से सीधे कुछ जानकारी को डंप करने के लिए किया था। मैंने इसके बारे में पूछा कि डेटा का 1 एमबी था, लेकिन इसे मारने से पहले ~ 400 बाइट प्राप्त करने में 3 मिनट लग गए।

मैंने प्रक्रिया सूचियों की जांच की, सीपीयू और मेमोरी मूल रूप से छेड़छाड़ की गई थी। वास्तव में इस तरह से बाहर निकलने के लिए/dev/यादृच्छिक कारण क्या हो सकता है और भविष्य में इसे रोकने/ठीक करने के लिए मैं क्या कर सकता हूं?

संपादित करें: मदद लोग के लिए धन्यवाद! ऐसा लगता है कि मेरे पास यादृच्छिक और यादृच्छिक मिश्रित था। मुझे स्क्रिप्ट मिल गई है और अब चल रही है। ऐसा लगता है कि मैंने आज कुछ नया सीखा। :)

+9

आप 2 उपकरणों को मिलाया है लगता है; लिनक्स सिस्टम पर,/dev/random यादृच्छिक डिवाइस को अवरुद्ध करने वाली उच्च गुणवत्ता वाली है। उच्च गुणवत्ता वाले यादृच्छिक संख्या उत्पन्न करने के लिए कोई और एकत्रित एन्ट्रॉपी उपलब्ध नहीं होने पर यह "लटका" जाएगा।/dev/urandom गैर-अवरुद्ध और छद्म यादृच्छिक होना चाहिए। – geoffspear

+0

'/ dev/random' के बारे में, देखें [विकी] (http://en.wikipedia.org/wiki//dev/random):" जब एन्ट्रॉपी पूल खाली होता है, तो/dev/random से पढ़ता है अतिरिक्त तक ब्लॉक पर्यावरण शोर इकट्ठा किया जाता है। " '/ dev/urandom' हालांकि गैर-अवरुद्ध होना चाहिए, क्या आप वाकई इसका इस्तेमाल करते हैं? – delnan

+0

एक तरफ के रूप में, आप 'सिर -1' भाग गए, इसका एक पंक्ति पढ़ने का प्रभाव होगा, यानी। जब तक यह एक नई लाइन का सामना नहीं करता तब तक पढ़ें। यदि आप थोड़ी सी मात्रा को पढ़ने की कोशिश कर रहे हैं, तो आपको शायद इसके बजाय 'dd' का उपयोग करना चाहिए। – Hasturkun

उत्तर

38

अधिकतर Linux सिस्टम पर, /dev/random वास्तविक एन्ट्रापी वातावरण द्वारा इकट्ठा से संचालित है। यदि आपका सिस्टम /dev/random से बड़ी मात्रा में डेटा नहीं दे रहा है, तो संभवतः इसका मतलब है कि आप इसे शक्ति देने के लिए पर्याप्त पर्यावरणीय यादृच्छिकता उत्पन्न नहीं कर रहे हैं।

मुझे यकीन है कि तुम क्यों लगता है /dev/urandom "धीमे" या उच्च गुणवत्ता है नहीं कर रहा हूँ। यह छद्म यादृच्छिकता उत्पन्न करने के लिए एक आंतरिक एन्ट्रॉपी पूल का उपयोग करता है - इसे थोड़ा कम गुणवत्ता बना देता है - लेकिन यह अवरुद्ध नहीं होता है। आम तौर पर, जिन अनुप्रयोगों को उच्च स्तरीय या दीर्घकालिक क्रिप्टोग्राफी की आवश्यकता नहीं होती है, वे विश्वसनीय रूप से /dev/urandom का उपयोग कर सकते हैं।

एक छोटे से इंतजार कर रहे हैं, जबकि उसके बाद फिर से /dev/urandom से पढ़ने की कोशिश करो। यह संभव है कि आपने /dev/random से इतने सारे आंतरिक एंट्रॉपी पूल को समाप्त कर दिया है, दोनों जनरेटर को तोड़ने से - आपके सिस्टम को अधिक एन्ट्रॉपी बनाने की इजाजत दी जानी चाहिए।

/dev/random और /dev/urandom के बारे में अधिक जानकारी के लिए Wikipedia देखें।

+0

आह, ऐसा लगता है कि मैंने मिश्रित किया है कि दोनों में से कौन सा क्रिप्टोग्राफिक उपयोग के लिए सुरक्षित नहीं माना गया था। अगर मैं/dev/random (अतिरिक्त यादृच्छिक डेटा में मिश्रण करने के लिए) लिखता हूं, तो क्या इससे समस्या हल हो जाएगी और मुझे "निवेश पर वापसी" क्या मिलेगा? (उदाहरण के लिए, यदि मैं 1 एमबी डेटा में लिखता हूं, तो मुझे कितने एमबी पढ़ने की गारंटी दी जाएगी, या यह भी मामला है?) –

+1

@ गीगावाट: यह वास्तव में सिस्टम पर एंट्रॉपी के कितने बिट्स पर निर्भर करता है आपके लिखने से मिलता है।यह तब भी व्यर्थ होगा जब तक आपके पास '/ dev/random' की तुलना में एन्ट्रॉपी का बेहतर स्रोत न हो, इस मामले में आपको शायद कर्नेल को संभालने की अनुमति देनी चाहिए जो पहले स्थान पर – Hasturkun

+0

@GigaWatt: हाँ, आप wtire कर सकते हैं/dev/यादृच्छिक लेकिन इससे मदद नहीं मिलेगी क्योंकि आप एन्ट्रॉपी बढ़ाने के लिए ioctl कॉल को कॉल नहीं करेंगे और यदि आपको उच्च गुणवत्ता वाले यादृच्छिक डेटा मिलते हैं, तो यह तेज़ नहीं होगा। आरएनजीडी के बारे में पढ़ें। – akostadinov

1

यदि आप /dev/random के लिए अधिक एन्ट्रॉपी चाहते हैं तो आपको इसे उत्पन्न करने के लिए या तो हार्डवेयर आरएनजी खरीदने या *_entropyd daemons में से एक का उपयोग करने की आवश्यकता होगी।

+0

जेनरेटिंग एन्ट्रॉपी एक कठिन समस्या है। डिफ़ॉल्ट तंत्र को बदलने से बचने के लिए उपयोगकर्ताओं (गहरे क्रिप्टो ज्ञान के बिना किसी के लिए) सुरक्षित है। बेहतर छड़ी '/ dev/urandom' जैसा कि यहां बताया गया है http://www.2uo.de/myths-about-urandom/ – akostadinov

1

आप परीक्षण के लिए अनियमितता (क्रिप्टोग्राफी नहीं), तो दोहराने योग्य अनियमितता बेहतर है का उपयोग कर रहे हैं, तो आप छद्म अनियमितता एक ज्ञात बीज से शुरू होने के साथ इस मिल सकता है। ज्यादातर भाषाओं में इसके लिए आमतौर पर एक अच्छी लाइब्रेरी फ़ंक्शन होती है।

यह जब आप एक समस्या खोजने के लिए और डिबग करने के लिए कोशिश कर रहे हैं के लिए repeatable है। यह एंट्रॉपी भी नहीं खाता है।/Dev/urandom से छद्म यादृच्छिक जनरेटर बीज हो सकता है और परीक्षण लॉग में बीज रिकॉर्ड कर सकता है। पर्ल में एक छद्म यादृच्छिक संख्या जेनरेटर है जिसका आप उपयोग कर सकते हैं।

+0

'/dev/random' एक छद्म जनरेटर 'urandom' के रूप में http: // www देखें। 2uo.de/myths-about-urandom/ – akostadinov

+0

@akostadinov लेख कहता है कि '/ dev/random' ब्लॉक कर सकता है। एएसओ और '/ dev/urandom', जैसा कि यह कहता है, अप्रत्याशित है। इसलिए जैसा कि मैंने अपरिवर्तनीय कहा, परीक्षण के लिए बहुत गरीब। –

+0

'/ dev/(u) यादृच्छिक' एक छद्म यादृच्छिक संख्या जनरेटर है। भविष्यवाणी और दोहराने योग्यता अलग-अलग गुण हैं। आपको अनुमानित और दोहराने योग्य बनाने के लिए आवश्यक कर्नेल नियंत्रणों की कमी है (और इसके लिए भगवान का शुक्र है)। मैं सहमत हूं कि अन्य जेनरेटर विशेष परीक्षण परिदृश्यों के लिए बेहतर हैं। आपका उत्तर मुझे सहमत होना चाहिए विशेष उपयोग केस को चुनने के लिए उचित सलाह देता है। लेकिन एसओ जवाब देने तक मुझे अपना वोट वापस नहीं जाने देगा। वैसे भी एक अच्छी बात होगी। – akostadinov

15

यह सवाल बहुत पुराना है। लेकिन अभी भी प्रासंगिक है इसलिए मैं अपना जवाब देने जा रहा हूं। कई सीपीयू आज एक अंतर्निहित हार्डवेयर यादृच्छिक संख्या जेनरेटर (आरएनजी) के साथ आते हैं। साथ ही कई प्रणालियां एक विश्वसनीय मंच मॉड्यूल (टीपीएम) के साथ आती हैं जो एक आरएनजी भी प्रदान करती है। ऐसे अन्य विकल्प भी हैं जिन्हें खरीदा जा सकता है लेकिन संभावना है कि आपके कंप्यूटर में पहले से कुछ है।

आप आरएनजीडी से आरएनजीडी का उपयोग अधिकांश लिनक्स डिस्ट्रोज़ से अधिक यादृच्छिक डेटा तक कर सकते हैं। फेडोरा 18 पर उदाहरण के लिए सब मैं टी पी एम और सीपीयू RNG से बोने सक्षम करने के लिए करना पड़ा था:

# systemctl enable rngd 
# systemctl start rngd 

आप के साथ और rngd बिना गति की तुलना कर सकते हैं। कमांड लाइन से rngd -v -f चलाने का अच्छा विचार है। यह आपको एंट्रॉपी स्रोतों का पता लगाएगा। सुनिश्चित करें कि आपके स्रोतों का समर्थन करने के लिए सभी आवश्यक मॉड्यूल लोड हो गए हैं। टीपीएम का उपयोग करने के लिए, इसे टीपीएम-टूल्स के माध्यम से सक्रिय करने की आवश्यकता है। अद्यतन: यहां एक nice howto है।

बीटीडब्लू, मैंने इंटरनेट पर पढ़ा है टीपीएम आरएनजी के बारे में कुछ चिंताओं को अक्सर अलग-अलग तरीकों से तोड़ा जा रहा है, लेकिन इंटेल, एएमडी और वीआईए चिप्स में पाए गए आरएनजी के खिलाफ कुछ भी ठोस नहीं पढ़ा। यदि आप वास्तव में यादृच्छिकता की गुणवत्ता की परवाह करते हैं तो एक से अधिक स्रोतों का उपयोग करना सबसे अच्छा होगा।

AFAIK urandom अधिकांश उपयोग मामलों के लिए ठीक है। अधिकांश कार्यक्रम आजकल यादृच्छिक के बजाय urandom का उपयोग करते हैं। यहां तक ​​कि openssl does that भी।

अद्यतन: अधिक एन्ट्रॉपी के लिए एक और विकल्प HAVEGED है। आभासी मशीनों पर एक केवीएम/qemu VirtIORNG है।

6

इसका उपयोग/dev/urandom, इसका क्रिप्टोग्राफ़िक रूप से सुरक्षित है।

अच्छा पढ़ा: http://www.2uo.de/myths-about-urandom/

"आप के बारे में है कि क्या आप का उपयोग करना चाहिए/dev/यादृच्छिक या/dev/urandom अनिश्चित हैं, तो शायद आप बाद उपयोग करने के लिए चाहते हैं।"

जब शुरुआती बूट में संदेह होता है, तो गीलेर में आपके पास पर्याप्त एन्ट्रॉपी एकत्र होती है। इसके बजाए सिस्टम कॉल getrandom() का उपयोग करें। [1] दोनों दुनिया के सर्वश्रेष्ठ, यह तब तक अवरुद्ध करता है जब तक (केवल एक बार!) पर्याप्त एन्ट्रॉपी इकट्ठा नहीं होती है, उसके बाद यह कभी भी फिर से अवरुद्ध नहीं होगा।

[1] git kernel commit

+3

यह जवाब क्यों कम किया गया था? यह मेरे लिए एक अच्छा जवाब लगता है ... लेकिन शायद मुझे इसके साथ समस्या याद आ रही है। – MountainX

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