GophKeeper представляет собой клиент-серверную систему, позволяющую пользователю надёжно и безопасно хранить логины, пароли, бинарные данные и прочую приватную информацию.
- регистрация, аутентификация и авторизация пользователей;
- хранение приватных данных;
- синхронизация данных между несколькими авторизованными клиентами одного владельца;
- передача приватных данных владельцу по запросу.
- аутентификация и авторизация пользователей на удалённом сервере;
- доступ к приватным данным по запросу.
- создание, редактирование и удаление данных на стороне сервера или клиента;
- формат регистрации нового пользователя;
- выбор хранилища и формат хранения данных;
- обеспечение безопасности передачи и хранения данных;
- протокол взаимодействия клиента и сервера;
- механизмы аутентификации пользователя и авторизации доступа к информации.
- клиент должен распространяться в виде CLI-приложения с возможностью запуска на платформах Windows, Linux и Mac OS;
- клиент должен давать пользователю возможность получить информацию о версии и дате сборки бинарного файла клиента.
- пары логин/пароль;
- произвольные текстовые данные;
- произвольные бинарные данные;
- данные банковских карт. Для любых данных должна быть возможность хранения произвольной текстовой метаинформации (принадлежность данных к веб-сайту, личности или банку, списки одноразовых кодов активации и прочее).
Ниже описаны базовые сценарии взаимодействия пользователя с системой.
- Пользователь получает клиент под необходимую ему платформу.
- Пользователь проходит процедуру первичной регистрации.
- Пользователь добавляет в клиент новые данные.
- Клиент синхронизирует данные с сервером.
- Пользователь получает клиент под необходимую ему платформу.
- Пользователь проходит процедуру аутентификации.
- Клиент синхронизирует данные с сервером.
- Пользователь запрашивает данные.
- Клиент отображает данные для пользователя.
- поддержка данных типа OTP (one time password);
- поддержка терминального интерфейса (TUI — terminal user interface);
- использование бинарного протокола;
- наличие функциональных и/или интеграционных тестов;
- описание протокола взаимодействия клиента и сервера в формате Swagger.
- Пользователь регистрируется и затем авторизуется используя клиент для своей ОС
- При авторизации происходит обмен публичными rsa ключами
- Клиент передает серверу свой aes ключ зашифрованный публичным ключом сервера
- Сервер расшифровывает aes ключ клиента своим приватным rsa ключом и сохраняет его в бд
- Дальнейший обмен происходит в зашифрованном aes клюбчом виде, путём передачи сообщений от клиента к серверу и от сервера к клиенту
Конфигурирование сервера начинается с файла .server.env
# Адресс и порт на котором сервер принимает подключения
ADDRESS = ":9097"
# Подключение к БД
DSN = "postgres://postgres:123@localhost:5456/gophkeeper?sslmode=disable"
# Уроверь логирования
LOG_LEVEL = "debug"
# Уровень сжатия gzip для http
HTTP_COMPRESS_LEVEL = 5
# Алгоритм хэширования пароля
PASSWORD_ALGO_HASHING = "sha512"
# Путь к папке для сохранения файлов пользователей
PATH_FILE_STORAGE = "/home/user/load_project"
# Путь для сохранения публичного и приватного ключей
PATH_KEYS = "/home/user/load_project"
# Перезаписывать ключи при старте сервера
OVERWRITE_KEYS = false
Клиент работает в консольном режиме и выполнен на базе charmbracelet/bubbletea. Конфигурация клиента начинается с файла client.yaml. Файл конфигурации должен находится рядом с клиентом.
# Адрес сервера
ServerAddress: "http://localhost:9097"
# Уровень логирования клиента
LogLever: "info"
# Папка для сохранения файлов с сервера
FilePath: "/tmp"
# Путь с расположением публичного и приватного ключей клиента
PathKeys: "/home/djo/Загрузки/load_project/client"
# Путь к папке с публичным ключем сервера
PathPublicKeyServer: "/home/djo/Загрузки/load_project/public_server"
# Перезаписывать клиентские ключи при старте клиента
OverwriteKeys: false
При запуске клиента будут сгенерированы необходимые ключи и сохранены в PathKeys
- /api/v1/save_public_key "приём от клиента публичного ключа"
- /api/v1/save_client_private_key "приём от клиента приватного ключа(aes используется для шифрования данных)"
- /api/v1/download_server_public_key "клиент забирает публичный ключ сервера"
- /api/v1/items_list "список сохранённых данных"
- /api/v1/item_get/{uuid} "получить данные по uuid"
- /api/v1/save_card_data "добавить/изменить данные банковской карты"
- /api/v1/save_text_data "добавить/изменить текстовые данные"
- /api/v1/file_data/init "инициализация приёма файла, базовые данные о файле"
- /api/v1/file_data/load/{file_uuid}/{part} "приём данных файла"
- /api/v1/file_data/get/{file_uuid}/{part} "отдача файла клиенту"
- /api/v1/health "состояние сервера"
- /api/v1/register "регистрация пользователя"
- /api/v1/login "авторизация"
- Регистрация / авторизация пользователя
- Доступ к данным только после авторизации
- Добавление / изменение данных
- Ввод данных банковских карт, текстовых данных, бинарных данных (отправка и получение файлов)
- Табличный просмотр введённых данных
- Моккирования запросов к бд github.com/DATA-DOG/go-sqlmock v1.5.2
- Интерфейс консоли github.com/charmbracelet/bubbles v0.20.0
- Интерфейс консоли github.com/charmbracelet/bubbletea v1.2.4
- Работа с типами файлов github.com/gabriel-vasile/mimetype v1.4.7
- Маршрутизация HTTP github.com/go-chi/chi/v5 v5.1.0
- Работа с JWT github.com/go-chi/jwtauth/v5 v5.3.1
- Утилита для построени запросов и разбора ответа github.com/go-chi/render v1.0.3
- Валидация полей на основе псевдокода github.com/go-playground/validator/v10 v10.23.0
- Работа с JWT github.com/golang-jwt/jwt/v4 v4.5.1
- Утилита для сравнения объектов github.com/google/go-cmp v0.6.0
- Генерация UUID github.com/google/uuid v1.6.0
- Работа с Postgres github.com/jackc/pgx/v5 v5.7.1
- Миграции github.com/pressly/goose/v3 v3.23.0
- Конфигурация из файлов github.com/spf13/viper v1.19.0
- Утилиты для тестирования приложения github.com/stretchr/testify v1.10.0
- Логирование go.uber.org/zap v1.27.0
go test ./...