2009-02-23 13 views
19

मैं जावास्क्रिप्ट और एन्क्रिप्शन के साथ कुछ प्रयोग करना चाहता हूं और मुझे उत्सुकता है कि यादृच्छिक फ़ंक्शन के कार्यान्वयन के बारे में कितना अप्रत्याशित है। क्या किसी ने कोई कठोर परीक्षण किया है?विभिन्न ब्राउज़रों में जावास्क्रिप्ट के यादृच्छिक कार्यान्वयन कितना भरोसेमंद है?

स्पष्ट रूप से ब्राउज़र में मजबूत यादृच्छिकता (एसएसएल के लिए) उत्पन्न करने की क्षमता है। सवाल यह है कि वे एक ही ताकत के लिए जावास्क्रिप्ट पहुंच देते हैं।

+0

भी देखें https://security.stackexchange.com/questions/84906/predicting-math -यादृच्छिक संख्या –

उत्तर

15

आम तौर पर, यादृच्छिक फ़ंक्शन क्रिप्टोग्राफ़िक रूप से मजबूत नहीं होता है, इसके लिए आपको यह सुनिश्चित करने की आवश्यकता होती है कि आप क्रिप्टोग्राफिक छद्म-यादृच्छिक-संख्या जनरेटर का उपयोग कर रहे हैं।

जेनेरिक यादृच्छिक कार्य आमतौर पर क्रिप्टोग्राफिक रूप से मजबूत पीढ़ी के तरीकों का उपयोग नहीं करते हैं क्योंकि वे सरल लोगों से अधिक समय लेते हैं, (उदाहरण के लिए यारो मेर्सेन ट्विस्टर से अधिक जटिल है) और एंट्रॉपी पूल के सावधानीपूर्वक प्रबंधन की आवश्यकता है, जो गारंटी नहीं है कि मोज़िला, cstdlib, आदि आप को बनाना चाहते हैं।

यदि आपको क्रिप्टोग्राफ़िक रूप से मजबूत यादृच्छिक संख्या जेनरेटर तक पहुंच की आवश्यकता है, तो मैं अंतर्निहित SSL कार्यान्वयन तक पहुंच प्राप्त करना चाहता हूं (जो एक दिया गया ब्राउज़र एक्सेस तक पहुंच सकता है या नहीं)।

7

प्रत्येक जावास्क्रिप्ट इंजन जो मैं परिचित हूं क्रिप्टोग्राफिक-मजबूत आरएनजी का उपयोग नहीं करता हूं।

यदि आपको ब्राउज़र में एन्ट्रॉपी का एक अच्छा स्रोत चाहिए (और अधिमानतः इसे अक्सर इसकी आवश्यकता नहीं है), तो मैं माउस आंदोलन डेटा को कैप्चर करने और क्रिप्टोग्राफिक-मजबूत हैशिंग एल्गोरिदम के माध्यम से इसे चलाने की अनुशंसा करता हूं। Entropy Gathering Daemon (जीजीपी के साथ प्रयोग किया जाता है) जैसे मौजूदा प्रोग्राम इस तरह के सिस्टम को कार्यान्वित करने के संदर्भ के रूप में उपयोग किए जा सकते हैं।

+1

[एसजेसीएल] (http://bitwiseshiftleft.github.io/sjcl/doc/symbols/sjcl.random.html) और [क्लिपरज़] (https://www.clipperz.com/security_privacy/crypto_algorithms/ #prng) जेएस पुस्तकालय एंट्रॉपी सभा को लागू करते हैं। –

1

मुझे मिला एक दिलचस्प डेटा बिंदु mozilla में एक जावास्क्रिप्ट क्रिप्टो ऑब्जेक्ट है जो अभी तक पूरी तरह कार्यान्वित नहीं है।

1

आम तौर पर आप जावास्क्रिप्ट में छद्म यादृच्छिक संख्या पीढ़ी पर भरोसा नहीं कर सकते हैं, यहां तक ​​कि दूरस्थ रूप से क्रिप्टोग्राफिक रूप से सुरक्षित भी हो सकते हैं। आप एंट्रॉपी एकत्रण प्रणाली का उपयोग करके अपने स्वयं के पीएनआरजी को लागू करने पर विचार कर सकते हैं, या शायद hotbits जैसे यादृच्छिक संख्याओं के बाहरी स्रोत का उपयोग कर सकते हैं।

13

हाल के ब्राउज़र window.crypto.getRandomValues() का खुलासा करते हैं जो क्रिप्टोग्राफिक रूप से मजबूत है।

जेएस पुस्तकालय भी हैं जो मजबूत आरएनजी लागू करते हैं लेकिन बिना getRandomValues() एंट्रॉपी एकत्र करने के लिए यह बहुत कठिन हिस्सा है। यह can be done from mouse & keyboard हालांकि इसमें काफी समय लग सकता है।

Math.random() 2008 में अधिकांश ब्राउज़रों में कमजोर था - Amit Klein's paper उत्कृष्ट विस्तार में जाता है - और दुख की बात आज लगभग कमजोर है। https://lwn.net/Articles/666407/, https://security.stackexchange.com/questions/84906/predicting-math-random-numbers: -:

अद्यतन एक तेजी से संस्करण अच्छा सांख्यिकीय गुण को देखते LFSR पर बहुत कमजोर क्रिप्टोग्राफी द्वारा लेकिन यह भी ऐसा लगता है व्यावहारिक रूप से सभी ब्राउज़रों 2015-2016 में XorShift128+ करने लगे। नीचे दिया गया विवरण पुराना है।

  • फ़ायरफ़ॉक्स ने बहुत कमजोर "हमारे स्वयं के होमब्रू एलएफएसआर" एल्गोरिदम का उपयोग किया; वे 2006 के बाद से एक मजबूत एल्गोरिदम और एन्ट्रॉपी स्रोत पर स्विच करने पर चर्चा कर रहे हैं (bug 322529)। अद्यतन: 2015 में वे XorShift128 + पर स्विच कर दिए गए।

    मई 2013 में उन्होंने कम से कम वर्तमान समय से बीज को अच्छे एंट्रॉपी स्रोतों (bug 868860) में स्विच किया, (क्रॉस-टैब रिसाव को भी हटाया)।

  • वेबकिट एक मजबूत RNG मजबूत ओएस स्रोतों से प्रारंभ से एक कमजोर तेजी से एल्गोरिथ्म (GameRand) since 2009 लेकिन बीज since 2010 (प्रत्येक संदर्भ में) का उपयोग करता है।
    (मुझे लगता है यह है कि क्या सफारी का उपयोग करता है, लेकिन मैं विभिन्न वेबकिट बंदरगाहों के बारे में उलझन हो सकती है ...)

  • Chrome वेबकिट के यादृच्छिक, वी 8 में करता है अपने आप ही, a weak linear thing उपयोग नहीं करता।
    कोई समझौता नहीं है कि Math.random() मजबूत होना चाहिए (bug 246054)।

    यह सुनिश्चित नहीं है कि यह कैसे बीजित है। वी 8 में SetEntropySource() हुक है, लेकिन स्पष्ट रूप से यह केवल introduced for unit testing था, जिसे क्रोम द्वारा नहीं कहा जाता था। यदि नहीं कहा जाता है, तो बीजिंग के लिए random() का उपयोग किया जाता है।

    राज्य प्रति संदर्भ in 2011 बन गया लेकिन यह कमजोर बीजिंग के साथ बहुत उपयोगी नहीं है।

  • ओपेरा ने इसे fixed in Jan 2009 और say here घोषित किया कि उनके Math.random() क्रिप्टोग्राफ़िक रूप से मजबूत हैं।

  • आईई आजकल क्या करता है पर दस्तावेज़ीकरण नहीं मिला। 2008 में उनके पास एक कमजोर रैखिक पीआरएनजी था (पेपर देखें)। वे अमित बताते हैं कि वे एक सर्विस पैक में इसे ठीक कर देंगे, तो कहीं न कहीं एक सलाहकार हो सकता था ...

+0

इस तरह की चीज में कोई समस्या नहीं है कि जेएस में कुछ भी ज्यादा ओवरराइड कर सकता है? – Phil

+0

आपके लक्ष्यों पर निर्भर करता है। साइट लेखक केवल ज्ञात विश्वसनीय जेएस कोड (उदाहरण के लिए सीडीएन से jQuery लोड नहीं करते हैं, इसे स्वयं सेवा करते हैं, केवल पाठ्यक्रम के https) ही सेवा कर सकते हैं। लेकिन जब उपयोगकर्ता सर्वर पर भरोसा नहीं करना चाहते हैं, [ब्राउज़र ऐप्स बहुत अधिक व्यर्थ दिशा हैं] (http://tonyarcieri.com/whats-wrong-with-webcrypto)। –

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