29 / 736BIP39

BIP 39

Як створюються слова для відновлення гаманця

Слова відновлення дають змогу повернути доступ до гаманця, навіть якщо початковий пристрій зламається. BIP39 описує, як ці слова створюються і як сумісний гаманець знову отримує з них основу для своїх ключів. Відновлення також залежить від passphrase, якщо вона використовувалася, та налаштувань гаманця.

BIP39 — стандарт перетворення випадкових даних на слова відновлення, відомі як Seed Phrase. Із цих слів та необов'язкової passphrase, додаткового секрету, гаманець обчислює seed: початкові дані для створення ключів. Це допомагає зберегти доступ до біткоїнів; самі монети й історія платежів у словах не містяться.

Аліса створює гаманець, який використовує BIP39, і за його інструкціями надійно зберігає слова відновлення. Згодом її телефон ламається. Біткоїни не зникли з мережі: вона втратила пристрій, на якому зберігалися ключі для підписання платежів. На іншому надійному пристрої вона може скористатися відновленням у сумісному гаманці. Ті самі слова в тому самому порядку й та сама passphrase, якщо вона використовувалася, дадуть той самий seed. Подальші процедури знову створять із нього потрібні приватні ключі, а гаманець знайде платежі в мережі Bitcoin. Це не вхід до облікового запису, пароль якого може скинути служба підтримки. Якщо Аліса використовувала passphrase, вона також потрібна; PIN старого телефона її не замінить. Нульовий баланс після відновлення не обов'язково означає втрату монет: крім слів і passphrase, слід перевірити правильність вибору рахунку й налаштувань відновлення. Саме тому варто перевірити весь процес до зберігання значної суми. [1] [5] [13] [14]

Слова легше переписати й перевірити, ніж довгий запис комп'ютерних даних. Marek Palatinus, Pavol Rusnak, Aaron Voisine та Sean Bowe запропонували спосіб подати згенеровану комп’ютером випадковість у формі, зручній для переписування вручну. Пропозиція датована 10 вересня 2013 року й у специфікації має статус Deployed. Слова мають походити з якісних випадкових вхідних даних; не слід вигадувати їх на основі улюбленого речення. Так утворився б Brainwallet із передбачуваним секретом, обраним людиною. Вузли Bitcoin не перевіряють BIP39: вони перевіряють транзакції та блоки, а не спосіб, яким гаманець створив свої ключі. [1]

Хороший запис допоможе лише тоді, коли за ним можна відновити гаманець. Перш ніж зберігати значні кошти, перевірте на надійному пристрої процедуру відновлення, рекомендовану виробником. Крім точного порядку слів, збережіть потрібну passphrase, відомості про гаманець і, за потреби, налаштування деривації або підписання. У звичайному гаманці, де потрібен один підпис, власник повної резервної копії з необхідною passphrase може отримати ключі без початкового пристрою; у разі Multisig потрібно виконати додаткові вимоги до ключів і правил підписання. Фотографії, хмарна копія, принтер або історія буфера обміну можуть розкрити секрети іншим людям і сервісам. Папір і метал мають різні фізичні обмеження; жоден матеріал сам по собі не запобігає крадіжці. [9] [13] [14]

Задля сумісності BIP39 наполегливо рекомендує англійський список слів: багато гаманців не підтримують інші списки. Переклад резервної копії не зберігає початковий гаманець, оскільки в отриманні seed бере участь сама фраза. Зважайте й на інші системи. Electrum для власних резервних копій використовує окрему процедуру версіонування; схожий вигляд слів не робить їх автоматично BIP39. SLIP39 — інший формат із власним списком 1 024 слів і правилами щодо кількості часток, необхідних для відновлення. Це не просте розрізання резервної копії BIP39. Якщо розкласти 24 слова в кілька конвертів, це не буде Shamir Secret Sharing і може погіршити як захист, так і можливість відновлення. Завжди потрібно знати справжній формат резервної копії. [1] [11] [12]

На початку є ентропія, тобто випадкові дані довжиною ENT = 128, 160, 192, 224 або 256 бітів. До них додають контрольну суму: перші CS = ENT/32 бітів результату SHA-256 для початкових даних. Усе разом ділять на групи по 11 бітів, кожна з яких визначає одне слово. Отже, співвідношення MS = (ENT+CS)/11 дає рівно 12, 15, 18, 21 або 24 слова. Дванадцять слів представляють 128 бітів випадковості та 4 контрольні біти; отже, не всі 132 біти є незалежним секретом. Для 24 слів це 256+8 бітів. Довіра до резервної копії починається з генератора випадковості, а не з того, наскільки незвично виглядають слова. [1]

Кожна 11-бітна група вибирає один елемент із впорядкованого списку 2 048 слів. Отже, перше слово — це не перший приватний ключ: усі слова разом записують початкові дані та їхню контрольну суму. В англійському списку для розрізнення слів достатньо перших чотирьох літер. Проте це не загальне правило для будь-якої мови й не вказівка довільно скорочувати резервну копію під час відновлення. Зміна порядку, заміна слова синонімом або переклад змінюють вхідні дані. Іноді виходить неправильна контрольна сума, іноді — інша коректна резервна копія; тому написання та порядок слів слід зберігати точно. [1] [2]

Комп’ютер має знати, які саме символи він отримав. BIP39 вимагає нормалізації Unicode NFKD з подальшим кодуванням UTF-8 як для фрази відновлення, так і для passphrase. NFKD уніфікує деякі різні способи запису символів, наприклад розкладає окремі літери з діакритичними знаками. Тому два різні записи після нормалізації можуть дати однаковий результат; сама візуальна подібність цього не гарантує. Порядок слів, пробіли та символи passphrase й надалі мають значення. Інша процедура нормалізації під час відновлення може дати інший seed. Еталонна реалізація та відкриті тестові вектори допомагають перевірити, чи дотримується програма встановленої процедури. [1] [3] [4]

PBKDF2 отримує два окремі входи. Вхід password складається зі справжніх слів для відновлення. Другий вхід має назву salt і містить додаткові дані для криптографічного обчислення. Тут це буквальний текст «mnemonic», до якого без роздільника додають passphrase. Самі слова для відновлення сюди повторно не вставляють. Обидва входи нормалізують за допомогою NFKD і кодують у UTF-8. BIP39 визначає HMAC-SHA512, 2 048 ітерацій і результат довжиною 512 бітів, тобто 64 байти. Без passphrase значення salt залишається «mnemonic»; порожньою є лише passphrase. Обчислення не розшифровує слова й не створює нової незалежної випадковості. Тому після витоку слів самі ітерації не захистять passphrase, яку легко вгадати. [1] [10]

BIP39 закінчується 64-байтовим seed. Інший стандарт, BIP32, зазвичай за допомогою HMAC-SHA512 із фіксованим ключем «Bitcoin seed» отримує з нього головний приватний ключ і 32-байтовий chain code. Chain code — це додаткові дані, які разом із ключем використовуються для отримання наступних ключів. Ці два елементи стають основою дерева ключів. Правила на кшталт BIP44, BIP49, BIP84 і BIP86 визначають різні шляхи деривації та типи скриптів. Тому під час відновлення ви можете ввести правильні слова й passphrase, але побачити нульовий баланс, якщо програма шукає інший рахунок, іншу гілку або інший тип адрес. Важливий також gap limit — кількість невикористаних адрес поспіль, які програма допускає під час пошуку. Назва початкового гаманця, відомості про рахунки, шляхи деривації або Output Descriptor можуть доповнити інформацію, якої немає в самих словах. [5] [6] [7] [8] [9] [14]

Passphrase є додатковим таємним входом для отримання seed. Це не PIN пристрою, а BIP39 не може повідомити, що ви ввели неправильну passphrase: він обчислить результат і для іншого значення. Помилка введення, яка змінює нормалізований вхід, зазвичай приводить до іншого гаманця, де ви не побачите своїх коштів. Натомість різні записи з однаковим результатом NFKD дають той самий seed. Той, хто отримає слова для відновлення та відомості, за якими можна впізнати потрібний гаманець, може перевіряти варіанти passphrase офлайн. Якщо ви використовуєте passphrase, вона потребує достатньої стійкості, надійного способу введення та власної надійної резервної копії. Окреме зберігання має зменшити ризик одночасної крадіжки обох секретів, а не перетворити passphrase на таємницю, яка зникне разом із вами. [1] [13]

Контрольна сума допомагає виявляти помилки введення, але не доводить, кому належить резервна копія або чи була вона створена безпечно. Для 12 слів вона має 4 біти, а для 24 слів — 8 бітів. Тому рівномірно випадкова послідовність слів із відповідного списку проходить перевірку з імовірністю 1/16 або 1/256 відповідно. Багато помилок буде виявлено, але не всі; сама контрольна сума їх також не виправляє. Зловмисник може створити іншу резервну копію з правильною контрольною сумою. Специфікація вимагає попередження про невідповідність і відокремлює перевірку слів від самого отримання seed. Тому неправильну контрольну суму слід з’ясовувати з урахуванням початкового гаманця та його формату, а не вводити справжню резервну копію в інтернет-сервіс для перевірки. [1]

Приклад · BIP39

Слова, контрольна сума та seed

BIP39 поєднує 128 бітів ентропії з 4 бітами контрольної суми. Отримані 132 біти він ділить на 12 груп по 11 бітів, які вибирають слова зі списку. Потім слова для відновлення утворюють вхід password для PBKDF2-HMAC-SHA512; salt складається з буквального префікса «mnemonic» та необов’язкової passphrase. Після нормалізації NFKD і кодування UTF-8 за 2 048 ітерацій отримують 512-бітний seed. Контрольна сума не додає випадковості.

Для повної картини прочитайте також Seed Phrase, HD Wallet, BIP39 passphrase, Trezor, Bitcoin, BIP39 checksum. На цю статтю також посилаються Seed Phrase, HD Wallet, Cold Storage, BIP (Bitcoin Improvement Proposal).

01Чи є BIP 39 частиною консенсусу Bitcoin?

Ні. Це домовленість між гаманцями щодо запису випадковості та отримання seed. Вузли Bitcoin перевіряють транзакції й блоки, не знаючи, чи створено ключі за допомогою BIP 39.

02Чи кожна фраза з 12 або 24 слів сумісна з BIP 39?

Ні. Самої кількості слів недостатньо: мають збігатися список і порядок слів, контрольна сума, нормалізація NFKD та спосіб отримання seed. Для відновлення початкового гаманця також потрібна правильна passphrase, якщо вона використовувалася, та відповідні шляхи деривації й типи скриптів.

DOC · 001BIP 39 — Mnemonic code for generating deterministic keysСпецифікація DOC · 002BIP 39 official wordlistsСпецифікація DOC · 003Trezor python-mnemonic reference implementationПервинне джерело DOC · 004BIP 39 official test vectorsПервинне джерело DOC · 005BIP 32 — Hierarchical deterministic walletsСпецифікація DOC · 006BIP 44 — Multi-account hierarchyСпецифікація DOC · 007BIP 84 — Native SegWit derivationСпецифікація DOC · 008BIP 86 — Single-key Taproot derivationСпецифікація DOC · 009BIP 380 — Output script descriptorsСпецифікація DOC · 010RFC 8018 — PBKDF2Специфікація DOC · 011Electrum documentation — seed version systemДокументація DOC · 012SLIP 39 — Shamir's Secret-Sharing for Mnemonic CodesСпецифікація DOC · 013Trezor — passphrases and hidden walletsДокументація DOC · 014Bitcoin Core — Output descriptorsДокументація
Переглянуто: Спочатку джерела · Не інвестиційна порада