В распространённой процедуре 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.