489 / 736PBKDF2

PBKDF2

Выведение seed в BIP39

При восстановлении кошелька те же резервные слова и та же passphrase должны приводить к тем же ключам. В BIP39 часть этого пути обеспечивает PBKDF2: он вычисляет seed, секретную основу для дальнейшего получения ключей. Он повторяет вычисление, но не создаёт новый секрет.

PBKDF2, полное название Password-Based Key Derivation Function 2, преобразует парольный вход и дополнительный параметр salt в производный ключ. Результат зависит также от числа повторений, вычислительной функции и требуемой длины. Одинаковые входы и настройки дают одинаковый результат. BIP39 использует конкретный вариант PBKDF2-HMAC-SHA512; в других применениях параметры могут отличаться.

Слова восстановления образуют вход с названием password. Salt — второй вход: буквальный текст "mnemonic", сразу за которым следует passphrase, необязательный дополнительный пароль. Между ними не вставляют ни разделитель, ни ещё одну копию слов. Без passphrase параметр salt остаётся "mnemonic", а не пустой строкой. Оба входа проходят NFKD, приведение определённых представлений символов к единому виду, и кодирование UTF-8. BIP39 использует HMAC-SHA512, 2048 повторений и выход длиной 64 байта, то есть 512 бит. Этот результат и есть seed; salt не является ещё одной резервной копией, которую нужно создавать. [1]

Внутри работает HMAC — вычисление, сочетающее ключ и сообщение. В каждом раунде ключом остаётся один и тот же парольный вход. Первый промежуточный результат использует salt и номер выходного блока; следующие раунды обрабатывают предыдущий промежуточный результат. Результаты объединяются операцией XOR над соответствующими битами. HMAC-SHA512 возвращает 64 байта, поэтому BIP39 достаточно одного такого блока. Просто применить SHA-512 к тексту 2048 раз — другое вычисление с другим результатом. [2] [1]

Представьте восстановление в другом кошельке. Чтобы получить тот же seed, ему нужны те же нормализованные данные и настройки. Увеличение предписанных 2048 повторений не улучшает восстановление: это отступление от BIP39, которое даст другой результат. Перевод слов в другой словарь тоже не является нейтральной заменой. Восстановление требует совпадения, а не собственной модификации алгоритма. [1]

Повторение вычисления повышает стоимость каждой попытки, но не создаёт новой независимой случайности. Атакующий, знающий ваши слова и располагающий данными для распознавания нужного кошелька, может перебирать слабые passphrase офлайн на своём компьютере. Поэтому длинный seed на 512 бит не означает 512 бит непредсказуемости. Число 2048 также не служит общей рекомендацией для новых систем: здесь оно относится к конкретному стандарту восстановления. [2] [1]

Контрольная сумма BIP39 помогает выявить неправильно переписанные слова. PBKDF2 отвечает на другой вопрос: как вычислить seed из переданных входов? Само вычисление не подтверждает, что passphrase соответствует вашему исходному кошельку. Затем seed может обработать BIP32 — метод получения целого семейства ключей. Проверка записи, преобразование в seed и создание ключей связаны, но не взаимозаменяемы. [1]

Разработчик может сравнить результат с публичными тестовыми векторами: известными входами и ожидаемыми выходами. BIP39 публикует исходные случайные данные, слова и полный seed для тестовой passphrase TREZOR. Правильная реализация должна воспроизвести результат с учётом правил NFKD. Ваша настоящая копия для этого не нужна. Никогда не используйте публичные примеры для хранения денег: они известны всем. Успешный тест вычисления также не доказывает безопасность всего приложения. [1]

Для полной картины прочитайте эту статью вместе с BIP 39, BIP39 passphrase, Seed Generation, HD Wallet. На эту статью также ссылаются BIP39 passphrase.

DOC · 001BIP39 — Mnemonic generation and seed conversionСпецификация DOC · 002RFC8018 — PBKDF2 constructionСпецификация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией