PBKDF2 का पूरा नाम Password-Based Key Derivation Function 2 है। यह पासवर्ड वाले इनपुट और salt नाम के अतिरिक्त पैरामीटर से एक कुंजी निकालता है। परिणाम दोहराव की संख्या, इस्तेमाल होने वाले गणना-फ़ंक्शन और माँगी गई लंबाई पर भी निर्भर करता है। इनपुट और सेटिंग समान हों तो परिणाम भी समान होता है। BIP39 खास तौर पर PBKDF2-HMAC-SHA512 इस्तेमाल करता है; दूसरे उपयोगों में पैरामीटर अलग हो सकते हैं।
रिकवरी के शब्द password नाम का इनपुट बनते हैं। Salt दूसरा इनपुट है: ठीक "mnemonic" लिखा हुआ पाठ, जिसके तुरंत बाद passphrase, यानी वैकल्पिक अतिरिक्त पासवर्ड, जुड़ता है। बीच में कोई विभाजक या बैकअप शब्दों की दूसरी प्रति नहीं जोड़ी जाती। Passphrase न हो तब भी salt "mnemonic" रहता है, खाली पाठ नहीं बनता। दोनों इनपुट पर NFKD लागू होता है, जो अक्षरों को दर्शाने के कुछ अलग तरीकों को एक समान करता है; फिर UTF-8 एन्कोडिंग होती है। BIP39 में HMAC-SHA512, 2048 दोहराव और 64 बाइट, यानी 512 बिट, का आउटपुट तय है। यही परिणाम seed है। Salt कोई अलग बैकअप नहीं है जिसे आपको बनाना पड़े। [1]
अंदर HMAC इस्तेमाल होता है, जो एक कुंजी और संदेश को मिलाकर गणना करता है। हर दौर में वही पासवर्ड इनपुट कुंजी बना रहता है। पहले मध्यवर्ती परिणाम में salt और आउटपुट ब्लॉक का क्रमांक इस्तेमाल होता है; अगले दौर पिछले मध्यवर्ती परिणाम को संसाधित करते हैं। परिणामों को XOR से जोड़ा जाता है, जो समान स्थान वाले बिटों पर काम करने वाली क्रिया है। HMAC-SHA512 से 64 बाइट मिलते हैं, इसलिए BIP39 के लिए ऐसा एक ब्लॉक पर्याप्त है। पाठ पर केवल SHA-512 को 2048 बार लागू करना अलग गणना होगी और उसका परिणाम भी अलग होगा। [2] [1]
मान लीजिए आप दूसरे वॉलेट में रिकवरी कर रहे हैं। वही seed पाने के लिए उसे समान सामान्यीकृत डेटा और समान सेटिंग चाहिए। तय 2048 दोहराव बढ़ाने से रिकवरी बेहतर नहीं होती: इससे BIP39 का तरीका बदल जाता है और दूसरा परिणाम मिलता है। शब्दों को किसी दूसरी शब्द-सूची की भाषा में अनुवाद करना भी ऐसा बदलाव नहीं है जिसका कोई असर न हो। रिकवरी के लिए मेल चाहिए, एल्गोरिदम में अपना संशोधन नहीं। [1]
गणना दोहराने से हर कोशिश महँगी होती है, लेकिन नई स्वतंत्र यादृच्छिकता पैदा नहीं होती। अगर हमलावर आपके शब्द जानता है और उसके पास सही वॉलेट पहचानने की जानकारी भी है, तो वह अपने कंप्यूटर पर ऑफलाइन कमज़ोर passphrase आज़मा सकता है। इसलिए 512 बिट लंबा seed अपने आप में 512 बिट की अप्रत्याशितता नहीं बताता। इसी तरह 2048 नए सिस्टमों के लिए कोई सामान्य सिफारिश नहीं है; यहाँ यह एक खास रिकवरी मानक का हिस्सा है। [2] [1]
BIP39 का checksum गलत लिखे गए शब्द पकड़ने में मदद करता है। PBKDF2 दूसरे सवाल का जवाब देता है: दिए गए इनपुट से seed कैसे निकाला जाए? यह गणना अपने आप पुष्टि नहीं करती कि passphrase आपके मूल वॉलेट की ही है। इसके बाद, उदाहरण के लिए, BIP32 seed से कुंजियों का पूरा परिवार निकाल सकता है। लिखे हुए रिकॉर्ड की जाँच, उसे seed में बदलना और कुंजियाँ बनाना जुड़े हुए चरण हैं, लेकिन एक-दूसरे की जगह नहीं ले सकते। [1]
डेवलपर सार्वजनिक टेस्ट वेक्टरों से परिणाम मिला सकता है: यानी ऐसे ज्ञात इनपुट जिनके अपेक्षित आउटपुट भी दिए गए हों। BIP39 मूल यादृच्छिक डेटा, शब्द और टेस्ट passphrase TREZOR के लिए पूरा seed प्रकाशित करता है। सही कार्यान्वयन को NFKD के नियमों सहित वही परिणाम देना चाहिए। इस परीक्षण के लिए आपका असली बैकअप आवश्यक नहीं है। सार्वजनिक उदाहरणों में कभी पैसे न रखें, क्योंकि उन्हें हर कोई जानता है। गणना का परीक्षण सफल होना पूरे ऐप की सुरक्षा का प्रमाण भी नहीं है। [1]
पूरी तस्वीर के लिए इस प्रविष्टि के साथ यह भी पढ़ें BIP 39, BIP39 passphrase, Seed Generation, HD Wallet. इस प्रविष्टि का उल्लेख यहाँ भी है BIP39 passphrase.