Ultra-Secure Offline Flutter Password Manager with Steganography
PasswordMan is a 100% offline, zero-backend password manager that hides your passwords inside regular PNG images using steganography. One image holds exactly one password entry.
| Feature | Details |
|---|---|
| Backend | None β completely offline |
| Database | SQLite (local only) |
| Encryption | AES-256-GCM + Argon2id KDF |
| Auth Methods | Fingerprint, PIN, Master Password |
| Special Feature | Hide passwords in PNG images |
- Key Derivation: Argon2id (3 iterations, 64MB memory, parallelism 4)
- Encryption: AES-256-GCM with unique IV per entry
- Key Storage: Android Keystore / iOS Secure Enclave
- Memory: Keys never touch disk, zeroed after use
| Layer | Implementation |
|---|---|
| Screenshot Block | FLAG_SECURE (Android), UIScreen.isCaptured (iOS) |
| Root/Jailbreak Detection | flutter_jailbreak_detection |
| Brute-Force Protection | 5 fails β 30s lockout, 10 β optional wipe |
| Clipboard Protection | Auto-clear after 30 seconds |
| Screen Recording | Blocked on both platforms |
Core Rule: One Image = One Password Entry
Export a vault entry to any PNG image. The password is encrypted with AES-256-GCM and hidden in the least significant bits (LSB) of pixel colors.
Why PNG only? JPEG is lossy β compression destroys the hidden data. PNG preserves every bit exactly.
Export Flow:
- Open any vault entry β Tap "Embed in Image πΌ"
- Pick a PNG photo from gallery
- Entry is encrypted and hidden inside the image
- Saved to Downloads as
pman_<title>_<timestamp>.png
Import Flow:
- Vault screen β Tap "Load from Image" button
- Pick a PasswordMan PNG image
- See preview: "Contains: Gmail"
- Enter credential β Entry imported
passwordman/
βββ lib/
β βββ main.dart
β βββ app.dart # MaterialApp, theme, routing
β βββ core/
β β βββ constants/ # App constants, DB constants
β β βββ utils/ # Secure logger, clipboard utils
β βββ security/
β β βββ crypto/ # AES-256-GCM, Argon2id KDF
β β βββ auth/ # Biometric, PIN, password auth
β β βββ integrity/ # Screenshot block, root detection
β βββ steganography/
β β βββ lsb_embedder.dart # LSB steganography encoder
β β βββ lsb_extractor.dart # LSB steganography decoder
β βββ data/
β β βββ database/ # SQLite management
β β βββ models/ # VaultEntry, StegoManifest
β β βββ repositories/ # Data access layer
β βββ features/
β βββ onboarding/ # First-run setup
β βββ auth/ # Lock/unlock screens
β βββ vault/ # Main vault UI
β βββ settings/ # App settings
βββ android/ # Android platform code
βββ ios/ # iOS platform code
βββ test/ # Unit tests
- Flutter SDK
>=3.0.0 - Dart SDK
>=3.0.0 - Android Studio (for Android builds)
- Xcode (for iOS builds, macOS only)
- CMake (for native Argon2 library compilation)
# Windows
git clone https://github.com/flutter/flutter.git -b stable
set PATH=%PATH%;C:\path\to\flutter\bin
# macOS/Linux
git clone https://github.com/flutter/flutter.git -b stable
export PATH="$PATH:`pwd`/flutter/bin"flutter doctorgit clone <repository-url>
cd passwordmanflutter pub getThe Argon2 native library requires CMake build configuration. The setup is already configured in:
android/app/src/main/cpp/CMakeLists.txtandroid/app/build.gradle.kts
No additional configuration required.
# Static analysis
flutter analyze
# Format code
flutter format lib/
# Check for issues
flutter pub outdated# Android debug APK
flutter build apk --debug
# iOS debug (macOS only)
flutter build ios --debug
# Run on connected device
flutter run# Android App Bundle (for Play Store)
flutter build appbundle --release
# Android APK (all ABIs)
flutter build apk --release
# iOS (macOS only)
flutter build ios --release# Release build with tree shaking (removes unused code)
flutter build apk --release --tree-shake-icons
# Obfuscate for security (makes reverse engineering harder)
flutter build apk --release --obfuscate --split-debug-info=symbols/# ARM 32-bit (older devices)
flutter build apk --release --target-platform android-arm
# ARM 64-bit (modern devices)
flutter build apk --release --target-platform android-arm64
# x86_64 (emulators, some tablets)
flutter build apk --release --target-platform android-x64
# Split APK per ABI (smaller downloads)
flutter build apk --release --split-per-abiAfter flutter build apk --split-per-abi:
build/app/outputs/flutter-apk/
βββ app-arm64-v8a-release.apk # Modern Android devices
βββ app-armeabi-v7a-release.apk # Older Android devices
βββ app-x86_64-release.apk # Emulators/x86 devices
# Install to connected device
flutter install --release
# Or manually install APK
adb install build/app/outputs/flutter-apk/app-arm64-v8a-release.apk# Run all tests
flutter test
# Run with coverage
flutter test --coverage
# Run specific test file
flutter test test/crypto_engine_test.dart# Enable developer options and USB debugging on device
# Connect via USB, then:
flutter devices # Verify device is listed
flutter run --release # Install and run
# Or install APK directly
adb install build/app/outputs/flutter-apk/app-release.apk# Requires Apple Developer account or free provisioning profile
flutter run --release
# Or build for distribution
flutter build ios --release
# Then archive in Xcode and distribute| Package | Purpose |
|---|---|
sqflite |
SQLite database |
pointycastle |
AES-256-GCM encryption |
dargon2_flutter |
Argon2id key derivation |
flutter_secure_storage |
Secure key storage |
local_auth |
Biometric authentication |
image |
PNG processing for steganography |
file_picker |
Image selection |
flutter_bloc |
State management |
uuid |
UUID generation |
| Package | Purpose |
|---|---|
flutter_launcher_icons |
App icon generation |
flutter_test |
Testing framework |
build_runner |
Code generation |
- No Network Calls: The app has zero network permissions. It cannot and will not transmit data.
- Memory Security: Encryption keys exist only in memory, never written to disk.
- Zero-Knowledge: The app developer cannot access your passwords even with physical device access.
- Self-Destruct: Emergency wipe option clears all data and resets the app.
If you see libargon2-arm.so dlopen failed:
flutter clean
flutter pub get
cd android
./gradlew clean
./gradlew assembleDebug# Clean everything
flutter clean
flutter pub get
cd android && ./gradlew clean && cd ..
# Rebuild
flutter build apk --debugcd ios
pod install --repo-update
cd ..
flutter runThis project is proprietary software. All rights reserved.
This is a personal security project.Only Critical fixes are accepted .
For issues or questions, please file an issue on the repository.
Built with β€οΈ and π