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

Обмен записями

Пассворк предоставляет три способа обмена записями: доступ к сейфу, прямая передача записи и внешние ссылки.

Обзор способов обмена

СпособПолучательТребуется аккаунтКлюч защиты
Доступ к сейфуПользователь ПассворкаRSA-ключ получателя
Прямая передача записиПользователь ПассворкаRSA-ключ получателя
Внешняя ссылкаЛюбой человекКлюч ссылки в URL

Внутренний шэринг (между пользователями)

Предоставление доступа к сейфу

При добавлении пользователя в сейф происходит криптографический обмен ключами.

Процесс предоставления доступа:

  1. Владелец сейфа инициирует добавление пользователя B
  2. Сервер возвращает публичный RSA-ключ пользователя B
  3. Владелец расшифровывает ключ сейфа своим приватным RSA-ключом (WebCrypto)
  4. Владелец шифрует ключ сейфа публичным RSA-ключом пользователя B (WebCrypto)
  5. Зашифрованная копия ключа отправляется на сервер
  6. Сервер сохраняет копию, связанную с пользователем B
  7. Пользователь B при следующем входе получает доступ к сейфу

Важно: Сервер видит только зашифрованные ключи. Расшифровать их может только владелец соответствующего приватного RSA-ключа.

Процесс для владельца

  1. Выбор пользователя для предоставления доступа
  2. Получение публичного RSA-ключа этого пользователя
  3. Шифрование ключа сейфа публичным ключом получателя (RSA-OAEP)
  4. Отправка зашифрованной копии на сервер

Процесс для получателя

  1. При входе в систему получатель видит новый сейф в списке
  2. Загружает зашифрованную копию ключа сейфа
  3. Расшифровывает её своим приватным RSA-ключом (WebCrypto)
  4. Получает доступ ко всем записям в сейфе

Уровни доступа

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

  • Просмотр — только чтение записей
  • Редактирование — изменение существующих записей
  • Полный доступ — создание, редактирование, удаление записей
  • Администратор — управление правами других пользователей
Zero Knowledge

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


Прямая передача записи (раздел «Входящие»)

Запись можно передать конкретному пользователю без добавления его в сейф.

Процесс прямой передачи:

  1. Отправитель расшифровывает ключ записи (через ключ сейфа, AES-256-CBC)
  2. Отправитель запрашивает публичный RSA-ключ получателя
  3. Отправитель шифрует ключ записи публичным RSA-ключом получателя (WebCrypto)
  4. Зашифрованная копия ключа отправляется на сервер
  5. Запись появляется в разделе «Входящие» у получателя
  6. Получатель расшифровывает ключ записи своим приватным RSA-ключом

Отличие от доступа к сейфу: Передаётся ключ конкретной записи, а не ключ сейфа. Получатель не видит другие записи в сейфе.


Отзыв доступа

При отзыве доступа к сейфу или записи:

  1. Сервер удаляет зашифрованную копию ключа для пользователя
  2. Пользователь больше не может получить ключ с сервера
  3. Данные становятся недоступными через интерфейс
Криптографическое ограничение

Важно понимать: если пользователь ранее получил ключ сейфа/записи и сохранил его локально, он теоретически может расшифровать данные при наличии зашифрованного содержимого (например, из резервной копии базы данных).

Это фундаментальное ограничение криптографии с общими ключами. Для полной защиты после отзыва доступа рекомендуется:

  • Сменить пароли в критичных записях
  • При необходимости — пересоздать сейф с новым ключом

Внешние ссылки

Внешние ссылки позволяют поделиться записью с человеком, не имеющим учётной записи в Пассворке.

Принцип работы

Создание ссылки (владелец):

  1. Владелец выбирает запись для шэринга
  2. Генерируется случайный ключ ссылки (256 бит, на клиенте)
  3. Создаётся копия выбранных полей записи
  4. Копия шифруется ключом ссылки (AES-256-CBC)
  5. На сервер отправляется: зашифрованная копия + хеш ключа + настройки
  6. Сервер генерирует токен ссылки (43 символа)
  7. Владелец получает URL вида https://passwork.example/g/p/{token}

Открытие ссылки (получатель):

  1. Владелец передаёт URL получателю (email, мессенджер)
  2. Получатель открывает URL
  3. Браузер отправляет запрос на сервер (только токен, без ключа)
  4. Сервер проверяет токен (существует, не истёк, не одноразовый)
  5. Сервер возвращает зашифрованные данные
  6. JavaScript извлекает ключ из hash-части URL (#code=...)
  7. Данные расшифровываются ключом ссылки в браузере (AES-256-CBC)
  8. Получатель видит запись

Токен и ключ ссылки

Внешняя ссылка содержит два компонента:

ПараметрТокен ссылкиКлюч ссылки
НазначениеИдентификатор ссылкиШифрование данных
РасположениеPath URL (/g/p/{token})Hash URL (#code={key})
ГенерацияНа сервереНа клиенте
Длина43 символа100 символов → 256 бит
АлфавитA-Z, a-z, 0-9 (62)A-Z, a-z, 0-9, @, ! (64)
Входная энтропия~256 бит~596 бит
Видит сервер— (только хеш)

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

Только при включённом CSE

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

Формат URL:

https://passwork.example.com/g/p/{token}#code={ключ_ссылки}
Fragment не отправляется на сервер

Ключ ссылки передаётся в hash-части URL (после символа #). По стандарту HTTP, fragment (часть URL после #) никогда не отправляется на сервер — он обрабатывается только браузером на стороне клиента.

Это означает:

  • При переходе по ссылке сервер видит только {token}, но не видит ключ
  • Ключ доступен только JavaScript-коду в браузере получателя
  • Даже при перехвате запроса на стороне сервера ключ остаётся защищённым
  • Принцип Zero Knowledge соблюдается на уровне протокола HTTP

Хранение ключа на сервере

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

  • Сервер сохраняет только SHA-256 хеш ключа для проверки корректности при открытии
  • При открытии ссылки клиент вычисляет хеш введённого ключа и отправляет его на сервер
  • Сервер сравнивает хеши и возвращает зашифрованные данные

Структура данных ссылки

На сервере хранится:

ДанныеШифрование
Идентификатор ссылки (токен)
Копия данных записиКлючом ссылки + серверным ключом
SHA-256 хеш ключа ссылкиСерверным ключом
Настройки (TTL, одноразовость)Серверным ключом

Копируемые поля записи

При создании ссылки копируются:

ПолеВключается
Название
ЛогинДа (опционально)
Пароль (зашифрованный)
URLДа (опционально)
ОписаниеДа (опционально)
Дополнительные поляДа (опционально)
ВложенияДа (опционально, метаданные + ключи)

Настройки ссылки

НастройкаОписание
Время жизни (TTL)Ссылка автоматически удаляется после указанного времени
ОдноразовостьСсылка становится недействительной после первого просмотра
Защита паролемДополнительный пароль для доступа
Выбор полейКакие поля записи включить в ссылку

Безопасность внешних ссылок

Принцип Zero Knowledge

  • Ключ ссылки передаётся в hash-части URL (#code=...) — браузер не отправляет её на сервер
  • При переходе по ссылке сервер видит только токен, ключ остаётся только в браузере
  • Сервер хранит только хеш ключа для проверки корректности ввода
  • Данные на сервере зашифрованы и не могут быть прочитаны без ключа

Модель угроз

УгрозаЗащита
Перехват запроса на сервереКлюч в hash-части не отправляется на сервер
Перехват полного URLТребуется перехват на стороне клиента
Компрометация сервераДанные зашифрованы, ключа нет на сервере
Перебор токенов256 бит энтропии делают перебор невозможным
Повторное использованиеОдноразовые ссылки
Логирование URL на сервереВ логах только токен, без ключа

Рекомендации

  1. Для критичных данных — используйте одноразовые ссылки
  2. Для временного доступа — устанавливайте короткий TTL
  3. Для дополнительной защиты — передавайте ключ отдельным каналом
  4. Для аудита — отслеживайте использование ссылок в журнале

Включение вложений в ссылки

При создании ссылки с вложениями:

Структура оригинальной записи: ключ записи, файл (зашифрован ключом вложения), ключ вложения (зашифрован ключом записи).

При создании ссылки: генерируется ключ ссылки, ключ вложения перешифровывается ключом ссылки, данные файла остаются на сервере без изменений, в ссылку включается: ID файла + имя + перешифрованный ключ.

При открытии ссылки: получатель расшифровывает ключ вложения ключом ссылки, запрашивает файл с сервера по ID, расшифровывает файл ключом вложения.


Сравнение способов обмена

КритерийДоступ к сейфуПрямая передачаВнешняя ссылка
Требуется аккаунт
Доступ ко всем записям— (только к одной)— (только к одной)
Аудит доступа⚠️ Ограниченный
Можно отозвать
Zero Knowledge
Синхронизация изменений⚠️— (копия данных)