Как кошельки OneKey генерируют твою сид-фразу и откуда берётся случайность

Ключевые выводы
- Безопасность кошелька начинается с энтропии — непредсказуемых случайных бит; сид-фраза лишь их читаемое кодирование.
- Разные модели OneKey берут случайность из разных источников: THD89 SE TRNG у Pro, Classic 1S и Classic 1S Pure, ATECC608A SE TRNG у Classic и STM32 MCU TRNG у Mini.
- Нашумевшая проблема связана с неверно настроенным Yasmarang PRNG в
libngu, который в обход TRNG чипа; пути создания кошелька в OneKey этот код не используют. - Прошивки OneKey не зависят от
libngu, Coinkite, Coldcard или CKCC и реально обращаются к аппаратному TRNG либо TRNG защищённого элемента — это подтверждено несколькими раундами аудита. - SHA-256 в BIP39 считает только контрольную сумму и не является генератором случайных чисел; надёжность фразы держится исключительно на исходной энтропии.
Эта статья показывает, как каждая модель OneKey получает энтропию и сид-фразу при создании нового кошелька, и почему недавние опасения вокруг некоторых программных реализаций ГСЧ не относятся к путям создания кошелька в OneKey.
Безопасность кошелька начинается со случайности, которую никто не сможет предсказать
Безопасность кошелька начинается с одной вещи — энтропии: непредсказуемых случайных бит, из которых он создаётся. Сид-фраза — это всего лишь читаемое человеком кодирование этой энтропии. Если в момент создания энтропия предсказуема, то ничто из того, что ты добавишь потом — PIN, место хранения фразы, способ деривации адресов — уже не исправит ситуацию.
Разные модели OneKey берут случайность не из одного и того же места. Ниже — точно, откуда на каждом устройстве приходит энтропия, стоящая за твоей сид-фразой.
Проблема, попавшая в новости, восходит к неверно настроенному Yasmarang PRNG в libngu, где некоторые сборки в итоге обходили TRNG чипа. Соответствующие пути прошивки OneKey не используют libngu, Coinkite, Coldcard или какую-либо зависимость CKCC, и несколько раундов аудита подтверждают, что они действительно обращаются к аппаратному TRNG или TRNG защищённого элемента. Ниже разбираем устройство за устройством, какой именно аппаратный интерфейс случайности использует каждое из них.
Что такое энтропия и почему без неё кошельку не жить?
Представь энтропию как измеримое количество непредсказуемости, обычно измеряемое в битах. 128 бит энтропии означают 2^128 возможных стартовых значений; если нет какого-то другого изъяна, атакующему остаётся только гадать. Твои приватные ключи, твои адреса и твоя способность подписывать транзакции детерминированно выводятся из этого единственного стартового секрета.
Поэтому надёжность сид-фразы идёт не от того, что дюжина английских слов «выглядит внушительно». Она идёт от того, насколько непредсказуема сырая энтропия, стоящая за ними:
- 128 бит энтропии → 12 слов BIP39;
- 192 бита энтропии → 18 слов BIP39;
- 256 бит энтропии → 24 слова BIP39.
Слабая случайность позволяет атакующему воспроизвести входные данные с момента создания твоего кошелька и выйти ровно на ту же фразу и приватный ключ. Никакой объём SHA-256, защита PIN-кодом или хранение в защищённом элементе не превратят предсказуемый вход в по-настоящему непредсказуемую энтропию.
От случайного числа к сид-фразе: как на самом деле работает математика
Детали отличаются от модели к модели, но у любого кошелька BIP39 одна и та же вычислительная модель:
Аппаратный генератор истинно случайных чисел (TRNG)
↓
Взять 128 / 192 / 256 бит энтропии (ENT)
↓
Взять первые ENT / 32 бита SHA-256(ENT) как контрольную сумму (CS)
↓
Разбить ENT || CS на группы по 11 бит, сопоставить каждую с одним из 2048 слов BIP39
↓
12 / 18 / 24 слова → seed → приватные ключи, адреса и ключи подписи
Например, фраза из 12 слов использует 128 бит энтропии плюс 4-битную контрольную сумму — итого 132 бита, которые ровно делятся на 12 групп по 11 бит. Каждая группа — это индекс в списке слов BIP39.
Шаг SHA-256 здесь лишь вычисляет контрольную сумму BIP39; это не генератор случайных чисел. Случайность фразы по-прежнему целиком опирается на сырую энтропию, захваченную в момент создания.
Так почему же реализация OneKey не затронута проблемой ColdCard? Ниже разбираем устройство за устройством, как получается первоначальное случайное число каждой модели и попадает ли оно вообще в затронутый участок кода.
OneKey Pro
OneKey Pro
Затронута ли модель?
Нет — проблема ColdCard libngu / Yasmarang её не касается. Текущая сборка Pro по умолчанию включает THD89. Когда ты создаёшь кошелёк на устройстве, TRNG THD89 даёт случайный вход, а прошивка выполняет последующее кодирование BIP39 или SLIP39.
Как это генерируется
THD89 TRNG → энтропия инициализации кошелька → прошивка кодирует BIP39 или SLIP39.
У Pro random.bytes() по умолчанию использует source=1, что при сборке по умолчанию с USE_THD89=1 вызывает se_random_encrypted().
Замечания о случайности
- Сборка Pro по умолчанию включает THD89, и случайные байты приходят из
se_random_encrypted()— а не из программного пути PRNG Yasmarang илиlibngu. - По данным Справочного центра OneKey, TRNG в современном защищённом элементе EAL6+ основывает свою случайность на физических процессах, таких как электронный шум.
OneKey Classic 1S
OneKey Classic 1S
Затронута ли модель?
Нет — проблема ColdCard libngu / Yasmarang её не касается. Текущий, публично доступный процесс создания на устройстве Classic 1S берёт энтропию из TRNG защищённого элемента THD89, а строку фразы BIP39 кодирует прошивка MCU.
Как это генерируется
THD89 TRNG → 128 / 192 / 256 бит энтропии → MCU кодирует фразу BIP39.
Замечания о случайности
- Говорить «фразу генерирует THD89» не совсем точно: THD89 поставляет случайный вход, а кодирование слов BIP39 происходит в прошивке MCU.
- Прошивка вызывает интерфейс
se_random_encrypted()THD89 и не использует Yasmarang илиlibngu. По данным Справочного центра OneKey, TRNG в современном защищённом элементе EAL6+ вырабатывает случайность из физических процессов, таких как электронный шум.
OneKey Classic 1S Pure
OneKey Classic 1S Pure
Затронута ли модель?
Нет — проблема ColdCard libngu / Yasmarang её не касается. Публичный код не выделяет для Classic 1S Pure отдельную ветку генерации энтропии; она использует ту же кодовую базу firmware-classic1s, что и Classic 1S. Поэтому, когда ты создаёшь кошелёк, энтропия Pure тоже приходит из TRNG THD89 и кодируется в фразу BIP39 силами MCU.
Проверенный процесс
THD89 TRNG → 128 / 192 / 256 бит энтропии → MCU кодирует фразу BIP39.
То, что Pure — устройство без батареи, не меняет этот публичный путь создания.
Замечания о случайности
- Не думай, что у Pure другой механизм энтропии только потому, что она продаётся как отдельная модель.
- Как и у Classic 1S, публичный код создания вызывает интерфейс случайности THD89 и не использует Yasmarang или
libngu.
OneKey Classic
OneKey Classic
Затронута ли модель?
Нет — проблема ColdCard libngu / Yasmarang её не касается. На пути прошивки Classic с включённым защищённым элементом именно SE поставляет случайный материал, используемый для создания кошелька, а MCU превращает его в фразу BIP39.
Как это генерируется
SE поставляет случайный материал → первые 32 байта берутся как энтропия → MCU кодирует фразу BIP39.
Замечания о случайности
- Этот путь получает случайный материал через интерфейсы инициализации и экспорта SE и не вызывает реализацию ГСЧ Yasmarang или
libngu— поэтому он никогда не попадает в обсуждаемый затронутый участок кода. - Публичный код не позволяет для каждой партии Classic по отдельности точно определить модель SE и её сертификацию. Описывая это публично, ориентируйся на документацию чипа конкретной партии, а не переноси сертификацию другой модели на Classic.
OneKey Mini
OneKey Mini
Затронута ли модель?
Нет — проблема ColdCard libngu / Yasmarang её не касается. Процесс создания на устройстве Mini берёт энтропию из аппаратного генератора случайных чисел MCU STM32, а затем MCU кодирует её в фразу BIP39.
Как это генерируется
STM32 MCU TRNG → 128 / 192 / 256 бит энтропии → MCU кодирует фразу BIP39.
В более старой прошивке Mini random32() напрямую читает периферию RNG STM32 и отбрасывает подряд идущие одинаковые выходы. Процесс создания на устройстве использует именно эту случайность для генерации фразы.
Замечания о случайности
- MCU напрямую читает аппаратную периферию RNG STM32, а прошивка ещё и отбрасывает подряд идущие одинаковые выходы. Этот путь не использует Yasmarang или
libngu.
Советы по безопасности для пользователей
- Откуда бы ни бралась энтропия, стоит сид-фразе утечь — и восстановить кошелёк сможет кто угодно. Сделать её резервную копию офлайн и без ошибок — всегда твоя ответственность.
- Если сид-фраза потеряна, ни устройство, ни приложение, ни производитель не восстановят её за тебя.
Дополнительные материалы и источники
- Справочный центр OneKey: как аппаратный кошелёк OneKey генерирует сид-фразу и гарантирует её случайность?
- OneKey Pro:
reset_device - OneKey Pro: реализация источника случайности
- OneKey Pro: конфигурация сборки, включающая THD89 по умолчанию
- Classic 1S:
reset.c - Classic 1S:
config.c - OneKey Classic / Mini:
reset.c - Исторический коммит: Mini на Microchip ATECC608






