486 / 736SEED-GEN

Seed Generation

वॉलेट सीड बनाना

नया वॉलेट बनाते समय उसके बैकअप शब्द ऐसी यादृच्छिकता से आने चाहिए जिसका कोई दूसरा अनुमान न लगा सके। Seed Generation इसी गुप्त आधार को बनाने और उसे आगे तैयार करने की प्रक्रिया है। वॉलेट का सही संख्या वाले शब्द स्वीकार कर लेना यह साबित नहीं करता कि उनका उपयोग सुरक्षित है।

आम BIP39 प्रक्रिया में यादृच्छिक डेटा से बैकअप शब्द, यानी Seed Phrase बनती है। इन शब्दों और वैकल्पिक passphrase, यानी एक अतिरिक्त पासवर्ड से सीड बनता है। सीड वह गुप्त डेटा है जिससे BIP32 वॉलेट की कुंजियों का एक पेड़ तैयार कर सकता है। यादृच्छिक डेटा, शब्द, सीड और कुंजियाँ एक ही प्रक्रिया के अलग चरण हैं। दूसरे बैकअप प्रारूप अलग ढंग से काम कर सकते हैं।

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

वॉलेट को वास्तव में यादृच्छिक डेटा मिलना चाहिए, केवल सही नाम का फ़ंक्शन बुलाना पर्याप्त नहीं है। उदाहरण के लिए Linux का getrandom() सामान्य सेटिंग में सिस्टम स्रोत तैयार होने तक इंतज़ार करता है। GRND_NONBLOCK विकल्प के साथ वह इंतज़ार करने के बजाय EAGAIN दे सकता है: डेटा अभी उपलब्ध नहीं है। प्रोग्राम को नतीजे और मिली हुई बाइटों, यानी डेटा की इकाइयों की संख्या जाँचनी चाहिए। विफलता के बाद भी गुप्त इनपुट तैयार मानकर आगे बढ़ने से ऐसा वॉलेट बन सकता है जो दिखने में काम करे, लेकिन सुरक्षित न हो। [2]

ब्राउज़र भी सुरक्षित यादृच्छिक डेटा पाने का इंटरफ़ेस देते हैं। Web Crypto getRandomValues() पूर्णांकों के ऐरे में क्रिप्टोग्राफ़िक रूप से सुरक्षित बाइट भरता है; 65536 बाइट से अधिक माँगने पर QuotaExceededError आता है। लेकिन यह एक फ़ंक्शन का गुण है, पूरी वेबसाइट की सुरक्षा का प्रमाण नहीं। कोई पेज अच्छे यादृच्छिक डेटा पाने के बाद भी बैकअप शब्द लीक कर सकता है। इसलिए लोड किए गए कोड और नतीजे के उसके इस्तेमाल की भी जाँच ज़रूरी है। [3]

कोई शब्द गलत उतारने पर वॉलेट चेकसम की मदद से गलती पहचान सकता है। चेकसम मूल डेटा से निकाली गई एक छोटी जाँच है। BIP39 में 128 इनपुट बिट के साथ 4 जाँच बिट जुड़कर 12 शब्द बनते हैं; 256 बिट में 8 जाँच बिट जुड़कर 24 शब्द बनते हैं। बिट सूचना की मूल इकाई है। जाँच बिट SHA256 से निकले डेटा के फ़िंगरप्रिंट से आते हैं, नई स्वतंत्र एंट्रॉपी से नहीं। इसलिए सही चेकसम यह नहीं बताता कि शब्द गुप्त हैं या सुरक्षित तरीके से बनाए गए थे। [1]

शब्द बैकअप के लिए सुविधाजनक हैं, लेकिन सॉफ़्टवेयर को उनसे ठीक-ठीक निर्धारित डेटा चाहिए। BIP39 इसके लिए PBKDF2-HMAC-SHA512 नाम की डेरिवेशन फ़ंक्शन को 2048 बार दोहराकर 512-बिट सीड बनाता है। वाक्यांश के साथ salt नाम का एक पैरामीटर लगता है: यहाँ शाब्दिक टेक्स्ट mnemonic के बाद passphrase जोड़ी जाती है, या उसके इस्तेमाल न होने पर खाली स्ट्रिंग। वाक्यांश और इस पैरामीटर को UTF-8 NFKD में तैयार किया जाता है, जिससे अक्षरों का निरूपण एकसमान रहे। लंबा आउटपुट गायब यादृच्छिकता पैदा नहीं करता: उसकी लंबाई 512 बिट इनपुट एंट्रॉपी का प्रमाण नहीं है। [1]

अगला चरण BIP32 बताता है। यह एक मास्टर निजी कुंजी और chain code निकालता है। chain code आगे की कुंजियाँ निकालने में काम आने वाला सहायक डेटा है। इस तरह वॉलेट एक साझा आधार से नए पते बना सकता है। तकनीकी रूप से इसमें HMAC-SHA512 को Bitcoin seed के निश्चित टेक्स्ट के साथ चलाया जाता है; यह टेक्स्ट उस फ़ंक्शन की कुंजी होता है और नतीजे को बाँटा जाता है। यह सार्वजनिक टेक्स्ट आपका रहस्य नहीं है। निकली निजी कुंजी शून्य या अनुमत सीमा से बाहर हो तो अमान्य है। इसलिए सीड का नाम बदलकर उसे निजी कुंजी नहीं कहा जाता। [4]

डेवलपर को पता होना चाहिए कि उसका प्रोग्राम सही गणना करता है या नहीं। टेस्ट वेक्टर इसके लिए ज्ञात इनपुट और अपेक्षित नतीजे देते हैं। BIP39 एंट्रॉपी, शब्द और सीड वाले सेट प्रकाशित करता है, जिनमें टेस्ट passphrase TREZOR इस्तेमाल होती है। नतीजा मिलना उस इनपुट का सही रूपांतरण दिखाता है; इससे यह सिद्ध नहीं होता कि असली जनरेटर अप्रत्याशित रहस्य बना रहा है। टेस्ट डेटा सार्वजनिक होता है, इसलिए उसे वास्तविक धन के लिए गुप्त बैकअप की तरह इस्तेमाल नहीं करना चाहिए। [1]

यादृच्छिकता के स्रोत से शब्दों और फिर बैकअप के भंडारण तक कई चरण जुड़े होते हैं। NIST SP 800-90C बताता है कि एंट्रॉपी स्रोतों को यादृच्छिक डेटा बनाने वाली व्यवस्थाओं से कैसे जोड़ा जाता है। वॉलेट के मूल्यांकन में सॉफ़्टवेयर का वास्तविक संस्करण, त्रुटियों का प्रबंधन और चरणों के बीच डेटा का हस्तांतरण भी जाँचना चाहिए। अच्छी तरह जाँचा गया एक घटक यह गारंटी नहीं देता कि दूसरा घटक रहस्य न तो खोएगा, न उजागर करेगा। मकसद पूरी प्रक्रिया को देखना है, केवल भरोसेमंद लगने वाला एक नाम ढूँढना नहीं। [5]

पूरी तस्वीर के लिए इस प्रविष्टि के साथ यह भी पढ़ें Random Number Generator, BIP 39, HD Wallet, Seed Phrase. इस प्रविष्टि का उल्लेख यहाँ भी है Random Number Generator, CSPRNG, Deterministic RNG, Entropy Mixing.

DOC · 001BIP39 — Mnemonic generation and seed conversionविनिर्देश DOC · 002Linux getrandom — Initialization and return valuesदस्तावेज़ DOC · 003W3C Web Crypto — getRandomValues contractविनिर्देश DOC · 004BIP32 — Master key generationविनिर्देश DOC · 005NIST SP 800-90C — Random bit generator constructionsविनिर्देश
समीक्षा की गई: स्रोत पहले · यह निवेश सलाह नहीं है