Разделение секрета (secret sharing) в криптографических системах позволяет разбить чувствительное значение — например, ключ шифрования — на несколько частей так, что восстановление возможно только при наличии заранее заданного числа этих частей. В контексте JavaScript-библиотеки SJCL (Stanford Javascript Crypto Library) реализуется схема Шамира, основанная на полиномиальной интерполяции в конечном поле.
y = a_0 + a_1 x + a_2 x^2 + + a_{t-1} x^{t-1}
Секрет кодируется как свободный коэффициент полинома, а каждая доля представляет собой точку на этом полиноме. Для восстановления требуется минимум t точек из n возможных.
В SJCL функциональность разделения секрета реализуется через модуль
sjcl.secretshare. Он предоставляет инструменты:
Основная идея заключается в том, что секрет преобразуется в битовый
массив (sjcl.bitArray), после чего над ним строится
математическая конструкция Шамира.
При создании схемы задаются два параметра:
threshold — минимальное количество долей для
восстановленияcount — общее количество создаваемых долейТипичный процесс выглядит следующим образом:
const secret = sjcl.codec.utf8String.toBits("SUPER_SECRET_KEY");
const shares = sjcl.secretshare.split(
secret,
3, // threshold
5 // total shares
);
Результатом является массив объектов, каждый из которых содержит часть информации о секрете. Эти части сами по себе не позволяют восстановить исходное значение.
Для восстановления требуется собрать не менее threshold
долей. Алгоритм интерполирует значения полинома и вычисляет исходный
секрет:
const recovered = sjcl.secretshare.combine([
shares[0],
shares[2],
shares[4]
]);
const plaintext = sjcl.codec.utf8String.fromBits(recovered);
Любая комбинация долей, удовлетворяющая порогу, даёт одинаковый результат. Недостаточное количество частей делает восстановление математически невозможным.
Один из наиболее распространённых сценариев — распределённое хранение ключей шифрования. Вместо хранения ключа в одном месте он разделяется между несколькими независимыми узлами.
Применение:
В такой архитектуре компрометация одного сервера не приводит к утечке секрета.
Разделение секрета часто используется как механизм восстановления доступа к аккаунтам или криптографическим кошелькам.
Типовая модель:
Такой подход снижает риск полной потери доступа при утрате одного компонента системы.
Аппаратные модули безопасности (HSM) обеспечивают высокий уровень защиты, но не всегда доступны. Разделение секрета позволяет частично эмулировать их поведение на программном уровне.
Вариант архитектуры:
Это уменьшает поверхность атаки и исключает постоянное хранение полного ключа.
Разделение секрета может использоваться как механизм контроля выполнения критических операций.
Примеры:
Каждый участник хранит свою долю, и операция выполняется только при достижении порога согласия.
При резервном копировании ключей важно исключить единичную точку отказа. Разделение секрета позволяет распределить резервные копии между несколькими независимыми хранилищами.
Структура:
Любые t из n частей позволяют восстановить ключ даже при частичной потере инфраструктуры.
SJCL активно использует JSON-формат для сериализации криптографических объектов. Доли секрета могут быть сохранены в виде JSON-структур:
const serialized = sjcl.json.encode(shares[0]);
const parsed = sjcl.json.decode(serialized);
Это упрощает передачу долей между системами и хранение в базах данных без потери структуры.
Математическая основа схемы Шамира обеспечивает следующий принцип: знание менее чем threshold долей не даёт информации о секрете. Это свойство важно при анализе угроз:
В браузерных приложениях SJCL позволяет реализовать распределённые схемы, где часть долей остаётся у клиента, а часть — на сервере.
Типичный поток:
Несмотря на криптографическую надёжность, схема имеет инженерные ограничения:
Эти факторы требуют аккуратного проектирования архитектуры вокруг механизма разделения секрета.