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.