Метод nacl.box.keyPair.fromSecretKey предназначен для
восстановления полной пары ключей (публичного и секретного) на основе
уже существующего секретного ключа. Это критически важный механизм в
сценариях, где приватный ключ хранится или передаётся отдельно, а
публичный должен быть детерминированно получен без повторной
генерации.
В основе лежит криптографическая схема Curve25519, где публичный ключ является функцией от секретного, и может быть однозначно вычислен.
nacl.box.keyPair.fromSecretKey(secretKey)
Параметры:
secretKey (Uint8Array, длина 32 байта) —
приватный ключВозвращает:
{
publicKey: Uint8Array(32),
secretKey: Uint8Array(32)
}
В библиотеке используется алгоритм X25519 (вариант Curve25519 для обмена ключами). Публичный ключ вычисляется как:
publicKey = scalarMult.base(secretKey)
Это означает:
Операция детерминирована: один и тот же секретный ключ всегда даёт один и тот же публичный.
Секретный ключ может быть сохранён в:
При загрузке приложения требуется восстановить публичный ключ:
const savedSecretKey = ... // Uint8Array(32)
const keyPair = nacl.box.keyPair.fromSecretKey(savedSecretKey)
console.log(keyPair.publicKey)
Если секретный ключ получен из:
то fromSecretKey позволяет всегда получать одну и ту же
пару ключей:
const seed = nacl.hash(new TextEncoder().encode("password"))
const secretKey = seed.slice(0, 32)
const keyPair = nacl.box.keyPair.fromSecretKey(secretKey)
Метод полезен при интеграции с:
Если система уже имеет секретный ключ, можно восстановить публичный без передачи его по сети.
nacl.box.keyPair()| Метод | Назначение |
|---|---|
nacl.box.keyPair() |
Генерация новой случайной пары |
fromSecretKey() |
Восстановление из существующего секрета |
keyPair() использует криптографически стойкий генератор
случайных чисел, тогда как fromSecretKey() полностью
детерминирован.
Метод не валидирует секретный ключ в строгом смысле:
Пример ошибки:
const badKey = new Uint8Array(16)
nacl.box.keyPair.fromSecretKey(badKey) // ошибка
Все ключи представлены как:
Uint8Array
Для сериализации используются:
Пример преобразования:
function toHex(uint8arr) {
return Array.from(uint8arr)
.map(b => b.toString(16).padStart(2, '0'))
.join('')
}
Внутри TweetNaCl:
Секретный ключ копируется
Выполняется clamp (маскирование битов):
Вычисляется публичный ключ через scalar multiplication
Clamp необходим для:
Секретный ключ — критически чувствительные данные:
нельзя хранить в открытом виде
желательно использовать:
fromSecretKey поощряет повторное использование одного и
того же ключа, что допустимо в:
но нежелательно в:
Операция:
if (secretKey.length !== 32) {
throw new Error("Invalid secret key length")
}
// Неправильно
const key = "mysecret"
// Правильно
const key = new TextEncoder().encode("mysecret")
Если пара уже известна, нет смысла вызывать метод повторно.
nacl.box.before(publicKey, secretKey)
nacl.scalarMult.base(secretKey)
nacl.box.keyPair()
import nacl from "tweetnacl"
// исходный секретный ключ
const secretKey = nacl.randomBytes(32)
// восстановление пары
const keyPair = nacl.box.keyPair.fromSecretKey(secretKey)
console.log("Public:", keyPair.publicKey)
console.log("Secret:", keyPair.secretKey)
nacl.box.keyPair.fromSecretKey — это чистая функция
преобразования: секретный ключ → пара ключей, где
публичный всегда однозначно определяется.