486 / 736SEED-GEN

Seed Generation

Генерування seed гаманця

Коли ви створюєте гаманець, слова його резервної копії мають походити з випадкових даних, яких ніхто інший не може передбачити. Seed Generation — це створення й обробка такої таємної основи. Якщо гаманець прийняв послідовність із правильною кількістю слів, це ще не означає, що нею безпечно користуватися.

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

Уявіть, що для зручного запам’ятовування резервної копії ви обрали слова з улюбленої книжки. Вам вони можуть здаватися незвичними, але зловмисник може перевіряти саме цитати й знайомі людські шаблони. Тому BIP39 починає з випадкових даних, створених комп’ютером, і лише потім записує їх словами. Їхню непередбачуваність описує ентропія. Слова роблять таємні дані зручними для читання, а не пропонують скласти власне речення. [1]

Гаманець має справді отримати випадкові дані, а не просто викликати функцію з правильною назвою. Наприклад, Linux надає getrandom(), яка за замовчуванням чекає готовності системного джерела. З параметром GRND_NONBLOCK вона може натомість повідомити EAGAIN: дані поки недоступні. Програма повинна перевірити результат і кількість отриманих байтів, тобто одиниць даних. Продовження після помилки, наче таємні вхідні дані успішно створені, може дати зовні працездатний, але незахищений гаманець. [2]

Браузери також мають інтерфейс для безпечних випадкових даних. Web Crypto getRandomValues() заповнює масив цілих чисел криптографічно безпечними байтами; запит понад 65536 байтів завершується помилкою QuotaExceededError. Але це опис однієї функції, а не підтвердження безпеки всього сайту. Сторінка може отримати якісні випадкові дані, а потім розкрити слова резервної копії. Тому потрібно перевіряти й завантажений код та його роботу з результатом. [3]

Якщо ви неправильно переписали слово, гаманець може помітити помилку за контрольною сумою: короткою перевіркою, обчисленою з початкових даних. BIP39 додає 4 контрольні біти до 128 вхідних бітів і отримує 12 слів; 256 бітів із 8 контрольними бітами дають 24 слова. Біт — базова одиниця інформації. Контрольні біти походять із відбитка даних, обчисленого функцією SHA256, а не з додаткової незалежної ентропії. Правильна сума не доводить, що слова таємні або створені безпечно. [1]

Слова зручні для резервної копії, але програмі потрібно перетворити їх на точно визначені дані. BIP39 використовує функцію виведення PBKDF2-HMAC-SHA512 з 2048 повтореннями й отримує seed завдовжки 512 бітів. Окрім фрази, використовується параметр salt: тут це буквальний текст mnemonic із доданою passphrase або порожнім рядком, якщо її немає. Фраза й цей параметр обробляються у форматі UTF-8 NFKD, який уніфікує подання символів. Довший результат не створює відсутньої випадковості: його довжина не доводить 512 бітів вхідної ентропії. [1]

Наступний крок описує BIP32. Він виводить головний приватний ключ і chain code — допоміжні дані для виведення подальших ключів. Так гаманець може створювати нові адреси зі спільної основи. Технічно застосовується HMAC-SHA512 із фіксованим текстом Bitcoin seed як ключем цієї функції, після чого результат розділяється. Цей публічний текст не є вашим секретом. Виведений приватний ключ, що дорівнює нулю або виходить за дозволений діапазон, недійсний. Отже, seed не просто перейменовують на приватний ключ. [4]

Розробникам потрібно знати, чи правильно програма виконує обчислення. Для цього є тестові вектори: відомі вхідні дані та очікувані результати. BIP39 публікує набори з ентропією, словами й seed, зокрема з тестовою 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Специфікація
Переглянуто: Спочатку джерела · Не інвестиційна порада