Skip to content

Модель безопасности

Обзор

Kontinuum защищает три категории данных:

КатегорияЧто защищаетМеханизм
ФайлыСодержимое синхронизируемых файловE2E шифрование (ChaCha20Poly1305)
IdentityКлючи пользователя, профильEd25519, Vault + Stronghold
ТранспортP2P трафик между устройствамиNoise protocol (libp2p)

Цепочка доверия

plantuml Diagram

Каждый уровень зависит от предыдущего:

  1. Identity — корень доверия. Ed25519 keypair генерируется при первом запуске
  2. Device — привязан к identity. Каждое устройство имеет свой Ed25519 keypair
  3. Vault — хранит зашифрованные ключи. PIN-код через Argon2 → master key → ChaCha20Poly1305
  4. Stronghold — долгосрочное хранение приватных ключей в защищённой памяти (guard pages, mlock)
  5. Signing — Ed25519 подпись выполняется внутри Stronghold, ключ не покидает защищённую память

Криптографические примитивы

ПримитивАлгоритмБиблиотекаПрименение
ПодписьEd25519ed25519_dalekIdentity/device ключи, аутентификация
Key agreementX25519 (ECDH)x25519_dalekEphemeral ключи для приватного sharing
AEAD шифрованиеChaCha20Poly1305chacha20poly1305Vault secrets, P2P sharing payload
KDF (PIN)Argon2idargon2PIN → master key (64 MB, 3 iter, 4 threads)
KDF (sharing)BLAKE3 derive_keyblake3ECDH shared secret → symmetric key
HashingBLAKE3blake3State hash, файловые контрольные суммы
Recovery phraseBIP39bip3912/24 слова → seed → master key
TransportNoise XXlibp2p::noiseP2P аутентификация + шифрование
Key conversionEd25519 → X25519curve25519_dalekCompressedEdwardsY → Montgomery
Memory protectionStronghold Vaultiota_strongholdGuard pages, mlock, non-contiguous memory
ZeroizingZeroizezeroizeЗануление sensitive данных при drop

Архитектура хранения ключей

Проект использует два менеджера для криптографических операций (см. ADR-4):

VaultManagerStrongholdManager
ХранениеSQLite (encrypted secrets)IOTA Stronghold snapshot
Защита памятиZeroizing (зануление при drop)Guard pages, mlock, mprotect, non-contiguous memory
Модель доступаСекреты расшифровываются в RAMWrite-only vault, операции через Procedures
KDFArgon2id (64 MB, 3 iter)Scrypt (production)
UX-фичиPIN, auto-lock, rate limiting, recovery phraseПароль

Workflow подписи:

plantuml Diagram

Шифрование P2P sharing

Для приватного расшаривания используется ephemeral ECDH + ChaCha20Poly1305 (подробнее: P2P Protocol):

  1. Sender конвертирует recipient Ed25519 pubkey → X25519
  2. Генерирует ephemeral X25519 keypair
  3. ECDH(ephemeral_sk, recipient_x25519_pk) → shared_secret
  4. BLAKE3.derive_key("kontinuum-sharing-v1", shared_secret) → symmetric_key
  5. ChaCha20Poly1305.encrypt(payload, symmetric_key, random_nonce)
  6. Отправляет: ephemeral_public_key + nonce + ciphertext

Recipient выполняет обратную операцию с использованием своего приватного ключа.

Noise protocol (transport encryption)

Все P2P соединения зашифрованы через Noise XX handshake поверх libp2p:

  • Аутентификация: каждый пир аутентифицируется Ed25519 ключом устройства
  • Forward secrecy: ephemeral DH ключи генерируются при каждом handshake
  • Integrity: встроенная MAC-защита (Noise protocol гарантирует AEAD)

Стек: TCP → Noise → Yamux → Request-Response (JSON codec).

Правила для разработчиков

Обязательные

  • Zeroize все sensitive данные (Zeroizing<Vec<u8>>, pin_bytes.zeroize())
  • Никогда не логируй PIN, ключи, recovery phrase, master key
  • Только одобренные библиотеки — не изобретай криптографию
  • Constant-time comparison для верификации PIN/hash (subtle::ConstantTimeEq)
  • Rate limiting для всех auth-операций (PIN unlock, pairing)

Запрещённые

  • MD5, SHA1, RC4, DES, 3DES, PBKDF2 с низкими iterations
  • Hardcoded ключи или пароли
  • Логирование log::info!("PIN: {}", pin) или debug!("key: {:?}", key)
  • unwrap() / expect() в production crypto-коде
  • Хранение паролей в plaintext

Ссылки