
Локальный зашифрованный менеджер паролей для логинов, заметок и API-ключей, использующий хранилище SQLite, защищённое с помощью Argon2id и XChaCha20-Poly1305; без облака и телеметрии.
GTK4 / gtkmm-4 · C++23 · CMake · SQLite · libsodium
lsPass хранит логины, защищённые заметки и API-ключи в локальном зашифрованном хранилище. Никакой сети, никакого облака, никакой телеметрии. Никакая секретная информация никогда не записывается на диск в открытом виде.
sudo apt install libgtkmm-4.0-dev libsqlite3-dev libsodium-dev nlohmann-json3-dev
cmake -B build
cmake --build build -j
ctest --test-dir build --output-on-failure # 41 unit tests
./build/lspass
Хранилище находится в ~/.local/share/lspass/vault.db (права 0600).
cmake -B build-rel -DCMAKE_BUILD_TYPE=Release
cmake --build build-rel -j
cd build-rel && cpack -G DEB # requires: dpkg-dev, file
sudo dpkg -i ../packages/deb/lspass_1.0.0_amd64.deb
Пакет .deb появляется в packages/deb/ и включает бинарный файл, запись запуска com.lspass.App.desktop и иконку приложения (packaging/com.lspass.App.svg, устанавливается в тему hicolor).
cmake --install без CPack использует префикс по умолчанию /usr/local. Зависимости времени выполнения (libgtkmm-4.0, libsodium, libsqlite3, …) определяются автоматически с помощью dpkg-shlibdeps, поэтому apt --fix-broken install или sudo apt install ./lspass_1.0.0_amd64.deb подтянет всё необходимое.
Основано на OWASP Password Storage Cheat Sheet, документации libsodium и шаблоне конвертного шифрования, используемом известными менеджерами паролей (обёртывание ключей в стиле Bitwarden и KeePassXC):
master password
│ Argon2id (memory-hard KDF, random 128-bit salt,
▼ opslimit/memlimit = libsodium "moderate",
KEK (32 B) parameters stored in vault for future upgrades)
│ XChaCha20-Poly1305 (key wrap)
▼
DEK (32 B, random) ── wraps nothing else, RAM only, never on disk
│ XChaCha20-Poly1305 AEAD per field
▼
SQLite: entries(title, username, url [plaintext metadata],
secret, notes [sealed blobs: nonce‖ct‖poly1305 tag])
Почему такой выбор:
| Решение | Обоснование |
|---|---|
| Argon2id KDF | Первый выбор OWASP для ключей, выводимых из пароля; ресурсоёмкий по памяти, устойчив к подбору на GPU/ASIC. Параметры превышают минимум OWASP (m ≥ 19 МиБ, t = 2). |
| Конвертное шифрование (случайный DEK, обёрнутый KEK) | Смена мастер-пароля лишь повторно оборачивает 32 байта вместо повторного шифрования всего хранилища; компрометация DEK невозможна без KEK. |
| XChaCha20-Poly1305 AEAD | 192-битные случайные nonce делают повторное использование nonce несущественным; Poly1305 аутентифицирует каждый шифротекст, поэтому неверный мастер-пароль обнаруживается по ошибке аутентификации — нигде не хранится ни хеш пароля, ни проверочное значение. |
Привязка AAD (lspass:v1:entry:<id>:<field>) | Атакующий с правом записи в файл БД не сможет перенести шифротексты между записями или полями. |
| Новый nonce при каждой записи | Каждое сохранение заново запечатывает данные новым случайным nonce. |
| Гигиена памяти | Ключи хранятся в SecureBytes, стираются через sodium_memzero при уничтожении; интерфейс очищает поля пароля сразу после использования; буфер обмена автоматически очищается через 30 с после копирования (и только если в нём всё ещё находится наша секретная информация). |
| Права на файл | Файл хранилища имеет chmod 0600. |
| Генератор паролей | CSPRNG ядра с методом отклонения (без смещения из-за взятия по модулю), гарантирует наличие всех включённых классов символов, по умолчанию исключает неоднозначные символы; ~128 бит энтропии при стандартных 20 символах. |
Честный компромисс: title, username и url хранятся в открытом виде, чтобы список и поиск работали без расшифровки каждой строки. Сами секреты (пароли, заметки, API-ключи) всегда находятся в запечатанных blob. Модульный тест secrets_not_stored_in_plaintext побайтово сканирует файл хранилища (включая WAL) на наличие контрольного секрета, чтобы подтвердить это.
ctest запускает три набора тестов (41 случай) для независимой от GUI основной библиотеки. Весь набор также выполняется под AddressSanitizer + UBSan:
cmake -B build-san -DCMAKE_CXX_FLAGS="-fsanitize=address,undefined" \
-DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address,undefined"
cmake --build build-san -j && ctest --test-dir build-san
Релизные сборки добавляют -fstack-protector-strong, -D_FORTIFY_SOURCE=2, PIE и полный RELRO (-Wl,-z,relro,-z,now).
src/core/crypto.{hpp,cpp} SecureBytes, Argon2id KDF, XChaCha20-Poly1305, key wrap
src/core/vault.{hpp,cpp} SQLite vault, envelope encryption, CRUD
src/core/generator.{hpp,cpp} CSPRNG password/passphrase generator
src/ui/ gtkmm-4 UI (unlock screen, list, editor dialogs)
tests/ ctest suites (no external framework needed)
MIT — см. LICENSE.