Перейти к основному содержимому
Версия: 7.0

Иерархия ключей

Криптографическая модель Пассворка построена на иерархии ключей, где каждый уровень защищает следующий.

Обзор иерархии​

Мастер-пароль
↓ (PBKDF2)
Мастер-ключ пользователя
↓ (AES-256-CBC)
Приватный RSA-ключ
↓ (RSA-OAEP)
Ключ сейфа
↓ (AES-256-CBC)
Ключ записи
↓ (AES-256-CBC)
├── Данные записи
└── Ключи вложений
↓ (AES-256-CBC)
Содержимое файлов

Полная схема ключей​

Уровень 0: Вход пользователя​

Пользователь вводит мастер-пароль. С сервера получается соль (20 символов). На клиенте выполняется PBKDF2 (300 000 итераций, SHA-256).

Уровень 1: Мастер-ключ пользователя​

Результат PBKDF2 — мастер-ключ (512 бит). Он используется для двух целей:

  1. Вычисление SHA-256 хеша для отправки на сервер (проверка правильности пароля)
  2. Расшифровка приватного RSA-ключа пользователя (AES-256-CBC)

Уровень 2: RSA-ключи​

Приватный RSA-ключ (2048 бит) хранится на сервере в зашифрованном виде. Публичный RSA-ключ хранится открыто. Приватный ключ используется для расшифровки ключей сейфов (RSA-OAEP).

Уровень 3: Ключ сейфа​

Ключ сейфа (256 бит) хранится отдельной копией для каждого пользователя с доступом. Каждая копия зашифрована публичным RSA-ключом соответствующего пользователя.

Уровень 4: Ключ записи​

Ключ записи (256 бит) зашифрован ключом сейфа. Он используется для шифрования: поля пароля, дополнительных полей, TOTP-секрета, ключей вложений.

Уровень 5: Ключи вложений​

Каждый файл имеет свой ключ вложения (256 бит). Ключ вложения зашифрован ключом записи. Содержимое файла зашифровано ключом вложения.

Альтернативная ветвь (раздел «Входящие»)​

Когда запись передаётся напрямую пользователю (минуя сейф), ключ записи шифруется публичным RSA-ключом получателя напрямую.


Детальное описание ключей​

Уровень 0: Мастер-пароль​

Мастер-пароль — секрет, известный только пользователю.

ПараметрЗначение
Минимальная длина12 символов
ХранениеНикогда не хранится
ПередачаНикогда не передаётся на сервер
ИспользованиеВвод при каждом входе (или восстановление из localStorage)

Уровень 1: Мастер-ключ пользователя​

Мастер-ключ получается из мастер-пароля с помощью PBKDF2.

ПараметрЗначение
АлгоритмPBKDF2
Хеш-функцияSHA-256
Итерации300 000
Длина ключа512 бит
Соль20 символов, уникальная для пользователя
Алфавит солиA-Z, a-z, 0-9, @, ! (64 символа)
Библиотекаpbkdf2 (npm)

Формула:

Мастер-ключ = PBKDF2(мастер-пароль, соль, 300000, 64, SHA-256)

Использование мастер-ключа:

  1. Расшифровка приватного RSA-ключа пользователя (AES-256-CBC)
  2. Вычисление хеша для проверки на сервере (SHA-256)

Уровень 2: RSA-ключи пользователя​

Асимметричная пара ключей для безопасного обмена симметричными ключами.

ПараметрЗначение
АлгоритмRSA-OAEP
Длина модуля2048 бит
Публичная экспонента65537 (0x010001)
Хеш-функцияSHA-256
Формат храненияPEM (PKCS#8 для приватного, SPKI для публичного)
БиблиотекаWebCrypto API (crypto.subtle)

Публичный ключ:

  • Хранится на сервере в открытом виде
  • Используется для шифрования ключей сейфов при предоставлении доступа

Приватный ключ:

  • Хранится на сервере в зашифрованном виде
  • Зашифрован мастер-ключом пользователя (AES-256-CBC)
  • Расшифровывается локально после ввода мастер-пароля

Генерация RSA-ключей: WebCrypto API генерирует пару ключей. Публичный ключ сразу отправляется на сервер. Приватный ключ шифруется мастер-ключом через AES-256-CBC и в зашифрованном виде отправляется на сервер.


Уровень 3: Ключ сейфа​

Ключ сейфа — симметричный ключ для защиты всех записей внутри сейфа.

ПараметрЗначение
ТипСимметричный (AES-256-CBC)
Длина100 символов
АлфавитA-Z, a-z, 0-9, @, ! (64 символа)
Входная энтропия~596 бит
Эффективный ключ256 бит (для AES-256)
ГенерацияНа клиенте при создании сейфа
Генераторcrypto.getRandomValues() (CSPRNG браузера)

Преобразование ключа: 100-символьная строка преобразуется в 256-битный ключ AES через функцию вывода ключа (KDF). При шифровании генерируется случайная 64-битная соль, которая вместе с исходным ключом используется для получения финального 256-битного ключа. Соль сохраняется вместе с шифротекстом.

Хранение: для каждого пользователя с доступом создаётся отдельная копия ключа сейфа. Каждая копия зашифрована публичным RSA-ключом соответствующего пользователя (RSA-OAEP). Все копии хранятся на сервере. Каждый пользователь может расшифровать только свою копию своим приватным RSA-ключом.


Уровень 4: Ключ записи​

Ключ записи — уникальный ключ для шифрования содержимого одной записи. Генерируется индивидуально для каждой записи.

ПараметрЗначение
ТипСимметричный
Длина100 символов
АлфавитA-Z, a-z, 0-9, @, ! (64 символа)
Входная энтропия~596 бит
Эффективный ключ256 бит (для AES-256)
ГенерацияНа клиенте при создании записи
Генераторcrypto.getRandomValues() (CSPRNG браузера)
ХранениеЗашифрован ключом сейфа (AES-256-CBC)

Преобразование ключа: 100-символьная строка преобразуется в 256-битный ключ AES через функцию вывода ключа (KDF). При шифровании генерируется случайная 64-битная соль, которая вместе с исходным ключом используется для получения финального 256-битного ключа. Соль сохраняется вместе с шифротекстом.

Почему 100 символов, а не 256 бит напрямую?
  • Унификация — единый формат для всех симметричных ключей (сейф, запись, вложение)
  • Избыточная энтропия — 596 бит входных данных обеспечивают максимальную стойкость 256-битного выходного ключа.
  • Запас на будущее — при переходе на более длинные ключи не потребуется изменять генераторы.
  • Защита от коллизий — вероятность совпадения ключей практически нулевая

Что шифруется ключом записи (AES-256-CBC):

  • Поле «Пароль»
  • Все дополнительные поля (имя, значение, тип)
  • TOTP-секрет
  • Ключи вложений
  • Редакции записей (предыдущие значения)

Вектор инициализации (IV): Автоматически генерируется уникальный 128-битный IV для каждой операции шифрования. IV включается в результат шифрования.

Альтернативный путь (раздел «Входящие»): когда запись передаётся напрямую пользователю (без добавления в сейф), ключ записи шифруется публичным RSA-ключом получателя.


Уровень 5: Ключ вложения​

Ключ вложения — уникальный ключ для шифрования одного файла.

ПараметрЗначение
ТипСимметричный
Длина100 символов
АлфавитA-Z, a-z, 0-9, @, ! (64 символа)
Входная энтропия~596 бит
Эффективный ключ256 бит (для AES-256)
ГенерацияНа клиенте при загрузке файла
Генераторcrypto.getRandomValues() (CSPRNG браузера)
ХранениеЗашифрован ключом записи (AES-256-CBC)

Преобразование ключа: аналогично ключу сейфа и ключу записи, 100-символьная строка преобразуется в 256-битный ключ AES через KDF с 64-битной солью.

Процесс шифрования файла:

  1. Генерируется случайный ключ вложения (256 бит)
  2. Файл шифруется этим ключом (AES-256-CBC)
  3. Ключ вложения шифруется ключом записи
  4. Оба зашифрованных объекта отправляются на сервер

Цепочка расшифровки​

Последовательность расшифровки при доступе к записи:

  1. Пользователь вводит мастер-пароль
  2. Клиент запрашивает соль и параметры PBKDF2 с сервера
  3. Клиент вычисляет мастер-ключ: PBKDF2(пароль, соль, 300000, 64, SHA-256)
  4. Клиент вычисляет хеш: SHA-256(мастер-ключ)
  5. Клиент отправляет хеш на сервер для проверки
  6. Сервер проверяет хеш и возвращает зашифрованный приватный RSA-ключ
  7. Клиент расшифровывает RSA-ключ мастер-ключом (AES-256-CBC)
  8. Клиент запрашивает данные сейфа
  9. Сервер возвращает зашифрованный ключ сейфа и записи
  10. Клиент расшифровывает ключ сейфа приватным RSA-ключом (WebCrypto RSA-OAEP)
  11. Клиент расшифровывает ключ записи ключом сейфа (AES-256-CBC)
  12. Клиент расшифровывает поля записи ключом записи (AES-256-CBC)
  13. (При необходимости) Клиент расшифровывает ключ вложения → расшифровывает файл

Таблица характеристик ключей​

КлючАлгоритмДлинаЭнтропияГде генерируетсяГде хранится
Мастер-пароль—≥12 символовЗависит от пользователяПользовательНигде
Соль PBKDF2—20 символов~120 битСерверСервер (открыто)
Мастер-ключPBKDF2-SHA256512 бит512 битКлиентНигде (в памяти)
RSA публичныйRSA-OAEP2048 бит—КлиентСервер (открыто)
RSA приватныйRSA-OAEP2048 бит—КлиентСервер (зашифрован)
Ключ сейфаAES-256-CBC100 символов → 256 бит~596 бит входКлиентСервер (зашифрован RSA)
Ключ записиAES-256-CBC100 символов → 256 бит~596 бит входКлиентСервер (зашифрован)
Ключ вложенияAES-256-CBC100 символов → 256 бит~596 бит входКлиентСервер (зашифрован)
Серверный ключAES-256-CFB256 бит256 битСерверФайл на сервере

Принципы безопасности иерархии​

Изоляция уровней​

Компрометация ключа на одном уровне не раскрывает ключи других уровней:

  • Утечка ключа записи не раскрывает другие записи
  • Утечка ключа сейфа не раскрывает записи других сейфов
  • Утечка приватного RSA-ключа требует знания мастер-ключа

Минимизация хранения​

  • Мастер-пароль и мастер-ключ не хранятся постоянно
  • Приватный RSA-ключ хранится только в зашифрованном виде
  • Ключи записей и вложений хранятся только в зашифрованном виде

Уникальность ключей​

  • Каждый пользователь имеет уникальную пару RSA-ключей
  • Каждый сейф имеет уникальный ключ
  • Каждая запись имеет уникальный ключ
  • Каждое вложение имеет уникальный ключ

Zero Knowledge​

Сервер хранит только:

  • Зашифрованные данные
  • Зашифрованные ключи
  • Публичные ключи
  • Хеши для проверки (не позволяющие восстановить секрет)

Сервер не имеет возможности расшифровать пользовательские данные.