Розробка мобільного HD-гаманця (BIP-39/BIP-44)

Втрата доступу до коштів через помилки в схемі ключів коштує дорожче за саму розробку. Ми розробляємо мобільні HD-гаманці під ключ: аудит поточної архітектури, схема ключів, перевірка та передача з документацією. Замовник отримує передбачуване відновлення доступу без перевипуску застосунку.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Розробка мобільного HD-гаманця (BIP-39/BIP-44)
Складний
від 1 тижня до 3 місяців
Часті запитання

Чому мобільний HD-гаманець втрачає доступ до коштів

Мобільний HD-гаманець тримає весь доступ до коштів в одному кореневому секреті: з нього детерміновано виводиться ланцюжок ключів на адреси, а мнемонічна фраза залишається єдиним носієм, який можна відновити на іншому пристрої.

Поки застосунок живе на одному телефоні, схема непомітна. Збій проявляється в момент відновлення або оновлення і виглядає як зниклий баланс, хоча кошти нікуди не зникали.

Найчастіша причина — розсинхронізація індексу адрес. Гаманець видає користувачеві нову адресу для отримання, але під час відновлення сканує менше позицій, ніж реально використано, і зупиняється на першому порожньому проміжку.

Транзакції в мережі є, а в інтерфейсі нуль: користувач сприймає це як втрату доступу і приходить із претензією до продукту, а не до власної резервної копії.

Другий клас збоїв — повторно використаний ланцюжок ключів.

Перевстановлення поверх старого профілю, дві копії застосунку, що пишуть в одне локальне сховище, або резервна копія, знята не в повному вигляді, призводять до того, що адреси розходяться, а частина історії залишається за межами поточної гілки.

Галузева норма тут — стандарти родини BIP: вони задають правила виведення, але не захищають від помилок у їх застосуванні.

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

Що змінює переробка архітектури гаманця

Переробка архітектури гаманця змінює те, як HD-гаманець зберігає ключовий матеріал, відновлює стан і синхронізується з мережею. Результат вимірюється в хвилинах простою і в кількості сценаріїв, які перестають бути можливими.

Відновлення доступу за лічені хвилини замість листування з підтримкою

В основі — мнемонічна фраза і детерміноване виведення адрес: користувач вводить її на новому пристрої й отримує той самий набір адрес без звернення до підтримки. Час відновлення доступу падає з годин листування до кількох хвилин. Перевіряємо:

  • Перевстановлення й введення фрази повертають усі адреси та історію операцій; сценарій закритий автотестом на чистому пристрої.
  • Інструкція для випадку «загубив телефон» лежить у застосунку, а не в листуванні з підтримкою.
  • Після повернення в мережу пропущені блоки наздоганяються без ручного втручання.

Усунений клас відмов: витік ключа під час бекапу

Резервне копіювання перестає копіювати приватні ключі: зберігається лише зашифрований контейнер або фраза, яку користувач зберігає окремо. Це знімає цілий клас відмов — компрометацію ключа через хмарні копії та системні знімки пристрою.

Вимоги звіряємо із зовнішніми керівництвами з безпеки, наприклад OWASP Mobile Application Security. Чек-ліст:

  • Ключі не потрапляють у хмарні копії та системні знімки.
  • Стійкість шифрування перевірена тестами на слабкі й повторювані паролі.
  • Відкат на попередню версію застосунку не ламає доступ до створених адрес.

Режими зберігання ключів: порівняння підходів

Режим зберігання приватних ключів задає модель загроз: де живе ключ, хто ним підписує і що станеться в разі компрометації пристрою. Нижче — п’ять варіантів, між якими реально обирають під час проєктування HD-гаманця.

Варіант Коли підходить Обмеження
Ключ у пам’яті застосунку Прототип, закритий контур, немає вимог до стійкості Ключ потрапляє в дамп пам’яті, немає захисту в разі втрати пристрою
Ключ у захищеному сховищі пристрою Масовий гаманець: ключ прив’язаний до пристрою Відновлення лише за мнемонічною фразою, прив’язка до платформи
Винесений підписувач Підпис виноситься в окремий компонент Потрібен захищений канал, зростає затримка підпису
Мультипідпис із розподілом ролей Корпоративні сценарії, одноосібне розпорядження виключено Складніший облік ролей і відновлення в разі втрати частини
Режим лише перегляду Спостереження за балансом та історією без підпису Немає підпису всередині застосунку, залежність від підписувача

Коли який режим виправданий

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

Ціна помилки у виборі режиму

Помилка не видна в тестах: застосунок працює, транзакції проходять. Вона розкривається в момент інциденту — під час втрати пристрою, витоку резервної копії або звільнення співробітника з ключем.

Переробка зачіпає деривацію адрес і міграцію вже створених гаманців, тому режим фіксують до першого релізу.

Етапи робіт: аудит, схема ключів, перевірка, передача

Порядок робіт вибудуваний так, щоб незворотні частини — схема ключів і модуль підпису — проєктувалися вже після того, як ми розуміємо поточне сховище та вимоги до відновлення.

Нижче — послідовність, за якою йде проєкт: кожен етап закінчується артефактом, який можна перевірити до переходу до наступного.

  1. Аудит гаманця. Розбираємо поточне сховище секретів, спосіб отримання адрес, журнали операцій і те, як сьогодні відновлюють доступ у разі втрати пристрою. На виході — карта вузьких місць і перелік рішень, які не можна змінювати після релізу.
  2. Схема ключів. Фіксуємо дерево ключів і шляхи їх отримання, розподіляємо гілки під мережі та типи адрес, описуємо порядок виведення мнемоніки й правила її зберігання. Тут же визначаємо, які ключі взагалі не покидають захищену область пристрою.
  3. Модуль підпису та політики доступу. Реалізуємо підпис транзакцій усередині ізольованого модуля, налаштовуємо ліміти, підтвердження великих операцій і розмежування прав між ролями. Журнал підпису не містить секретів, але дозволяє відновити хронологію подій.
  4. Відновлення та міграція. Описуємо перенесення гаманця на новий пристрій, зміну пароля й коректний відкат до попереднього стану, якщо оновлення перервалося. Перевіряємо, що раніше створені адреси залишаються доступними.
  5. Перевірка на сценаріях збою. Прогоняємо втрату пристрою, обрив зв’язку на середині транзакції, пошкоджене сховище й повторне встановлення застосунку. У кожного сценарію є очікуваний результат і зрозуміла поведінка інтерфейсу.
  6. Передача документації та навчання. Віддаємо схему ключів, політики підпису, інструкції з відновлення та розбір відомих обмежень. Проводимо навчання команди, щоб зміни вносилися за регламентом, а не правкою на ходу.

Артефакти передачі: схеми, політики, регламенти

Передача закінчується не передачею репозиторію. У замовника має залишитися комплект документів, за яким його інженери зможуть зібрати реліз, видати доступ новому співробітнику й відновити гаманець користувача без нас.

Технічна частина

  • Схема ланцюжка ключів: як з мнемонічної фрази виводяться гілки під монети й акаунти, які шляхи вважаються основними, а які зарезервовані під службові адреси.
  • Конфігурація модуля підпису: параметри виведення ключів, режим шифрування локального сховища, правила підтвердження операцій і ліміти, після яких потрібна додаткова згода.
  • Політики доступу до сховища: матриця ролей, за якої підпис і вивантаження резервної копії недоступні одній людині, а дії пишуться в незмінюваний журнал.
  • Інструкція з міграції: порядок перенесення наявних гаманців і повторного введення мнемонічної фрази так, щоб адреси й баланси залишилися попередніми.

Організаційна частина

  • Регламент відновлення доступу: окремі сценарії для загубленого пристрою, забутого пароля й частково втраченої резервної копії — із зазначенням, хто і в який строк виконує кожен крок.
  • Порядок відкликання та ротації ключів: що вважається компрометацією, хто ухвалює рішення про зміну, як виводяться з обігу старі адреси й що відбувається із незавершеними операціями.
  • Чек-ліст релізу: перевірки збірки на тестовій мережі, звірка контрольної суми словника, прогін відновлення з копії, фінальні перевірки перед публікацією в магазинах застосунків.

Комплект ведеться разом із кодом: зміна схеми ключів або політик доступу вимагає правки документа в тому самому зміненні, інакше він втрачає силу.

Кейс: відновлення доступу без перевипуску застосунку

Некастодіальний HD-гаманець зберігає ключі лише на пристрої, тому втрата доступу — це не збій сервера, а сценарій відновлення: мнемонічна фраза, порядок слів, вибір схеми похідних ключів із Bitcoin Improvement Proposals.

Саме на цьому кроці в клієнта накопичувалися проблеми: логіка підпису працювала, а повернути собі гаманець користувач часто не міг.

Що було до

Частка звернень до підтримки щодо втрати доступу займала близько чверті всіх тікетів. Відновлення йшло вручну: листування, скриншоти, інженер звіряв слова й вручну перебирав варіанти схем похідних ключів, відповідаючи в середньому через кілька днів.

З першої спроби доступ повертали менш ніж половині тих, хто звернувся — решта писала повторно, а частина йшла й не поверталася.

Що стало після

Додали покроковий розбір фрази: нормалізація введення, підказки за словником і явна діагностика — яке слово не проходить перевірку й чому. Схема похідних ключів підбирається автоматично за списком відомих, і користувач одразу бачить варіант із ненульовим балансом.

Час відновлення стиснувся до кількох хвилин, частка успішних спроб з першого разу зросла до 96%, обсяг ручних операцій у підтримці впав на порядок.

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

Чим HD-гаманець відрізняється від гаманця з однією адресою

HD-гаманець — це не «багато гаманців в одному», а одне зерно, з якого детерміновано виводиться дерево ключів. Гаманець з однією адресою зберігає єдину пару: змінив адресу — отримав новий гаманець і нову резервну копію.

У HD-гаманці зерно кодується мнемонічною фразою, а ключі виводяться за шляхами — рахунок, монета, гілка, індекс.

Відновлення. Однієї фрази достатньо, щоб повернути все дерево, включно з адресами, які застосунок ще не показував, — і копія не зростає разом з їхньою кількістю.

В одиночного гаманця копія компактна рівно до першої нової адреси: далі її потрібно перевипускати, а попередня версія тихо перетворюється на сміття.

Приватність транзакцій. Одна адреса пов’язує всі надходження в один видимий ланцюжок: спостерігач складає обіг, контрагентів і залишок. Нова адреса на кожне надходження розриває зв’язок — історію можна зібрати лише за зовнішніми ознаками, а не за структурою гаманця.

Підтримка користувачів від цього зміщується: одна фраза закриває сценарій «загубив пристрій», але зростає ціна помилки в шляху виведення та виборі мережі — при формально правильній фразі людина бачить порожній баланс.

Ознака Одна адреса HD-гаманець
Відновлення за ключем, копію оновлюють у разі зміни одна фраза повертає все дерево
Повторне використання адрес одна на всі операції нова під кожне надходження
Обсяг резервної копії фіксований, застаріває у разі зміни не зростає з кількістю адрес
Приватність транзакцій надходження пов’язані в ланцюжок зв’язки розірвані за адресами
Трудомісткість підтримки прості звернення, часті втрати доступу рідші втрати, вища ціна помилок у шляхах

Часті технічні питання та межі застосовності

Нижче — п’ять питань, які найчастіше виникають до старту. Вони стосуються не вибору технологій, а меж відповідальності: від відповідей залежить і архітектура, і те, як застосунок поводитиметься через рік після релізу.

Приватні ключі не покидають пристрій користувача: серверна частина відповідає лише за курси та агрегацію балансів. Це обмежує частину сценаріїв, зате знімає цілий клас ризиків — витік через наш сервер.

У нас уже випущено застосунок — його потрібно переписувати з нуля?

Ні. Дивимося на схему зберігання ключів і формат похідних адрес: якщо вони сумісні зі стандартом, ядро залишається, а змінюються шари роботи з мережами та інтерфейс. Переписувати має сенс лише ядро, яке не дає доступу до похідних ключів.

Хто зберігає ключі користувача?

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

Що буде в разі втрати пристрою?

Відновлення йде за seed-фразою на новому пристрої: адреси виводяться заново з того самого кореня, баланси підтягуються з мережі. На нашій стороні нічого не потрібно, але цей сценарій тестується окремо — він перевіряється інакше, ніж звичайний вхід.

Як додаються нові мережі?

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

Як перевіряється коректність генерації ключів?

Звіркою з еталонними тестовими векторами: один і той самий seed має давати однакові адреси за BIP-39 і BIP-44. Плюс набір тестів на відновлення — помилка в похідній ключа призводить до незворотної втрати доступу, а не до зрозумілої помилки в логах.

Обговоримо задачу й повернемося з оцінкою та планом

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

Після звернення ви отримуєте:

  • розбір поточної схеми зберігання ключів і виведення адрес — що залишаємо, що перебудовуємо під BIP-39/BIP-44;
  • перелік ризиків: витік мнемонічної фрази, слабкий захист локального сховища, відсутність перевірок під час відновлення;
  • варіант архітектури гаманця — гарячий і холодний контур, ізоляція ключів, робота з мережею;
  • послідовність робіт і план впровадження з перевірюваним результатом на кожній ітерації;
  • склад команди: розробники під мобільні платформи, інженер із криптографії, тестувальник;
  • формат передачі — документація, збірки, порядок оновлень і підтримки;
  • строки: діапазон із припущеннями, від яких він залежить, а не одна зручна цифра.

Чим точніше ви опишете поточну схему та обмеження, тим менше припущень залишиться в оцінці. Опишіть задачу — повернемося з оцінкою робіт, строками та планом впровадження.

Наші компетенції:

Останні роботи

  • Розробка мобільного додатка для компанії FEEDME
    Розробка мобільного додатка для компанії FEEDME
    1010
  • Розробка мобільного додатку для компанії XOOMER
    Розробка мобільного додатку для компанії XOOMER
    903
  • Розробка мобільного додатку для компанії RHL
    Розробка мобільного додатку для компанії RHL
    1332
  • Розробка мобільного додатку для компанії ZIPPY
    Розробка мобільного додатку для компанії ZIPPY
    1180
  • Розробка мобільного додатку для компанії Affhome
    Розробка мобільного додатку для компанії Affhome
    1107
  • Розробка мобільного додатку для компанії FLAVORS
    Розробка мобільного додатку для компанії FLAVORS
    714