Перейти к содержанию

Карта пайщика

Каждый пайщик при вступлении в любой кооператив платформы получают цифровое удостоверение - карту пайщика.

Карта пайщика (CARD.COOP) - это цифровое удостоверение пайщика

Каждая карта пайщика содержит зашифрованную информацию: ФИО, дату рождения, адрес электронной почты, по желанию пайщика - паспортные данные. Кроме информации о пайщике, каждая карта содержит приватный ключ, которым пайщик подписывает документы на платформе, а также информацию о том, какой кооператив выпустил карту, и о тех кооперативах, кто подтвердил корректность персональных данных на этой карте.

Карты пайщика выпускаются кооперативами с использованием сервиса CARD.COOP. Для выпуска карт кооперативы используют программное обеспечение провайдеров, которые обеспечивают реализацию стандартизированных сценариев, описанных в этом разделе посредством официальных SDK или публичных точек доступа API.

Краткое описание

Система представляет собой стандарт для безопасной регистрации, аутентификации и обмена конфиденциальными данными между пользователями и кооперативами. Она использует протокол с нулевым разглашением (zero-knowledge), что означает, что сервер никогда не знает реального пароля пользователя, его ключей подписи или приватных данных. Вся чувствительная информация шифруется на стороне клиента, и сервер хранит только зашифрованные данные.

Основные компоненты системы

Пользователь при регистрации или входе в любой кооператив платформы взаимодействует только с клиентским сервисом id.card.coop, который обеспечивает безопасное предоставление зашифрованных данных кооперативу и обеспечивает цифровую подпись документов без передачи приватного ключа за пределы клиентского приложения.

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

Клиентское приложение: Веб-сайт стандарта CARD.COOP, который пользователь использует в браузере для взаимодействия с системой.

Сервер: Бэкенд стандарта CARD.COOP, который обрабатывает запросы от клиентского приложения, хранит зашифрованные данные и управляет аутентификацией и авторизацией.

Кооператив: Организация или сервис, которому пользователь может предоставить доступ к своим конфиденциальным данным. Обычно это кооператив, который использует программное обеспечение своего провайдера.

Как работает система

Работу системы CARD.COOP можно разделить для пользователя на 5 этапов: регистрация, сохранение данных, предоставление доступа, подпись документов и отзыв доступа.

sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер
    participant Кооператив

    Кооператив->>Пользователь: Запрос доступа

    Пользователь->>Клиент: Регистрация / Вход
    Клиент->>Сервер: Аутентификация
    Сервер-->>Клиент: Токены доступа

    Пользователь->>Клиент: Ввод приватных данных
    Клиент->>Клиент: Генерация ключа подписи
    Клиент->>Клиент: Шифрование данных

    Клиент->>Сервер: Сохранение зашифрованных данных

    Пользователь->>Клиент: Предоставление доступа

    Клиент->>Сервер: Запрос личных данных и информации о кооперативе
    Сервер-->>Клиент: Зашифрованные данные

    Клиент->>Клиент: Дешифрование данных

    Клиент->>Клиент: Перешифрование личных данных только для кооператива

    Клиент->>Сервер: Сохранение данных для кооператива

    Сервер-->>Клиент: Тикет доступа
    Клиент->>Кооператив: Передача тикета

    Кооператив->>Сервер: Обмен тикета на токен
    Сервер-->>Кооператив: Токен доступа кооператива
    Кооператив->>Сервер: Запрос данных
    Сервер-->>Кооператив: Зашифрованные данные
    Кооператив->>Кооператив: Расшифровка данных

    Кооператив ->>Пользователь: Документ на подпись

    Пользователь ->>Клиент: Ввод PIN-кода
    Клиент->>Клиент: Дешифрование ключа подписи
    Клиент->>Клиент: Цифровая подпись документа
    Клиент->>Кооператив: Подписанный документ

    Пользователь->>Клиент: Отзыв доступа
    Клиент->>Сервер: Удаление зашифрованных данных для кооператива

Вход / регистрация

При регистрации пользователь вводит email, пароль. Из пароля генерируется мастер-ключ для шифрования данных, и хэш-ключ, который используется на сервере в качестве пароля.

После ввода почты, пароля, сервер предоставляет клиенту токены доступа, которые клиент пользователя теперь будет прикладывать к каждому запросу, подтверждая собственную авторизацию.

Пользователь попадает на этап регистрации при вступлении в любой кооператив. После вступления в любой кооператив, вступление в любой другой кооператив происходит по принципам "быстрого входа" - без повторного личных ввода данных.

Ввод email: Пользователь начинает процесс регистрации, вводя свой адрес электронной почты в клиентском приложении.

Получение серверной соли и UUID: Клиентское приложение отправляет email на сервер, и сервер отвечает, предоставляя уникальный идентификатор (UUID) и серверную соль (server_salt).

Серверная соль - это случайная строка, которая используется для защиты от атак с использованием заготовленных таблиц.

sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер

    Пользователь->>Клиент: Вводит email (user@example.com)
    Клиент->>Сервер: POST /auth/initiate-registration<br/>{"email": "user@example.com"}
    Сервер-->>Клиент: {"uuid": "...", "serverSalt": "..."}

    Пользователь->>Клиент: Вводит пароль
    Клиент->>Клиент: Генерирует хэш-ключ
    Клиент->>Сервер: POST /auth/complete-registration<br/>{"email": "user@example.com", "hashKey": "...", "uuid": "..."}
    Сервер-->>Клиент: {"accessToken": "...", "refreshToken": "..."}

Генерация хэш-ключа: Клиентское приложение использует введенный пользователем пароль и полученную серверную соль для создания хэш-ключа (hashKey). Это делается с помощью криптографической функции хэширования, которая повторяется 1000 итераций.

hashKey = hash(пароль + server_salt + 1000)

Отправка hashKey на сервер: Клиентское приложение отправляет на сервер email, hashKey и UUID.

Сохранение пользователя: Сервер сохраняет информацию о пользователе, включая email, hashKey и серверную соль. Поскольку сервер знает только хэшированную версию пароля, он не может узнать сам пароль.

Выдача токенов: Сервер генерирует пару токенов — accessToken и refreshToken — и отправляет их клиентскому приложению.

Сохранение токенов: Клиентское приложение сохраняет полученные токены для последующего использования.

Сохранение данных

пользователь вводит персональные данные. Данные зашифровываются и сохраняются на сервере с использованием мастер-ключа и пинкода пользователя. Сервер никогда не получает пароль или мастер-ключ пользователя, и не может расшифровать данные без пользователя. Все криптографические операции по работе с данными пользователь выполняет у себя на клиенте.

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

  1. Выпуск карты пользователя Ввод приватных данных: Пользователь вводит свои личные данные, которые он хочет сохранить (например, паспортные данные, личные заметки и т.д.).

  2. Выпуск карты пользователя Ввод приватных данных: Пользователь вводит свои личные данные, которые он хочет сохранить (например, паспортные данные, личные заметки и т.д.).

Генерация AES-ключа: Клиентское приложение создает симметричный ключ шифрования (AESKey) на основе пароля пользователя и его email (используется в качестве соли). Это делается с помощью функции деривации ключа с большим количеством итераций (например, 100000), чтобы усложнить перебор ключей.

sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер

    Пользователь->>Клиент: Вводит приватные данные
    Клиент->>Клиент: Генерирует AESKey = deriveKey(пароль, email, 100000)
    Клиент->>Клиент: Генерирует username и WIFKey
    Клиент->>Клиент: Шифрует данные и WIFKey с помощью AESKey
    Клиент->>Сервер: POST /card/issue<br/>{"username": "...", "encryptedData": "...", "coopName": "...", "signature": "..."}<br/>Authorization: Bearer accessToken
    Сервер-->>Клиент: {"id": "...", "username": "...", "coopName": "..."}
AESKey = deriveKey(пароль, email, 100000)

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

Отправка зашифрованных данных на сервер: Клиентское приложение отправляет на сервер username, зашифрованные данные (encryptedData), название кооператива (coopName) и цифровую подпись (signature).

Сохранение карты: Сервер сохраняет информацию о карте пользователя, включая username, encryptedData, coopName, signature и идентификатор пользователя.

  1. Аутентификация пользователя (Вход) Ввод email и пароля: Пользователь вводит свой email и пароль для входа в систему.

Получение серверной соли и UUID: Клиентское приложение отправляет email на сервер, и сервер отвечает, предоставляя server_salt и UUID.

Генерация hashKey: Клиентское приложение снова генерирует hashKey с использованием введенного пароля и полученной серверной соли.

sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер

    Пользователь->>Клиент: Вводит email (user@example.com)
    Клиент->>Сервер: POST /auth/initiate-login<br/>{"email": "user@example.com"}
    Сервер-->>Клиент: {"uuid": "...", "serverSalt": "..."}

    Пользователь->>Клиент: Вводит пароль
    Клиент->>Клиент: Генерирует hashKey = hash(пароль + serverSalt + 1000)
    Клиент->>Сервер: POST /auth/complete-login<br/>{"email": "user@example.com", "hashKey": "...", "uuid": "..."}
    Сервер-->>Клиент: {"accessToken": "...", "refreshToken": "..."}
    Клиент->>Пользователь: Сохраняет accessToken и refreshToken
hashKey = hash(пароль + server_salt + 1000)

Отправка hashKey на сервер: Клиентское приложение отправляет на сервер email, hashKey и UUID.

Проверка на сервере: Сервер сравнивает полученный hashKey с тем, который хранится в базе данных для этого email.

Выдача токенов: Если hashKey совпадает, сервер генерирует новый accessToken и refreshToken и отправляет их клиентскому приложению.

  1. Предоставление доступа кооперативу Переход по ссылке кооператива: Кооператив направляет пользователя на сайт системы с параметрами coopName и callbackUrl.
sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер
    participant Кооператив

    Кооператив->>Пользователь: Перенаправляет на id.card.coop с coopName и callbackUrl
    Пользователь->>Клиент: Переходит на id.card.coop
    Клиент->>Сервер: POST /access/prepare-share-data<br/>{"coopName": "exampleCoop"}<br/>Authorization: Bearer accessToken
    Сервер->>Сервер: Получает coopPublicKey
    Сервер-->>Клиент: {"coopName": "exampleCoop", "coopPublicKey": "COOP_PUBLIC_KEY"}

Получение информации о кооперативе: Клиентское приложение отправляет запрос на сервер, чтобы получить информацию о кооперативе, включая его публичный ключ (coopPublicKey).

Получение и расшифровка данных: Клиентское приложение запрашивает зашифрованные данные пользователя с сервера и расшифровывает их с использованием AESKey.

Перешифровка данных для кооператива: Расшифрованные данные затем шифруются на клиенте с использованием публичного ключа кооператива (coopPublicKey). Это гарантирует, что только кооператив сможет расшифровать эти данные своим приватным ключом.

sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер

    Клиент->>Сервер: GET /card/get<br/>Authorization: Bearer accessToken
    Сервер-->>Клиент: {"encryptedData": "encrypted-private-data-xyz"}

    Клиент->>Клиент: Расшифровывает encryptedData с помощью AESKey
    Клиент->>Клиент: Перешифровывает данные с использованием coopPublicKey (COOP_PUBLIC_KEY)
    Клиент->>Сервер: POST /access/share-data<br/>{"coopName": "exampleCoop", "encryptedData": "encrypted-data-for-coop-999"}<br/>Authorization: Bearer accessToken
    Сервер-->>Клиент: {"ticket": "access-ticket-abcdef"}
    Клиент->>Пользователь: Перенаправляет обратно на сайт кооператива с ticket

Отправка перешифрованных данных на сервер: Клиентское приложение отправляет зашифрованные для кооператива данные на сервер вместе с coopName.

Получение тикета: Сервер сохраняет зашифрованные данные и возвращает уникальный тикет (accessId), который будет использоваться кооперативом для доступа к данным.

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

  1. Получение данных кооперативом
    sequenceDiagram
        participant Кооператив
        participant Сервер
    
        Кооператив->>Сервер: POST /access/exchange-ticket<br/>{"ticket": "access-ticket-abcdef"}
        Сервер->>Сервер: Проверяет валидность ticket
        Сервер-->>Кооператив: {"accessToken": "coop-access-token-112233"}

Обмен тикета на токен: Кооператив отправляет тикет на сервер и обменивает его на специальный accessToken, который предоставляет ограниченный доступ к данным пользователя.

Запрос зашифрованных данных: Кооператив использует полученный accessToken для запроса зашифрованных данных пользователя с сервера.

Расшифровка данных: Кооператив получает зашифрованные данные и расшифровывает их с помощью своего приватного ключа. Теперь он имеет доступ к информации, которую пользователь решил ему предоставить.

sequenceDiagram
    participant Кооператив
    participant Сервер

    Кооператив->>Сервер: GET /access/get-encrypted-data/user123/exampleCoop<br/>Authorization: Bearer coop-access-token-112233
    Сервер->>Сервер: Проверяет coopAccessToken и права доступа
    Сервер-->>Кооператив: {"encryptedData": "encrypted-data-for-coop-999"}
    Кооператив->>Кооператив: Расшифровывает encryptedData с помощью coopPrivateKey
  1. Управление доступом Отзыв доступа: Пользователь может в любой момент отозвать доступ кооператива к своим данным. Для этого он отправляет соответствующий запрос на сервер, и сервер удаляет зашифрованные данные для этого кооператива.
sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер

    Пользователь->>Клиент: Решает отозвать доступ у exampleCoop
    Клиент->>Сервер: DELETE /access/revoke/exampleCoop<br/>Authorization: Bearer accessToken
    Сервер->>Сервер: Удаляет AccessRequest для пользователя и exampleCoop
    Сервер-->>Клиент: {"message": "Доступ успешно отозван"}

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

  1. Обновление токенов и выход из системы Обновление accessToken: Когда срок действия accessToken истекает, клиентское приложение может использовать refreshToken для получения нового accessToken, отправив соответствующий запрос на сервер.
sequenceDiagram
    participant Клиент
    participant Сервер

    Клиент->>Сервер: POST /auth/refresh-token<br/>Authorization: Bearer refreshToken
    Сервер->>Сервер: Проверяет refreshToken
    Сервер-->>Клиент: {"accessToken": "new-access-token", "refreshToken": "new-refresh-token"}
    Клиент->>Клиент: Сохраняет новые accessToken и refreshToken

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

sequenceDiagram
    participant Клиент
    participant Сервер

    Клиент->>Сервер: POST /auth/logout<br/>Authorization: Bearer refreshToken
    Сервер->>Сервер: Отзывает refreshToken
    Сервер-->>Клиент: {"message": "Вы успешно вышли из системы"}
    Клиент->>Клиент: Очищает сохраненные токены

Примечания

Участники:

Пользователь: Конечный пользователь, взаимодействующий с системой. Клиент: Клиентское приложение (например, веб-браузер или мобильное приложение). Сервер: Бэкенд-сервер, обрабатывающий API-запросы. Кооператив: Кооператив, запрашивающий доступ к данным пользователя.

Заголовки авторизации: accessToken пользователя используется для аутентификации запросов от клиента к серверу. coopAccessToken кооператива используется кооперативом для доступа к данным пользователя после обмена тикета. Шифрование данных:

AESKey: Получен путем деривации пароля пользователя и email, используется для шифрования/дешифрования приватных данных на стороне клиента.

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

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

Токены и тикеты: accessToken: Краткосрочный JWT для аутентификации запросов. refreshToken: Долгосрочный токен для получения новых accessToken. ticket: Уникальный идентификатор, используемый кооперативом для обмена на accessToken. Процессы:

Алгоритм и методы

Преимущества системы

Регистрация и вход реализуют протокол нулевого разглашения (zero-knowledge), при котором сервер никогда не видит реальный пароль пользователя. Предоставление доступа требует согласия пользователя и включает перешифровку данных специально для кооператива. Отзыв доступа удаляет возможность кооператива получать данные пользователя. Обновление токенов и выход обеспечивают непрерывность сессии и безопасность.

Безопасность: Поскольку сервер никогда не видит пароли или приватные данные пользователя в открытом виде, риск компрометации информации значительно снижается.

Контроль пользователя: Пользователь полностью контролирует, кому и какие данные он предоставляет. Он может в любой момент отозвать доступ или предоставить его повторно.

Гибкость: Система поддерживает множественные кооперативы, и пользователь может взаимодействовать с разными организациями, предоставляя им доступ к своим данным по мере необходимости.

Приватность: Использование асимметричного шифрования гарантирует, что только кооператив, которому предназначены данные, сможет их расшифровать.

Пример сценария использования Регистрация: Ирина регистрируется в системе, используя свой email и пароль. Ее пароль никогда не отправляется на сервер в открытом виде.

Сохранение данных: Она вводит свои персональные данные и сохраняет их в зашифрованном виде на сервере.

Предоставление доступа: Кооператив "Здоровье" запрашивает у Ирины доступ к ее медицинским данным. Ирина соглашается и предоставляет доступ, перешифровывая свои данные на публичный ключ кооператива.

Получение данных кооперативом: Кооператив "Здоровье" получает зашифрованные данные и расшифровывает их своим приватным ключом.

Отзыв доступа: Позже Ирина решает отозвать доступ кооператива к ее данным и делает это через клиентское приложение.

Заключение

Система обеспечивает безопасное хранение и обмен конфиденциальными данными, предоставляя пользователю полный контроль над своими данными и тем, кто к ним имеет доступ. Использование протокола с нулевым разглашением и асимметричного шифрования делает систему надежной и устойчивой к компрометации данных.

CARD.COOP - это стандарт, и его код опубликован. Клиентов и серверов CARD.COOP может быть много - как личных, пользовательских, так и кооперативных. Исполнение стандарта CARD.COOP возможно в физических (пластиковых) картах и мобильных приложениях.

sequenceDiagram
    participant Пользователь
    participant Клиент
    participant Сервер
    participant Кооператив

    Кооператив->>Пользователь: Запрос доступа

    Пользователь->>Клиент: Регистрация / Вход
    Клиент->>Сервер: Аутентификация
    Сервер-->>Клиент: Токены доступа