Анонимное шифрование в модели Sealed Box опирается на асимметричную криптографию и конструкцию, при которой отправитель не обязан иметь собственную пару ключей. Сообщение шифруется только на стороне получателя, используя его публичный ключ, а расшифровка возможна исключительно приватным ключом получателя.
В экосистеме NaCl (Networking and Cryptography library) и её
JavaScript-реализациях это поведение реализуется через расширение sealed
box, чаще всего доступное через tweetnacl-sealedbox-js, так
как базовый tweetnacl предоставляет только низкоуровневый
box с явным участием обеих сторон.
Классическая схема nacl.box работает через:
Каждое сообщение требует явного управления nonce и идентификации отправителя.
В sealed box модель упрощена до одностороннего шифрования:
Sealed box реализует гибридную схему:
В результате:
nacl.boxВнутренне структура обычно выглядит так:
[ephemeral public key][ciphertext + auth tag]
Эфемерный ключ используется только один раз и позволяет восстановить общий секрет на стороне получателя.
Базовый tweetnacl не включает sealed box, поэтому
используется расширение:
npm install tweetnacl tweetnacl-util tweetnacl-sealedbox-js
import nacl from "tweetnacl";
import * as util from "tweetnacl-util";
const keyPair = nacl.box.keyPair();
const publicKey = keyPair.publicKey;
const secretKey = keyPair.secretKey;
Ключи представлены в виде Uint8Array.
import * as sealedBox from "tweetnacl-sealedbox-js";
import * as util from "tweetnacl-util";
const message = "Секретное сообщение";
const messageBytes = util.decodeUTF8(message);
const encrypted = sealedBox.seal(messageBytes, publicKey);
На выходе получается бинарный массив (Uint8Array),
содержащий:
Для хранения или передачи данные обычно кодируются в Base64:
const encoded = util.encodeBase64(encrypted);
const encryptedBytes = util.decodeBase64(encoded);
const decrypted = sealedBox.open(
encryptedBytes,
publicKey,
secretKey
);
const originalMessage = util.encodeUTF8(decrypted);
В sealed box отсутствует понятие отправителя на криптографическом уровне. Это означает:
Sealed box использует компоненты NaCl:
Эта комбинация обеспечивает:
Поскольку каждый вызов включает:
sealed box медленнее, чем прямой nacl.secretbox, но
быстрее и проще, чем управляемая схема nacl.box с ручным
nonce management.
Попытка шифровать строки напрямую приводит к повреждению данных. Всегда требуется:
Sealed box не предполагает повторного шифрования одного и того же payload без изменения состояния.
Публичные и приватные ключи должны храниться как:
Модель применяется там, где:
Типичные случаи:
Несмотря на удобство, sealed box не предназначен для:
Также отсутствует управление ключевыми сессиями, что делает модель stateless по своей природе.
Каждое шифрование включает:
Эта одноразовость обеспечивает криптографическую изоляцию каждого сообщения.
Sealed box сохраняет совместимость с:
crypto_box_sealbox (через адаптеры)Sealed box не предназначен для больших потоков данных. При необходимости:
Криптографическая стойкость базируется на:
Компрометация возможна только при утечке приватного ключа получателя.