FrostVault
A zero-knowledge Windows password manager with deception built in.
The Problem
Mainstream password managers are cloud-first and ask you to trust a third party with your most sensitive secrets. FrostVault keeps everything local and encrypted — and fights back when someone tries to break in.
My Role
Built solo with AI-assisted development — cryptographic design, application logic, the PySide6 UI, and Windows packaging.
Highlights
- AES-256-GCM authenticated encryption for all vault data at rest
- Honey Vault serves believable decoy credentials under a wrong master key or duress
- Freeze Mode and Ice Crystal Fingerprints provide tamper detection
- Ships as a single standalone Windows executable — no installer, no cloud
Stack
Constraints
- Offline-first: vault data must never leave the user's machine.
- Single-binary distribution — no installer, no runtime to ship.
- Threat model includes coerced access, not just remote attackers.
System Architecture
Key Trade-offs
The decisions worth defending — what I chose, what I turned down, and why.
Storage architecture
Chose
Single encrypted local file
Rejected
Cloud-synced vault
Removes the third-party trust dependency entirely; matches the offline-first threat model at the cost of cross-device sync.
Wrong-password behaviour
Chose
Honey Vault returns plausible decoys
Rejected
Hard fail with a clear error
A loud failure tells an attacker they have the wrong key. A believable decoy buys time and frustrates duress scenarios.
Crypto stack
Chose
AES-256-GCM via the `cryptography` library
Rejected
Custom-built primitives
Authenticated encryption out of the box, audited implementation, zero novel crypto risk.
What I'd Do Differently
An honest retrospective — the stuff I'd change with more time, more users, or a second pass.
- 1Add an automated integrity self-test that runs on every launch and surfaces tampering visibly to the user.
- 2Move key derivation parameters to a versioned header so future Argon2 tuning doesn't break old vaults.
- 3Ship a portable Linux build — Windows-only narrows the audience more than I expected.
Technical Deep-Dive
Architecture, specifications, and implementation details.
FrostVault — Password Manager by IceLegends
#Full Project Plan
#Context
A Windows desktop password manager built as a CV/portfolio cybersecurity project. Stack: Python 3.12 + PySide6 + AES-256-GCM + Argon2 + SQLite. Visual direction: cartoonish mascot + pastel ice/frost aesthetic. Three unique features that no mainstream password manager ships.
#Unique Features (3 Total)
##1. Honey Vault (Decoy Trap)
After 3 wrong master password attempts, instead of an error, the attacker is shown a convincing FAKE vault with dummy credentials. The real vault silently locks and logs the intrusion attempt (timestamp, attempt count). Concept: honey pot / canary trap — real offensive security technique.
##2. Freeze Mode (Panic Lock)
Global hotkey Ctrl+Shift+F instantly disguises the app. Window title changes to "Calculator" and shows a fake calculator UI overlay. The real vault encrypts and hides in memory. Press the hotkey again (or a PIN) to restore FrostVault. Based on duress-mode / steganographic concealment used by journalists and activists.
##3. Ice Crystal Fingerprint
Every saved password deterministically generates a unique snowflake SVG pattern from its character sequence. Identical passwords = identical crystal (making reuse visually obvious). The crystal forms in real time as you type. No color bar — a living, frozen artwork unique to each password.
#Visual Design
Palette (pastel + frost)
| Role | Color | Hex |
|---|---|---|
| Background | Pale ice blue | #E8F4FD |
| Primary | Soft sky blue | #A8D8EA |
| Accent | Mint/ice green | #B5EAD7 |
| Highlight | Lavender ice | #C7CEEA |
| Dark accent | Deep frost blue | #4A90B8 |
| Text | Dark blue-gray | #2C3E50 |
| Danger | Pastel coral | #FFB7B2 |
| Ice white | Alice blue | #F0F8FF |
Mascot — "Flurry" A small cartoon snow-spirit/polar bear cub wearing a tiny ice crown. Reacts to vault state: idle (floating), happy (spin + sparkle), alert (shaking + red eyes), frozen (icy overlay, static). Lives in the bottom-right corner of the main dashboard.
#Project Structure
FrostVault/
├── main.py # App entry point
├── requirements.txt
├── assets/
│ ├── mascot/
│ │ ├── flurry_idle.png
│ │ ├── flurry_happy.png
│ │ ├── flurry_alert.png
│ │ └── flurry_frozen.png
│ ├── icons/
│ │ └── frostvault.ico
│ └── fonts/ # Rounded/cartoonish font (Nunito)
├── core/
│ ├── crypto.py # AES-256-GCM encryption + Argon2 hashing
│ ├── database.py # SQLite schema + CRUD
│ ├── vault.py # Real vault logic
│ └── honey_vault.py # Decoy vault + intrusion logging
├── features/
│ ├── freeze_mode.py # Panic lock + calculator disguise
│ ├── ice_crystal.py # Snowflake SVG generator from password
│ └── auto_lock.py # Idle timeout → lock
├── ui/
│ ├── theme.py # QSS stylesheet + palette constants
│ ├── login_screen.py # Master password entry screen
│ ├── vault_dashboard.py # Main credential list view
│ ├── entry_dialog.py # Add / Edit credential dialog
│ ├── generator_widget.py # Password generator panel
│ ├── mascot_widget.py # Flurry mascot + animations
│ └── crystal_widget.py # Ice crystal fingerprint widget
└── utils/
├── password_strength.py # Strength scoring (zxcvbn-style)
└── clipboard.py # Auto-clear clipboard after 30s
#Security Architecture
Master Password
│
▼
Argon2id (memory-hard hash)
│
▼
Derived 256-bit Key
│
▼
AES-256-GCM encrypts each credential
│
▼
SQLite (encrypted blobs, plaintext only in memory while unlocked)
- Master password is NEVER stored — only the Argon2 hash
- Each entry encrypted individually (breach of one ≠ breach of all)
- On lock/freeze: key wiped from memory
- Honey vault shares the same DB file but returns fake data
#Dependencies (requirements.txt)
PySide6>=6.7.0
cryptography>=42.0.0 # AES-256-GCM
argon2-cffi>=23.1.0 # Argon2id master password hashing
zxcvbn>=4.4.28 # Password strength estimation
Pillow>=10.0.0 # Mascot image handling
keyboard>=0.13.5 # Global hotkey for Freeze Mode
#Build Phases
##Phase 1 — Core Security Layer
-
core/crypto.py: Argon2id key derivation + AES-256-GCM encrypt/decrypt -
core/database.py: SQLite schema (vaults, entries, intrusion_log) -
core/vault.py: unlock, lock, add, get, delete, list entries -
core/honey_vault.py: fake entries generator + intrusion logger
##Phase 2 — UI Foundation
-
ui/theme.py: Full QSS stylesheet (frost palette, rounded corners, shadows) -
ui/login_screen.py: Master password screen with animated frost background -
ui/mascot_widget.py: Flurry widget with idle/happy/alert/frozen states -
main.py: App entry, window setup, screen routing
##Phase 3 — Vault Dashboard
-
ui/vault_dashboard.py: Credential list with search, category filter -
ui/entry_dialog.py: Add/Edit dialog with crystal fingerprint preview -
ui/generator_widget.py: Password generator with strength meter -
features/ice_crystal.py: Real-time snowflake renderer (QPainter)
##Phase 4 — Unique Features
-
features/freeze_mode.py: Global hotkey + calculator overlay -
features/ice_crystal.py: Deterministic snowflake from password hash -
features/auto_lock.py: Idle timer → lock + Flurry animation
##Phase 5 — Polish
- System tray icon (FrostVault logo)
- Auto-clear clipboard after 30s
- Intrusion log viewer (accessible after unlock)
- App packaging with PyInstaller → installer .exe via Inno Setup
#Screens Overview
- Login Screen — frost glass panel, Flurry idle animation, master password input
- Dashboard — credential cards in a grid/list, Flurry reacts to health, search bar
- Entry Dialog — add/edit form with live crystal fingerprint + strength bar
- Generator Panel — slider controls (length, symbols), crystal preview
- Freeze Mode Overlay — fake calculator covers the window
- Intrusion Log — timestamped failed attempts (hidden screen, only accessible after unlock)
#Verification Steps
- Run
python main.py— login screen appears with frost theme - Enter master password → vault dashboard with Flurry mascot
- Add a credential → ice crystal generates in real time
- Enter same password in two entries → identical crystals appear
- Lock and enter wrong password 3 times → honey vault loads with fake data
- Press Ctrl+Shift+F → app disguises as Calculator
- Press Ctrl+Shift+F again → FrostVault restores with PIN prompt
- Build .exe with PyInstaller — single executable runs on fresh Windows