AES-256-GCM with Qt6 GUI providing on-demand credential management
π‘οΈ Features | π Quick Start | π Documentation | π€ Contributing
An encryption and credential manager built with C++23 and powered by OpenSSL AES-256-GCM.It pairs a Qt6 interface, where credentials are stored encrypted and only decrypted on demand, with a streaming CLI that slots into pipes and scripts. seal can encrypt individual files, entire directories, or inline text, and fills credentials directly into applications via its auto-fill controller. Under the hood, every secret sits in hardened memory - locked pages, guard pages, canary sentinels and the clipboard is scrubbed automatically if used.
Important
Windows 10/11 Only - seal enforces Windows-specific security mitigations and will not build on other platforms.
- For best protection, enable
SeLockMemoryPrivilegevia Group Policy (gpedit.msc-> Local Policies -> User Rights Assignment -> Lock pages in memory). - UI icons use Font Awesome Pro 7.2 SVGs, which are not included in this repository due to their commercial license. You must supply your own
assets/svgs/from a valid Font Awesome Pro subscription.
/* ============================================================================================ *
* β β£ β‘€β β’β£β£β‘β β β β ⣦β‘β β β β β β
* β β β β β’Ώβ‘β β β β’β£β£°β£Ώβ£Ώβ‘β β β β β’
* :::::::: :::::::::: ::: ::: β β β β β β’Ήβ β β β£Έβ£Ώβ‘Ώβ β Ώβ£Ώβ‘β β °β Ώβ£Ώ
* :+: :+: :+: :+: :+: :+: β β β β β β’β£ β Ύβ Ώβ Ώβ Ώβ β’°β£β β’Ώβ β β β
* +:+ +:+ +:+ +:+ +:+ β’²β£Άβ£Άβ‘β β’β£β£€β£Άβ£Άβ‘¦β β ⣿⣦β β β£Ύβ‘β
* +#++:++#++ +#++:++# +#++:++#++: +#+ β β β Ώβ£Ώβ‘β β β β β’Ώβ£§β β ³β£Ώβ£Ώβ‘β Έβ£Ώβ£Ώβ
* +#+ +#+ +#+ +#+ +#+ β β β β‘β β β β’⣴⣿β β β β£β£Ώβ£Ώβ’ β‘β’»β‘
* #+# #+# #+# #+# #+# #+# β β β β β β β β£Ύβ£Ώβ£Ώβ£β β’Ήβ£Ώβ£Ώβ£·β‘β β’Έβ‘
* ######## ########## ### ### ########## β β β β β β β β β β β β β β β β Ώβ’Ώβ£Άβ£Όβ
* β β β β’°β£§β£€β €β β β β β β β β β β β β β
*
* << P A S S M A N A G E R >>
*
* ============================================================================================ */
seal ships with a Qt6 QML graphical manager and a streaming CLI for scripts and automation.
---
config:
look: handDrawn
theme: mc
themeVariables:
fontSize: 18px
layout: elk
---
graph LR
classDef gui fill:#134e3a,stroke:#10b981,color:#e2e8f0
classDef cli fill:#1e3a5f,stroke:#3b82f6,color:#e2e8f0
classDef core fill:#2e1f5e,stroke:#8b5cf6,color:#e2e8f0
subgraph GUI["π₯οΈ Qt6 GUI"]
Vault["π Vault Manager"]:::gui
AutoFill["β¨οΈ Auto-Fill"]:::gui
QR["π· Webcam QR"]:::gui
end
subgraph CLI["β‘ Command Line"]
Stream["π‘ Stream Mode"]:::cli
Interactive["π¬ Interactive"]:::cli
Import["π₯ Batch Import"]:::cli
end
subgraph Core["π‘οΈ Crypto Engine"]
AES["π AES-256-GCM"]:::core
Memory["π§± Hardened Memory"]:::core
Clipboard["π Clipboard Scrub"]:::core
end
GUI --> Core
CLI --> Core
---
config:
look: handDrawn
theme: mc
themeVariables:
fontSize: 18px
layout: elk
---
graph LR
classDef lock fill:#7c2d12,stroke:#f97316,color:#fef3c7
classDef guard fill:#4c1d95,stroke:#e879f9,color:#e2e8f0
classDef wipe fill:#064e3b,stroke:#34d399,color:#e2e8f0
classDef canary fill:#713f12,stroke:#facc15,color:#fef9c3
V["π VirtualLock"]:::lock
G["π§ Guard Pages"]:::guard
S["π§Ή SecureZeroMemory"]:::wipe
C["π€ 0xD0 Canary"]:::canary
V --- G --- S --- C
- π VirtualLock - Locks sensitive pages to prevent swapping to disk
- π§ Guard Pages -
PAGE_NOACCESSregions flanking every allocation detect overflows - π§Ή Secure Wiping -
SecureZeroMemoryscrubs data before deallocation - π€ Canary Protection - 0xD0 sentinel at the tail of every buffer catches overruns
- π Clipboard Scrubbing - Auto-wipes copied credentials after a configurable TTL
- π DPAPI In-Memory Encryption - Master password is wrapped with
CryptProtectMemorywhile at rest - π Scrypt KDF - Master password stretched with scrypt before AES key generation
seal enables Windows security mitigations at startup:
- Prohibits dynamic code generation (
ProcessDynamicCodePolicy) - Requires signed images for loading (
ProcessSignaturePolicy) - Enables strict handle checks (
ProcessStrictHandleCheckPolicy) - Restricts image loading to System32 and known paths (
ProcessImageLoadPolicy) - Disables extension point DLLs such as AppInit and Winsock LSPs (
ProcessExtensionPointDisablePolicy) - Side-channel isolation - SMT branch-target isolation, security-domain isolation, page-combine disable, SSBD, core-sharing restriction
- Detects and blocks Remote Desktop sessions
- π‘οΈ Debugger Detection - Three-layer check terminates on detection
- π₯ Crash Dump Suppression - Windows Error Reporting disabled
- π§± Process Access DACL - Restrictive SDDL blocks external processes from reading memory
- π₯ Heap Hardening -
HeapEnableTerminationOnCorruptionterminates the process immediately on heap corruption - π SeLockMemoryPrivilege - Requested at startup to support large-page VirtualLock
- β¨οΈ Keyboard Hook Detection - Timing-based heuristic detects keylogger hooks before auto-type
Credentials are stored in .seal files using on-demand decryption - each record stays encrypted until the moment you need it.
| Component | Description |
|---|---|
| Platform | AES-256-GCM encrypted, displayed as search index |
| Credential | username:password blob, decrypted only on access |
- π· Webcam QR - Scan master password from a QR code via the built-in webcam capture
- β¨οΈ Auto-Fill - Type credentials directly into target application fields
- π Batch Processing - Encrypt/decrypt entire directories recursively
- π‘ Stream Mode - Pipe-friendly stdin/stdout encryption for scripting
| Component | Technology |
|---|---|
| Language | C++20 |
| GUI Framework | Qt6 (QML + Quick) |
| Cryptography | OpenSSL 3.x |
| Build System | CMake 3.20+ |
| Package Manager | vcpkg |
| Testing | Google Test |
| Documentation | Doxide + MkDocs |
| QR Capture | OpenCV QRCodeDetector |
| Platform | Windows 10/11 (64-bit) |
- Windows 10/11 (64-bit)
- Visual Studio 2022 (MSVC v143, C++23)
- CMake 3.20+
- vcpkg with the toolchain at a known path
- Python 3 (for documentation post-processing)
- Font Awesome Pro 7.2 SVGs in
assets/svgs/(not included, requires license) - doxide + mkdocs (optional, for API docs generation)
# 1. Clone the repository
git clone https://github.com/lextpf/seal.git
cd seal
# 2. Build (configure + compile + docs)
.\build.bat
# 3. Run
.\build\bin\Release\seal.exeOutput: build/bin/Release/seal.exe
---
config:
look: handDrawn
theme: mc
themeVariables:
fontSize: 18px
layout: elk
---
graph TB
classDef core fill:#1e3a5f,stroke:#3b82f6,color:#e2e8f0
classDef gui fill:#134e3a,stroke:#10b981,color:#e2e8f0
classDef vault fill:#4a3520,stroke:#f59e0b,color:#e2e8f0
classDef crypto fill:#2e1f5e,stroke:#8b5cf6,color:#e2e8f0
Main["π main.cpp"]:::core
subgraph GUI["π₯οΈ GUI Layer"]
Backend["βοΈ Backend"]:::gui
QML["π¨ QML Views"]:::gui
Fill["β¨οΈ FillController"]:::gui
end
subgraph Vault["ποΈ Vault Layer"]
VaultModel["π VaultListModel"]:::vault
VaultIO["πΎ Vault I/O"]:::vault
end
subgraph Crypto["π Crypto Layer"]
Cryptography["π Cryptography"]:::crypto
FileOps["π FileOperations"]:::crypto
Clipboard["π Clipboard"]:::crypto
end
Main --> GUI
Main --> Vault
GUI --> Vault
Vault --> Crypto
GUI --> Crypto
| File | Purpose |
|---|---|
main.cpp |
Entry point, CLI argument parsing |
Cryptography |
AES-256-GCM primitives, key derivation |
FileOperations |
File/directory encryption and streaming |
Vault |
Vault format, on-demand decryption |
VaultModel |
QML list model for vault entries |
Backend |
QML β C++ bridge, application logic |
FillController |
Credential auto-fill into target windows |
Clipboard |
Clipboard operations with TTL scrubbing |
Utils |
String, hex, and path utilities |
seal/
|-- src/ # C++ source code
| |-- main.cpp # Entry point and CLI parsing
| |-- Cryptography.cpp/h # AES-256-GCM, scrypt key derivation
| |-- FileOperations.cpp/h # File/directory/stream encryption
| |-- Vault.cpp/h # Vault format and on-demand decryption
| |-- VaultModel.cpp/h # QML list model for vault entries
| |-- Backend.cpp/h # QML backend bridge
| |-- FillController.cpp/h # Credential auto-fill controller
| |-- Clipboard.cpp/h # Clipboard with TTL scrubbing
| |-- Utils.cpp/h # String, hex, path utilities
| |-- Console.cpp/h # Console/CLI helpers
| |-- QmlMain.cpp/h # QML application entry
| +-- Version.h # Version macros
|-- qml/ # Qt6 QML UI
| |-- Main.qml # Application window
| |-- AccountsTable.qml # Credential list view
| |-- AccountDialog.qml # Add/edit credential dialog
| |-- PasswordDialog.qml # Master password prompt
| +-- ... # Theme, headers, search, icons
| |-- QrCapture.cpp/h # Webcam QR capture with secure memory
|-- tests/ # Google tests
|-- assets/ # Fonts and icons
|-- scripts/ # Documentation post-processing
|-- CMakeLists.txt # Build configuration
|-- vcpkg.json # Dependency manifest
|-- build.bat # Build pipeline script
+-- mkdocs.yml # Documentation site config
API documentation is generated via a three-stage pipeline:
# 1. Generate markdown from C++ headers
doxide build
# 2. Post-process (strip noise, fix formatting, add icons)
python scripts/clean_docs.py
# 3. Build the documentation site
mkdocs buildThe site is output to site/ and can be served locally with mkdocs serve.
| Problem | Solution |
|---|---|
SeLockMemoryPrivilege |
Enable via gpedit.msc -> Local Policies -> User Rights Assignment |
| Remote Desktop blocked | Intended - seal refuses to run over RDP for security |
| vcpkg ninja crash | Known issue with bundled ninja 1.13.2, retry or use system ninja |
| Qt plugins not found | Ensure windeployqt ran during build, check qt.conf paths |
Contributions are welcome! Please read the Contributing Guidelines before submitting pull requests.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
Run tests andensure the build passes- Commit with descriptive messages
- Push to your fork and open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- OpenSSL - Cryptographic primitives
- Qt - GUI framework
- Google Test - Testing framework
- vcpkg - C++ package manager
- Doxide - API documentation generator
- MkDocs Material - Documentation theme
- Font Awesome Pro 7.2 - UI icons
- Claude - AI coding assistant by Anthropic
- Codex - AI coding assistant by OpenAI
