کد کلمههای یادآور ، توالی کلماتی هستند که کدگذاری شده و یک عدد اتفاقی را ارائه میکنند. این عدد به عنوان یک سید (seed) برای استخراج کیف پول قطعی (deterministic wallet) مورد استفاده واقع میشود. توالی این کلمات برای تولید مجدد سید و در نتیجه استخراج مجدد کیف پول و همه کلیدهای ایجاد شده به کار میرود. اپلیکیشن کیف پول که همه کیف پولهای قطعی را با کلمات یادآور (mnemonic words) را اجرا میکند، به کاربر توالی ۱۲ تا ۲۴ کلمه را در بدو ایجاد کیف پول نشان میدهد. این توالی کلمات در واقع بکآپ کیف پول هستند و با ریکاوری و استخراج مجدد همه کلیدها در کیف پولهای مشابه یا سازگار مورد استفاده قرار میگیرند. کلمات یادآور، بکآپ گیری کیف پول را آسان میکنند چرا که در مقایسه با توالی اعداد، به راحتی خوانده و نوشته میشوند.
کدهای یادآور در BIP-39 تعریف شدهاند. توجه داشته باشید که BIP-39 فقط یک نوع پیادهسازی برای کدهای استاندارد یادآور به حساب میآید. علاوه بر این، یک استاندارد دیگر با توالی کلمات دیگر توسط کیف پول الکتروم Electrum و پیش از BIP-39 به وجود آمده است. BiP-39 توسط شرکت و پس از کیف پول ترزور (Trezor) معرفی شد که با اجرای الکتوم ناسازگار است. به هرحال، BIP-39 توانسته پشتیبانی صنعتی گسترده ای از دهها نوع پیادهسازی گوناگون و سازگار را بدست آورد و میتوان از آن به عنوان یک استاندارد واقعی صنعتی یاد کرد.
BIP-39 استخراج کدهای یادآور و سیدها را تعریف میکند که ما آن را در ۹ مرحله توضیح میدهیم. برای این که بتوانیم این مفاهیم را به درستی تعریف کنیم، این ۹ مرحله را به دو قسمت تقسیم کردیم. مراحل ۱ تا ۶ که قسمت اول به شمار میآید و به آن استخراج کلمات یادآور (Generating mnemonic words) گفته میشود و مراحل ۷ تا ۹ که مربوط به قسمت دوم بوده که به آن از یادآور تا سید (From mnemonic to seed) گفته میشود.
استخراج کلمات یادآور (Generating mnemonic words)
کلمات یادآور به طور خودکار توسط کیف پولی که از روند استانداردسازی شده در قالب BIP-39 استفاده میکند، استخراج میشود. این نوع کیف پول از منبع آنتروپی شروع میکند، الگوریتم مجموع مقابله ای را اضافه میکند و آنتروپی را به کلمات تبدیل میکند:
۱-ایجاد یک توالی اتفاقی (آنتروپی) ۱۲۸ تا ۲۵۶ بیتی
۲- ایجاد مجموع مقابلهای در این توالی اتفاقی از اولین بیت هش SHA256 آن
۳- اضافه کردن مجموع مقابله ای در پایان توالی اتفاقی
۴- تقسیم این توالی در بخشهای ۱۱ بیتی
۵-ترسیم هرکدام از این مقادیر ۱۱ بیتی به یک کلمه از یک دیکشنری از پیش تعریف شده حاوی ۲۰۴۸ کلمه
۶- اکنون کدهای یادآور، توالی کلمات خواهند بود
تصویر پایین نشان میدهد که چگونه انتروپی برای استخراج کلمات یادآور به کار میرود.
جدول پایین ارتباط بین اندازه داده آنتروپی و طول کدهای یادآور در کلمات را نشان میدهد.
از یادآور تا سید (From mnemonic to seed)
کلمات یادآور، آنتروپی با طول ۱۲۸ تا ۲۵۶ بیت را ارائه میکنند. آنتروپی سپس برا استخراج یک سید طولانیتر (۵۱۲ بیتی) از طریق استفاده از تابع کششی کلیدیkey-stretching به نام PBKDF2 مورد استفاده قرار میگیرد.
تابع key-stretching دو پارامتر دارد: mnemonic (یادآور) و salt. هدف salt در تابع key-stretching، سختتر کردن ایجاد تابع جدول جستجو (lookup table) است که فعالسازی حمله جستجوی فراگیر (brute-force attack) را به دنبال دارد. در استانداد BIP-39، پارامتر salt هدف دیگری هم دارد و این هدف ایجاد امکان تعریف عبارات رمزی (رمز عبور) است که به عنوان یک مولفه امنیتی اضافه برای محافظت از سید به کار میرود. این فاکتور امنیتی را به طور کامل و در بخش رمز عبور انتخابیBIP-39 توضیح میدهیم.
روندی که در مراحل ۷ تا ۹ معرفی میشود ادامه روندی است که از مراحل ۱ تا ۶ با نام استخراج کلمات یادآور به آنها پرداختیم.
۷-اولین پارامتر تابع کششیPBKDF2، یادآوری است که در مرحله ۶ ساخته شده است.
۸-پارامتر دوم این تابع salt است. salt از رشته ثابت “mnemonic” تشکیل شده که با یک رشته عبارت رمز عبور انتخابی که توسط کاربر انتخاب شده، مرتبط میشود.
۹- PBKDF2، پارامترهای یادآور و salt را با استفاده از ۲۰۴۸ راند هشینگ همراه با الگوریتم HMAC-SHA512 بسط میدهد و یک مقدار ۵۱۲ بیتی را به عنوان خروجی نهایی ارائه میکند. این مقدار ۵۱۲ بیتی همان سید است.
تصویر پایین نشان میهد که چگونه یادآور برای استخرارج سید مورد استفاده قرار میگیرد.
جدولهای پایین مثالهایی از کدهای یادآور و سیدهایی که تولید میکند را نمایش میدهد (بدون هرگونه رمزورود).
جدول اول کدهای یادآور آنتروپی ۱۲۸ بیتی را بدون رمز عبور و سید حاصلشده نشان میدهد.
جدول دوم کدهای یادآور آنتروپی ۱۲۸ بیتی همراه با رمز ورود و سید ایجاد شده را نمایش میدهد.
جدول سوم، کدهای یادآور آنتروپی ۲۵۶ بیتی را بدون رمز عبور و با سید ایجاد شده نمایش میدهد.
رمز عبور انتخابی در BIP-39
استاندارد BIP-39، استفاده از یک رمز عبور انتخابی را برای استخراج سید امکانپذیر کرده است. اگر رمز عبور مورد استفاده قرار نگیرد، یادآور توسط یک salt حاوی رشته ثابت “mnemonic” کشش پیدا میکند و یک سید ۵۱۲ بیتی را از هر یادآور داده شده تولید میکند. اگر رمز عبور مورد استفاده قرار بگیرد تابع کششی، سید متفاوتی را از یادآور مشابه تولید میکند. در واقع، با وارد کردن یادآور مشخص، هر رمز عبور ممکن میتواند سیدهای متفاوتی را به وجود آورد. اساسا هیچ کلمه عبور اشتباهی وجود ندارد. همه رمز عبورها معتبر هستند و سیدهای مختلفی را به وجود میآورند و نتیجه آن، ایجاد مجموعه وسیعی از کیف پول بدون دادن ارزش آغازی است. مجموعه کیف پولهای ممکن بسیار زیاد است (۲۵۱۲) به طوری که هیچگونه امکان عملی برای حمله جستجوی فراگیر و حدس این که کدام یک مورد استفاده قرار گرفته وجود ندارد.
دو ویژگی مهم و مثبت تعریف رمز عبور
- ایجاد یک مولفه ثانویه (با قابلیت به خاطر سپاری) که یادآور را خود بخود بیاستفاده میکند که نتیجه آن، حفاظت از بکآپ در مقابل دزدهاست.
- ایجاد نوعی انکار موجه و یا کیف پول اجباری برای زمانیست که یک رمز عبور برای یک کیف پول با سرمایه اندک تعریف میشود و هدف از آن، منحرف کردن یک مهاجم از کیف پول واقعی با سرمایه زیاد است.
با وجود نکات مثبت یاد شده، ذکر این نکته نیز لازم است که استفاده از رمز عبور میتواند ریسک گمکردن را به وجود آورد.
اگر صاحب کیف پول ناتوان شده یا فوت کند و هیچ شخص دیگری رمز عبور را نداند، سید بدون مصرف میشود و همه سرمایههایی که در کیف پول وجود دارد برای همیشه از دست میرود.
در مقابل، اگر صاحب کیف پول از رمز عبور در همانجایی که سید وجود دارد بکاپ بگیرد، در واقع هدف مولفه ثانویه را مورد حمله قرار داده است.
اگرچه رمز عبورها بسیار مفید هستند، اما صرفا باید با یک روند برنامهریزی شده دقیق، بکآپ گیری و ریکاوری شده و با در نظر گرفتن احتمال زنده ماندن صاحب کیف پول مورد استفاده واقع شوند و به خانواده صاحب کیف پول این امکان داده شود که بتوانند اموال رمزنگاری شده موجود را ریکاوری کنند.
کارکردن با کدهای یادآور (mnemonic code)
BIP-39 به عنوان یک کتابخوانه برای زبانهای برنامهنوسی مختلف به کار میرود:
یادآور پایتون
پیادهسازی مرجع استاندارد توسط تیم SatoshiLabs که استاندارد BIP-39 را در پایتون ارائه میکند
bitcoinJS BIP39
نوعی پیادهسازی BIP-39 به عنوان جزئی از چهارچوب مشهور bitcoinJS در جاوا اسکریپت
Libbitcoin mnemonic
نوعی پیادهسازی BIP-39 به عنوان جزئی از Libbitcoin معروف در ++C
همچنین یک مولد BIP-39 در صفحات وب تک ایستا (standalone) وجود دارد که برای آزمایش و تجربه بسیار مفید هستند. تصویر پایین یک صفحه تک ایستای وب را نشان میدهد که یادآور، سید و کلیدهای شخصی گسترده شده را تولید میکند.