У поширеній процедурі 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.