Что решает BIP-39
Приватный ключ кошелька — это 256 бит случайных данных. Запомнить или записать такую последовательность вручную без ошибок практически невозможно. BIP-39 предлагает компромисс: представить энтропию в виде последовательности слов из фиксированного словаря, которую человек способен переписать на бумагу и при необходимости ввести обратно.
Стандарт определяет три этапа:
- Генерация криптографически стойкой энтропии.
- Вычисление и добавление контрольной суммы.
- Маппинг битовой последовательности на слова из словаря.
Результат — мнемоническая фраза из 12, 15, 18, 21 или 24 слов. Из неё затем детерминированно выводится бинарный seed, который служит корнем для всех ключей кошелька.
Генерация энтропии
Первый и критически важный шаг — получение случайных данных. BIP-39 допускает пять размеров энтропии:
| Энтропия (бит) | Контрольная сумма (бит) | Всего бит | Слов в фразе |
|---|---|---|---|
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
На практике подавляющее большинство кошельков используют 128 или 256 бит. 128 бит дают 2¹²⁸ возможных комбинаций — этого достаточно для безопасности на обозримую перспективу. 256 бит выбирают для дополнительного запаса.
Энтропия должна поступать из криптографически стойкого генератора случайных чисел (CSPRNG). В операционных системах это
/dev/urandom (Linux), BCryptGenRandom (Windows), SecRandomCopyBytes (macOS/iOS). Использование rand(), Math.random() или любых предсказуемых источников делает фразу тривиально подбираемой.Контрольная сумма: зачем она и как считается
К энтропии добавляется контрольная сумма, чтобы при ручном вводе или переписывании можно было обнаружить ошибку. Вычисляется она так:
- Берётся SHA-256 хеш от исходной энтропии.
- Из полученного 256-битного хеша берутся первые
ENT / 32бит, гдеENT— размер энтропии в битах.
Для 128-битной энтропии контрольная сумма составляет 4 бита, для 256-битной — 8 бит. Эти биты дописываются в конец энтропии.
Контрольная сумма не является механизмом защиты от подбора — она лишь позволяет кошельку сказать «фраза введена с ошибкой» до того, как пользователь попытается восстановить средства. Вероятность того, что случайно набранная неверная фраза пройдёт проверку, равна 1/2^(CS), где CS — длина контрольной суммы в битах. Для 12 слов это 1/16, для 24 слов — 1/256.
Разбиение на 11-битные группы и маппинг на слова
Полученная последовательность (энтропия + контрольная сумма) разбивается на группы по 11 бит. Каждая группа представляет число от 0 до 2047 — индекс в словаре.
Почему именно 11 бит и 2048 слов? Это минимальная степень двойки, при которой одно слово кодирует достаточно информации, оставаясь при этом коротким и различимым на слух. Словарь подобран так, что любые два слова отличаются минимум первыми четырьмя символами — это позволяет однозначно идентифицировать слово по префиксу и упрощает ввод.
Словарь для английского языка зафиксирован в спецификации BIP-39 и содержит ровно 2048 слов. Существуют словари для других языков (японский, китайский, испанский, французский и др.), но они не взаимозаменяемы: фраза, сгенерированная с английским словарём, не может быть восстановлена по японскому.
Пример маппинга для 12-словной фразы:
Код:
Энтропия (128 бит): 00000000 00000000 ... 00000000
SHA-256 хеш: 374708ff776d9694b5a4a8b4c4e4a1f8...
Контрольная сумма: 0011 (первые 4 бита хеша)
Всего: 132 бита = 12 групп по 11 бит
Группа 0: 00000000000 → индекс 0 → "abandon"
Группа 1: 00000000000 → индекс 0 → "abandon"
...
Группа 11: 00000000011 → индекс 3 → "about"
Это тестовый вектор из спецификации: фраза из двенадцати «abandon» и завершающего «about» соответствует нулевой энтропии.
Преобразование мнемоники в бинарный seed
Сама мнемоническая фраза не является seed. Чтобы получить 512-битный бинарный seed, из которого выводятся все ключи, применяется функция PBKDF2:
- Алгоритм: PBKDF2-HMAC-SHA512
- Пароль (password): мнемоническая фраза в кодировке UTF-8, слова разделены пробелами (для японского — идеографический пробел U+3000)
- Соль (salt): строка
"mnemonic"+ опциональная passphrase
- Итерации: 2048
- Выход: 512 бит (64 байта)
Эти 512 бит и есть тот seed, который передаётся в BIP-32 для построения дерева ключей. Мнемоника — лишь человекочитаемая оболочка над энтропией; настоящую криптографическую работу делает PBKDF2.
Passphrase: необязательный 25-й фактор
BIP-39 поддерживает дополнительный пароль (passphrase), который добавляется к соли PBKDF2. Если passphrase задан, та же мнемоника даёт совершенно другой seed и, соответственно, другой набор адресов.
Это создаёт механизм plausible deniability: можно хранить одну мнемонику и несколько passphrase, каждый из которых открывает отдельный кошелёк. Однако passphrase не заменяет шифрование и не защищает от компрометации самой мнемоники — он лишь умножает пространство поиска.
Важно: если passphrase утерян, восстановить соответствующий кошелёк невозможно. Никакой контрольной суммы для passphrase не существует.
Что проверяет кошелёк при восстановлении
Когда пользователь вводит фразу для восстановления, кошелёк выполняет проверку:
- Каждое слово должно присутствовать в словаре.
- Количество слов должно соответствовать допустимому размеру (12, 15, 18, 21 или 24).
- Битовая последовательность, полученная обратным маппингом, должна содержать корректную контрольную сумму.
Если хотя бы одно слово заменено на другое из словаря, контрольная сумма с вероятностью 15/16 (для 12 слов) не сойдётся, и кошелёк выдаст ошибку. Но если пользователь перепутал два слова местами или пропустил слово, результат может быть непредсказуемым: либо ошибка контрольной суммы, либо восстановление совершенно другого кошелька с нулевым балансом.
Типичные ошибки при работе с мнемоникой
Запись в цифровом виде. Скриншот, заметка в телефоне, файл на компьютере — всё это потенциально доступно вредоносному ПО или облачной синхронизации. Мнемоника должна существовать только на физическом носителе.
Использование не-CSPRNG источника. Некоторые «генераторы мнемоник» в браузере или самописные скрипты используют
Math.random() или аналог. Результат выглядит как нормальная фраза, но энтропия предсказуема.Подмена словаря. Если кошелёк использует нестандартный или модифицированный словарь, фраза не будет восстановлена в другом кошельке. Всегда следует использовать стандартный словарь BIP-39 для выбранного языка.
Путаница между мнемоникой и seed. Мнемоника — вход для PBKDF2. Сам seed (512 бит) никогда не показывается пользователю и не предназначен для ручной записи.
Отсутствие проверки при создании. После генерации фразы кошелёк обычно просит подтвердить несколько слов. Пропуск этого шага повышает риск того, что запись содержит ошибку.
Безопасность: что нужно помнить
Мнемоническая фраза — это полный доступ ко всем средствам кошелька. Любой, кто её знает, может восстановить ключи и подписать транзакции. Никакой дополнительный пароль, 2FA или аппаратная защита не помогут, если сама фраза скомпрометирована.
Практические правила:
- Храните фразу на физическом носителе (бумага, металлическая пластина) в защищённом месте.
- Не фотографируйте, не сканируйте, не вводите в онлайн-формы.
- Создавайте фразу только на доверенном устройстве, предпочтительно офлайн.
- Проверяйте совместимость: если кошелёк использует BIP-39 + BIP-44, восстановление в кошельке с другим путём деривации покажет пустой баланс Пути деривации (BIP-44, BIP-84): почему один seed показывает разный баланс в разных кошельках.
- Для крупных сумм рассмотрите разделение на несколько копий в разных локациях и использование passphrase как дополнительного фактора Как безопасно хранить seed-фразу: резервные копии, офлайн-хранение и типичные ошибки.
Проверка корректности без восстановления кошелька
Если нужно убедиться, что записанная фраза валидна, не восстанавливая кошелёк, можно воспользоваться офлайн-инструментом, который:
- Преобразует слова обратно в битовую последовательность.
- Отделяет контрольную сумму.
- Пересчитывает SHA-256 от энтропии и сравнивает.
Такая проверка подтверждает только синтаксическую корректность (все слова из словаря, контрольная сумма сходится). Она не говорит о том, что фраза была сгенерирована именно вашим кошельком или что на соответствующих адресах есть средства.
