В основе механизма восстановления секрета в Stanford JavaScript Crypto Library лежит схема порогового разделения секрета Шамира. Секрет преобразуется в набор независимых долей таким образом, что для восстановления исходного значения требуется не менее k из n частей. При этом любое количество долей меньше k не даёт никакой информации о секрете.
В SJCL этот механизм реализован через sjcl.secret,
предоставляющий две ключевые операции:
При создании распределённого хранения секрет проходит через полиномиальную интерполяцию над конечным полем. Конкретная реализация скрыта внутри библиотеки, но поведение интерфейса определяется двумя параметрами:
Сигнатура:
sjcl.secret.share(secret, n, k)
Функция принимает строку секрета и возвращает массив строк-долей. Каждая доля содержит:
Доли независимы и могут храниться отдельно, передаваться по сети или распределяться между участниками системы.
Каждая доля имеет строковый формат, например:
1-2a8f3c9b...-4f91d2e0...
Разделение выполняется по разделителю -, где:
Формат оптимизирован для безопасной сериализации и передачи через текстовые каналы.
Операция восстановления выполняется функцией:
sjcl.secret.recover(shares)
Для успешного восстановления необходимо:
Порядок долей не имеет значения.
const sjcl = require('sjcl');
const secret = "my_super_secret_value";
// 5 долей, порог восстановления 3
const shares = sjcl.secret.share(secret, 5, 3);
console.log(shares);
Результатом будет массив из 5 строк-долей:
[
"1-...",
"2-...",
"3-...",
"4-...",
"5-..."
]
const recovered = sjcl.secret.recover([
shares[0],
shares[3],
shares[4]
]);
console.log(recovered);
Выходное значение совпадает с исходным секретом:
my_super_secret_value
Внутри используется схема Шамира, основанная на интерполяции полиномов в конечном поле GF(2^8+). Секрет кодируется как свободный член полинома:
[ f(x) = a_0 + a_1x + a_2x^2 + + a_{k-1}x^{k-1}]
где:
Каждая доля — это точка:
[ (x_i, f(x_i))]
Для восстановления требуется минимум k точек, после чего используется интерполяция Лагранжа.
SJCL включает механизм защиты от подделки через HMAC. Каждая доля содержит криптографическую подпись, вычисленную на основе внутреннего ключа.
При восстановлении выполняется:
Это предотвращает подмену одной из частей секрета без обнаружения.
При работе с sjcl.secret.recover возможны несколько
сценариев:
Если передано меньше k элементов:
Если часть данных изменена:
Повторяющиеся элементы:
SJCL использует текстовое представление, удобное для:
При этом:
Криптографическая стойкость зависит от:
При увеличении n растёт устойчивость к потере частей, при увеличении k — устойчивость к компрометации отдельных узлов.
Механизм восстановления секрета используется в ситуациях, где требуется распределённый контроль доступа:
Архитектурно это позволяет исключить единую точку отказа, сохраняя возможность восстановления при наличии достаточного числа участников.
SJCL реализован полностью на JavaScript и не требует нативных зависимостей. Это делает механизм разделения секрета пригодным для:
При этом важно учитывать:
Несмотря на криптографическую надёжность, модель имеет ограничения:
Эти ограничения определяют область применения схемы и требуют учёта при проектировании систем хранения ключей.