हिन्दी

डेवलपर टूल · UUID जनरेटर

Math.random बनाम crypto.getRandomValues: प्रत्येक जनरेटर कैसे काम करता है

· यह काम किस प्रकार करता है

uuid क्रिप्टोग्राफी ब्राउज़र-एपिस

दो यादृच्छिक जनरेटर अगल-बगल: Math.random एक नियतात्मक राज्य मशीन के रूप में बनाम crypto.getRandomValues ऑपरेटिंग सिस्टम एन्ट्रापी द्वारा पोषित
मूल ToolAcre वेक्टर चित्रण

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

फ़ोरम स्निपेट जो Math.random से UUID बनाता है - यह ठीक क्यों दिखता है और हर आकस्मिक परीक्षण पास करता है

एक फ़ोरम उत्तर आठ पंक्तियों में एक त्वरित UUID फ़ैक्टरी प्रदान करता है: Math.random से मानों को रोल करें और उन्हें 8-4-4-4-12 लेआउट में प्रारूपित करें। कोड ठीक दिखता है और हर आकस्मिक परीक्षण पास करता है। प्रत्येक पहचानकर्ता अलग दिखाई देता है, और एक छोटा नमूना कोई स्पष्ट दृश्य पैटर्न नहीं दिखाता है। यह वह संपत्ति नहीं है जिसकी सुरक्षा-संवेदनशील पहचानकर्ता को आवश्यकता होती है। JavaScript Math.random को छद्म-यादृच्छिक स्रोत के रूप में निर्दिष्ट करता है लेकिन भविष्यवाणी के लिए क्रिप्टोग्राफ़िक प्रतिरोध की आवश्यकता नहीं होती है। इसके उपयुक्त कार्यों में सिमुलेशन, गेम और शफ़लिंग शामिल हैं। एक बार जब कोई पहचानकर्ता पहुंच, वस्तु खोज या किसी अन्य प्रतिकूल निर्णय को प्रभावित कर सकता है, तो उपस्थिति अब सबूत नहीं है। जनरेटर का प्रलेखित अनुबंध विश्वसनीय दिखने वाले आउटपुट के एक पेज से अधिक मायने रखता है।

Math.random के अंदर - एक निश्चित आंतरिक स्थिति वाला एक बीजित छद्म-यादृच्छिक एल्गोरिदम, जो गति और सांख्यिकीय प्रसार के लिए डिज़ाइन किया गया है, गोपनीयता के लिए नहीं

चूँकि Math.random को क्रिप्टोग्राफ़िक जनरेटर के रूप में निर्दिष्ट नहीं किया गया है, इसलिए इसके आउटपुट को इस बात का सबूत नहीं माना जाना चाहिए कि भविष्य के मूल्य पर्यवेक्षक से छिपे हुए हैं। crypto.getRandomValues का एक अलग प्लेटफ़ॉर्म अनुबंध है: यह एक पूर्णांक टाइप किए गए सरणी को क्रिप्टोग्राफ़िक रूप से मजबूत मानों से भरता है। Web Crypto विनिर्देश उपयोगकर्ता एजेंट के लिए सटीक जनरेटर छोड़ता है, इसलिए एप्लिकेशन कोड को किसी विशेष एल्गोरिदम, बीज आकार या एन्ट्रॉपी डिवाइस का दावा नहीं करना चाहिए। ToolAcre को केवल समर्थित सीमा की आवश्यकता है: ब्राउज़र सुरक्षित यादृच्छिक बाइट्स की आपूर्ति करता है, JavaScript भरे हुए Uint8Array को प्राप्त करता है, और UUID कोड संस्करण और वैरिएंट फ़ील्ड सेट करता है। यह कथन उन ब्राउज़रों में उपयोगी और पोर्टेबल दोनों है जिनके आंतरिक कार्यान्वयन भिन्न हैं।

आउटपुट का अवलोकन करने से स्थिति का पता क्यों चल सकता है - कैसे एक छोटे राज्य का मतलब है कि मूल्यों का एक क्रम किसी को अगले मूल्यों की भविष्यवाणी करने दे सकता है

एप्लिकेशन कोड JavaScript PRNG स्थिति को लागू करने या प्रदर्शित करने के बजाय getRandomValues ​​से क्रिप्टोग्राफ़िक रूप से मजबूत मान प्राप्त करता है। सुरक्षा अंतर वास्तविक प्रणालियों में दिखाई देता है। Math.random से निर्मित एक पहचानकर्ता अनुपयुक्त है जहां भविष्यवाणी के परिणाम होंगे क्योंकि नेटवर्क को पढ़ने की क्षमता वाला एक हमलावर (या कोई भी सिस्टम जहां पिछले UUID दिखाई दे रहे हैं) अगले की भविष्यवाणी कर सकता है। crypto.getRandomValues से एक v4 UUID अपने आप में एक प्रमाणीकरण टोकन नहीं है (आपको अभी भी समाप्ति, हैशिंग, दर-सीमित करने की आवश्यकता है), लेकिन जनरेटर को भविष्यवाणी का विरोध करने के लिए डिज़ाइन किया गया है। ToolAcre यदि सुरक्षित स्रोत अनुपस्थित है, तो चुपचाप पूर्वानुमानित सूत्र में अपग्रेड करने के बजाय, पहचानकर्ता उत्पन्न करने से इंकार कर दिया जाता है। Math.random को प्रमुख इंजनों में सूक्ष्म वितरण बग के साथ भेजा गया है। गुप्त-असर वाली भूमिकाओं के लिए आवश्यक प्रतिकूल अप्रत्याशितता प्रदान किए बिना आउटपुट अनुक्रम भिन्न दिख सकता है।

crypto.getRandomValues के अंदर - ब्राउज़र ऑपरेटिंग सिस्टम के CSPRNG से पूछता है, जो हार्डवेयर और सिस्टम एन्ट्रॉपी को मिश्रित करता है और अप्रत्याशित होने के लिए डिज़ाइन किया गया है

इंजन-विशिष्ट एल्गोरिदम और उनका सांख्यिकीय व्यवहार बदल सकता है; न तो दृश्य निरीक्षण और न ही आकस्मिक वितरण परीक्षण Math.random को क्रिप्टोग्राफ़िक स्रोत में अपग्रेड करता है। टकराव की गणना भी बताए गए स्थान से स्वतंत्र आउटपुट मानती है। यदि कोई जनरेटर स्थिति को दोहराता है, गलत तरीके से बीजित किया जाता है या एक नियतात्मक स्थिरता के साथ प्रतिस्थापित किया जाता है, तो वह धारणा विफल हो गई है और सूत्र अब कार्यान्वयन का वर्णन नहीं करता है। दोनों APआई ऐसे तार उत्पन्न कर सकते हैं जो समान रूप से अनियमित दिखते हैं। खतरा मॉडल उन्हें अलग करता है: वे मान जिन्हें भविष्यवाणी का विरोध करना चाहिए वे crypto.getRandomValues का उपयोग करते हैं, जबकि सिमुलेशन और गैर-प्रतिकूल फेरबदल Math.random का उपयोग कर सकते हैं। चयन भविष्यवाणी के परिणाम से होता है, न कि किसी नमूने में विराम चिह्न या स्पष्ट विविधता से।

कार्यान्वित उदाहरण - प्रत्येक विधि के साथ समान संख्या में पहचानकर्ता उत्पन्न करना और एक पर्यवेक्षक जो अनुमान लगा सकता है उसकी तुलना करना

ToolAcre UUID जनरेटर विशेष रूप से crypto.getRandomValues का उपयोग करता है; यह कभी भी Math.random का उपयोग नहीं करता है क्योंकि पूर्वानुमानित UUID की लागत हमेशा थोड़े धीमे जनरेटर की लागत से अधिक होती है। क्रिप्टोग्राफ़िक अंतर को खतरे के मॉडल के माध्यम से मापा जा सकता है। एक हमलावर जो UUID बनाना चाहता है, उसे या तो सीधे पहचानकर्ता का अनुमान लगाना होगा या यादृच्छिक-संख्या जनरेटर को तोड़ना होगा। प्रत्यक्ष अनुमान लगाना वह तुलना नहीं है जिसे यह लेख परिमाणित करता है; समर्थित निष्कर्ष यह है कि Web Crypto क्रिप्टोग्राफ़िक यादृच्छिकता के लिए अभिप्रेत है जबकि Math.random नहीं है। CSPRNG और Math.random विभिन्न अनुबंधों को उजागर करते हैं: पूर्व को सुरक्षा-संवेदनशील यादृच्छिकता के लिए डिज़ाइन किया गया है, जबकि बाद वाले में ऐसा कोई वादा नहीं है। एक सिस्टम जो पहचानकर्ताओं के लिए Math.random का उपयोग करता है, उसने क्रिप्टोग्राफ़िक संपत्ति खो दी है; सुरक्षा अब उत्पन्न UUID के अनुक्रम को गुप्त रखने पर निर्भर करती है। यदि एक भी UUID लीक होता है, तो आने वाली पूरी पीढ़ी खतरे में पड़ जाती है।

ऐतिहासिक वितरण बग - एक अनुस्मारक कि इंजनों ने स्पष्ट रूप से असमान आउटपुट के साथ Math.random कार्यान्वयन भेज दिया है, गुणात्मक रूप से वर्णित है

यदि एप्लिकेशन UUID को लॉग, डेटाबेस या संस्करण नियंत्रण इतिहास में संग्रहीत करता है, तो रिसाव लगभग अपरिहार्य है। ToolAcre लाइब्रेरी crypto.getRandomValues के उपयोग को लागू करती है और यदि सुरक्षित संदर्भ (HTTPS या लोकलहोस्ट) उपलब्ध नहीं है, तो UUID उत्पन्न करने से इंकार कर देती है। यह डिज़ाइन निर्णय Math.random पर मौन फ़ॉलबैक को रोकता है जिसने कई हस्त-चालित कार्यान्वयनों को प्रभावित किया है। Node.js में, लाइब्रेरी क्रिप्टो मॉड्यूल का उपयोग करती है; ब्राउज़र में, यह Web Crypto API का उपयोग करता है। दोनों समर्थित पथ प्लेटफ़ॉर्म से क्रिप्टोग्राफ़िक रूप से मजबूत यादृच्छिकता का अनुरोध करते हैं। कार्यान्वयन कोई प्रदर्शन का दावा नहीं करता क्योंकि इंजन, टूल और कार्यभार समय निर्धारित करते हैं; सुरक्षा अनुबंध पहचानकर्ताओं के लिए निर्णायक संपत्ति है। उद्योग मानक crypto.getRandomValues पर क्यों तय किया गया, यह UUID के दुरुपयोग का एक संक्षिप्त इतिहास है। प्रारंभिक सिस्टम पहचानकर्ता उत्पन्न करने के लिए सिस्टम समय, नेटवर्क इंटरफेस और हार्डवेयर घड़ियों का उपयोग करते थे।

इसमें क्या शामिल नहीं है - सिमुलेशन के लिए किसी भी जनरेटर की सांख्यिकीय गुणवत्ता, जो अप्रत्याशितता से एक अलग प्रश्न है

समय-आधारित, नोड-आधारित और यादृच्छिक UUID संस्करण विभिन्न आवंटन समस्याओं का समाधान करते हैं; प्रत्येक पूर्ववर्ती डिज़ाइन के लिए एक रैखिक मरम्मत के रूप में प्रस्तुत नहीं किया जाना चाहिए। संस्करण 4 के लिए, RFC 9562 यादृच्छिक फ़ील्ड को परिभाषित करता है और अकल्पनीयता पर अलग से चर्चा करता है। इसलिए Math.random से दूर माइग्रेशन पाठ्य UUID आकार को बदले बिना नव निर्मित मूल्यों की गुणवत्ता को बदल देता है। मौजूदा पहचानकर्ता डेटाबेस कुंजियाँ बने रहते हैं; उन्हें पुनर्जीवित करने से संदर्भ टूट जाएंगे। नए मान तुरंत Web Crypto का उपयोग कर सकते हैं, जबकि प्राधिकरण को प्रत्येक पुराने या नए UUID को अनुमति के प्रमाण के बजाय एक पहचानकर्ता के रूप में मानना ​​जारी रखना चाहिए। कटऑफ का दस्तावेजीकरण करें ताकि घटना के उत्तरदाताओं को पता चले कि किस जनरेटर ने प्रत्येक आबादी का उत्पादन किया।

टेकअवे: जनरेटर को खतरे के आधार पर चुनें, दिखावे के आधार पर नहीं - ToolAcre UUID जनरेटर विशेष रूप से CSPRNG का उपयोग करता है, कभी भी Math.random() का उपयोग नहीं करता है

सत्यापन को विरासत (गोपनीयता के लिए उपयुक्त नहीं) और नई (CSPRNG-समर्थित) ID के बीच अंतर करना चाहिए। दस्तावेज़ीकरण में परिवर्तन को नोट करना चाहिए। ToolAcre जनरेटर केवल crypto.getRandomValues UUIDs उत्पन्न करता है; यह अन्य स्रोतों से पहचानकर्ताओं को मान्य या पुन: उत्पन्न करने का प्रयास नहीं करता है। ToolAcre जनरेटर कमजोर यादृच्छिक स्रोत पर डाउनग्रेड करने से इनकार करके सर्वोत्तम अभ्यास प्रदर्शित करता है। यदि crypto.getRandomValues उपलब्ध नहीं है, तो टूल चुपचाप Math.random का उपयोग करने के बजाय एक त्रुटि की रिपोर्ट करता है। यह डिज़ाइन सिद्धांत किसी भी सुरक्षा-महत्वपूर्ण प्रणाली पर लागू होता है: कमजोर सुरक्षा गारंटी के साथ चुपचाप सफल होने के बजाय जोर-शोर से असफल होना। एक डेवलपर जो देखता है कि "UUID पीढ़ी विफल: क्रिप्टो API उपलब्ध नहीं है" को अंतर्निहित समस्या का समाधान करना होगा (HTTPS में अपग्रेड करें, सुरक्षित संदर्भ ठीक करें, या उचित फ़ॉलबैक प्रदान करें)। एक डेवलपर जो चुपचाप Math.random से निर्मित UUID प्राप्त करता है, उसके पास कोई संकेत नहीं है कि सिस्टम से समझौता किया गया है। ToolAcre लाइब्रेरी सुविधा से अधिक ईमानदारी को प्राथमिकता देती है।