Иерархическая деривация ключей в контексте криптографических библиотек на основе TweetNaCl.js опирается на идею построения дерева ключей из единого начального значения (seed), из которого детерминированно выводятся все последующие ключи. Такой подход позволяет воспроизводить целые наборы ключей без хранения каждого из них, обеспечивая при этом удобство резервного копирования и структурирование ключевого пространства.
В основе иерархической системы лежит детерминированное преобразование:
Ключевая идея заключается в том, что любой дочерний ключ вычисляется из родительского, но обратное вычисление невозможно.
В классическом BIP-32 используется следующая схема:
В случае TweetNaCl.js прямой поддержки BIP-32 нет, поэтому реализуется либо адаптация через внешние криптографические функции, либо использование совместимых стандартов вроде SLIP-0010.
TweetNaCl.js предоставляет минималистичный набор криптографических примитивов:
Однако отсутствуют:
Поэтому иерархическая схема строится поверх библиотеки, а не внутри неё.
Для асимметрии Ed25519 стандарт BIP-32 не подходит напрямую, поскольку он рассчитан на secp256k1 и использует не совместимую схему вывода ключей.
Вместо этого применяется SLIP-0010, который определяет:
Иерархия ключей становится строго защищённой: каждый дочерний ключ зависит только от родительского и индекса.
Структура выглядит следующим образом:
seed
└── master node
├── account 0
│ ├── external chain
│ └── internal chain
└── account 1
├── external chain
└── internal chain
Каждый узел содержит:
Chain code играет ключевую роль, так как предотвращает предсказуемость дочерних ключей даже при частичной компрометации родителя.
В SLIP-0010 master key создаётся так:
вход: seed (обычно 16–64 байта)
вычисление: HMAC-SHA512(“ed25519 seed”, seed)
разделение результата:
TweetNaCl.js не реализует HMAC-SHA512, поэтому используется внешняя реализация, например WebCrypto или отдельные библиотеки.
Пример:
import nacl from "tweetnacl";
import { hmac } from "some-hmac-sha512-lib";
function masterKey(seed) {
const I = hmac("ed25519 seed", seed); // 64 bytes
return {
key: I.slice(0, 32),
chainCode: I.slice(32)
};
}
В SLIP-0010 для Ed25519 используется только hardened-деривация:
index >= 0x80000000
Процесс:
Формально:
I = HMAC-SHA512(chainCode, 0x00 || parentKey || index)
childKey = I_L
childChainCode = I_R
TweetNaCl.js используется для работы с Ed25519 ключами после их генерации.
Пример структуры:
import nacl from "tweetnacl";
import { hmac } from "some-hmac-sha512-lib";
function deriveChild(parent, index) {
const data = new Uint8Array(1 + 32 + 4);
data[0] = 0x00;
data.set(parent.key, 1);
new DataView(data.buffer).setUint32(33, index, false);
const I = hmac(parent.chainCode, data);
return {
key: I.slice(0, 32),
chainCode: I.slice(32)
};
}
После получения private key можно получить public key через TweetNaCl.js:
const keyPair = nacl.sign.keyPair.fromSeed(child.key);
Иерархический путь обычно записывается как:
m / purpose' / coin_type' / account' / change / address_index
Для Ed25519:
Пример:
m/44'/784'/0'/0'/0'
Каждый уровень добавляет детерминированное разветвление.
Иерархическая деривация даёт несколько критичных свойств:
Особенно важно, что при использовании Ed25519 non-hardened деривация исключена, что снижает риск атак на публичные ключи.
При построении HD-дерева поверх TweetNaCl.js возникают ограничения:
Это делает реализацию более низкоуровневой, но даёт полный контроль над криптографическим процессом.
Каждый узел дерева должен хранить:
Структура:
class HDNode {
constructor(key, chainCode, depth, index) {
this.key = key;
this.chainCode = chainCode;
this.depth = depth;
this.index = index;
}
}
После деривации ключей используется стандартный API:
const message = new TextEncoder().encode("data");
const signature = nacl.sign.detached(message, keyPair.secretKey);
const isValid = nacl.sign.detached.verify(
message,
signature,
keyPair.publicKey
);
Иерархия ключей при этом остаётся полностью прозрачной для слоя подписей.
Комбинированная система обычно строится так:
Такое разделение минимизирует зависимость от одной библиотеки и сохраняет криптографическую корректность модели HD-ключей