Перейти к основному содержимому
Версия: 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 символовЗависит от пользователяПользовательНигде
Соль PBKDF220 символов~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

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

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

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