टोकन जनरेटर

अपने ब्राउज़र में क्रिप्टोग्राफ़िक रूप से मज़बूत यादृच्छिक टोकन, API कुंजियाँ, रहस्य और नॉन्स उत्पन्न करें। लंबाई, वर्ण सेट और उत्पन्न करने की संख्या चुनें।

यादृच्छिक, अप्रत्याशित टोकन। सारी यादृच्छिकता ब्राउज़र के crypto.getRandomValues से आती है, वही स्रोत जिसका ब्राउज़र TLS कुंजियों के लिए उपयोग करते हैं। आपके डिवाइस से कुछ बाहर नहीं जाता।

क्या किसी टोकन को उपयोग के लिए सुरक्षित बनाता है

यादृच्छिक अप्रत्याशित के समान नहीं है

अधिकांश भाषाएँ दो बहुत ही अलग यादृच्छिक संख्या जनरेटर शिप करती हैं। Math.random(), rand() और साथी तेज़ नकली-यादृच्छिक जनरेटर हैं जो क्लॉक जैसी किसी सस्ती चीज़ से बीजित होते हैं। ये एक प्लेलिस्ट को फेंटने के लिए ठीक हैं और किसी टोकन के लिए विनाशकारी, क्योंकि कोई हमलावर जो कुछ आउटपुट देखता है वह अक्सर आंतरिक स्थिति को पुनः प्राप्त कर सकता है और जनरेटर द्वारा कभी भी उत्सर्जित होने वाले हर मान को पुन: उत्पन्न कर सकता है।

एक क्रिप्टोग्राफ़िक रूप से सुरक्षित जनरेटर इस तरह बनाया जाता है कि पिछला आउटपुट देखने से भविष्य के आउटपुट के बारे में कुछ नहीं पता चलता। ब्राउज़र में वह crypto.getRandomValues() है, जो ऑपरेटिंग सिस्टम के एन्ट्रॉपी पूल से खींचता है। यह उपकरण इसी का विशेष रूप से उपयोग करता है। यदि आप अपने स्वयं के कोड में टोकन उत्पन्न कर रहे हैं, तो समकक्ष Python में secrets, Go में crypto/rand और Java में java.security.SecureRandom हैं — कभी भी सादा random मॉड्यूल या Math.random() नहीं।

मॉड्यूलो बायस से बचना

अच्छे यादृच्छिक बाइट्स होना केवल आधा काम है। किसी वर्ण को चुनने का नाइव तरीका bytes[i] % alphabet.length है, जो चुपचाप परिणाम को तिरछा कर देता है जब भी वर्णमाला का आकार 256 को समान रूप से विभाजित नहीं करता। 62-वर्ण वाली वर्णमाला के साथ, पहले 8 वर्ण बाकी की तुलना में थोड़ा अधिक बार आते हैं — एक छोटा बायस, लेकिन यह वास्तविक एन्ट्रॉपी को कम करता है और पूरी तरह से टाला जा सकता है।

सुधार अस्वीकृति नमूनाकरण (rejection sampling) है: किसी भी बाइट को अस्वीकार करें जो अपूर्ण अंतिम ब्लॉक में आता है और फिर से खींचें। यह उपकरण ऐसा करता है, इसलिए चुनी गई वर्णमाला का हर वर्ण समान रूप से संभावित है।

लंबाई चुनना

एन्ट्रॉपी log2(alphabet_size) * length बिट्स है। 62-वर्ण वाली वर्णमाला लगभग 5.95 बिट्स प्रति वर्ण देती है, इसलिए 22-वर्ण टोकन लगभग 131 बिट्स ले जाता है — ब्रूट फ़ोर्स से आराम से परे। वास्तविक पहुँच की रक्षा करने वाली किसी भी चीज़ के लिए, 128 बिट्स सामान्य न्यूनतम हैं; लगभग 64 बिट्स से नीचे, एक दृढ़ एंडपॉइंट वाला कोई निर्धारित हमलावर एक वास्तविक चिंता बन जाता है।

वर्णमाला चयन मुख्य रूप से इस बात पर है कि टोकन कहाँ जाएगा। Base64url और hex URL, फ़ाइल नाम और हेडर को बिना छुए पार कर जाते हैं। अस्पष्टहीन वर्णमाला 0/O और 1/l/I जैसे वर्णों को हटा देती है और इसका उपयोग किसी ऐसी चीज़ के लिए करना चाहिए जिसे कोई इंसान ज़ोर से पढ़ेगा या स्क्रीन से फिर से टाइप करेगा।

ओपन-सोर्स नोट: ब्राउज़र-नेटिव crypto.getRandomValues API के साथ लागू किया गया। कोई तृतीय-पक्ष लाइब्रेरी नहीं।

FAQ

क्या टोकन मेरे डिवाइस पर उत्पन्न होता है?
हाँ, पूरी तरह आपके ब्राउज़र में crypto.getRandomValues() का उपयोग करके। कुछ सर्वर पर नहीं भेजा जाता और कुछ लॉग नहीं किया जाता, इसलिए जो मान आप देखते हैं वह केवल आपको ही पता होता है।
टोकन कितना लंबा होना चाहिए?
पहुँच की रक्षा करने वाली किसी भी चीज़ के लिए, कम से कम 128 बिट्स एन्ट्रॉपी का लक्ष्य रखें: 62-वर्ण वर्णमाला पर 22 वर्ण, या 32 हेक्स वर्ण। गैर-सुरक्षा पहचानकर्ताओं के लिए छोटे मान ठीक हैं।
इसके लिए Math.random() का उपयोग क्यों न करें?
यह एक तेज़ नकली-यादृच्छिक जनरेटर है जो क्लॉक जैसी किसी सस्ती चीज़ से बीजित है। कुछ आउटपुट देखना इसकी स्थिति को पुनः प्राप्त करने और हर भविष्य के मान की भविष्यवाणी करने के लिए पर्याप्त हो सकता है।
अस्पष्टहीन-वर्ण विकल्प किसके लिए है?
यह 0/O और 1/l/I को हटाता है ताकि टोकन बिना प्रतिलेखन त्रुटियों के ज़ोर से पढ़े जाने, कागज़ पर लिखे जाने या स्क्रीन से फिर टाइप किए जाने पर बचा रहे।
क्या मैं इसका उपयोग पासवर्ड रीसेट लिंक के लिए कर सकता हूँ?
हाँ, बशर्ते आप केवल टोकन का हैश संग्रहीत करें, एक छोटी समाप्ति निर्धारित करें और एक बार उपयोग के बाद उसे अमान्य करें। यहाँ की यादृच्छिकता उपयुक्त है; जीवनचक्र आपके एप्लिकेशन का काम है।
क्या कभी वही टोकन वापस आ सकता है?
128 बिट्स एन्ट्रॉपी के साथ एक दोहराव खगोलीय रूप से असंभव है, लेकिन उपकरण कोई इतिहास नहीं रखता, इसलिए वह आपकी ओर से पीढ़ियों के बीच अद्वितीयता सत्यापित नहीं कर सकता।