Skip to content

Commit 879582d

Browse files
Smart Password Manager C#: release v4.0.0
BREAKING CHANGE: Update to smartpasslib-csharp v4.0.0 Core changes: - Dynamic iterations: 15-30 (private), 45-60 (public) - Google-compatible charset (26 special chars + A-Z + a-z + 0-9) - Password length: 12-100 (was 12-1000) - Secret validation: min 12 chars (enforced) - Salt separation: "private"/"public" for key isolation Forms updated: - AddPasswordForm: length range 12-100, secret min 12 - EditPasswordForm: length range 12-100 - GetPasswordForm: secret validation min 12 - AboutForm: version 4.0.0 - QRCodeForm: uses new SmartPassword format - Export: lib_version uses SmartPasswordGenerator.Version Documentation: - README updated to v4.0.0 - Add MIGRATION.md Version note: v1.x.x -> v4.0.0 (align with smartpasslib-csharp v4.0.0)
1 parent 2a91536 commit 879582d

6 files changed

Lines changed: 252 additions & 45 deletions

File tree

MIGRATION.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# Migration Guide: v1.x.x to v4.0.0
2+
3+
> **📌 Version Note:** SmartPasswordManagerCsharpDesktop jumps from v1.x.x directly to v4.0.0 to align with smartpasslib-csharp v4.0.0. All smartpasslib implementations (Python, C#, JS, Go, Kotlin) now share the same version number and algorithm.
4+
5+
## ⚠️ Breaking Change Notice
6+
7+
**SmartPasswordManagerCsharpDesktop v4.0.0 is NOT backward compatible with v1.x.x**
8+
9+
| Version | Status | Why |
10+
|------------|-------------|------------------------------------------------------------------|
11+
| v1.x.x | Deprecated | Fixed iterations (30/60), limited character set |
12+
| **v4.0.0** | **Current** | Dynamic iterations (15-30/45-60), expanded charset, max security |
13+
14+
Smart passwords generated with v1.x.x cannot be regenerated using v4.0.0 due to fundamental changes in the deterministic generation algorithm.
15+
16+
---
17+
18+
## Why the change?
19+
20+
**v4.0.0 introduces fundamental improvements:**
21+
22+
- **Dynamic iteration counts** — deterministic steps vary per secret (15-30 for private, 45-60 for public)
23+
- **Expanded character set** — Google-compatible symbols
24+
- **Enhanced key derivation** — salt separation for public/private keys ("private"/"public")
25+
- **Unified length validation** — password length must be 12-100 characters (was 12-1000)
26+
- **Input validation** — secret phrases must be at least 12 characters (enforced)
27+
- **Maximum security** — no secret exposure in logs or iterations
28+
29+
---
30+
31+
## What changed in the Desktop Manager:
32+
33+
| Aspect | v1.x.x | v4.0.0 |
34+
|------------------------|--------------------|---------------------------------------|
35+
| Private key iterations | Fixed 30 | Dynamic 15-30 |
36+
| Public key iterations | Fixed 60 | Dynamic 45-60 |
37+
| Character set | `abc...!@#$&*-_` | `!@#$%^&*()_+-=[]{};:,.<>?/A-Za-z0-9` |
38+
| Password max length | 1000 | 100 |
39+
| Secret validation | None (min 4 chars) | Min 12 characters (enforced) |
40+
| Key derivation salt | None | "private"/"public" |
41+
| Secret in iterations | Yes (exposed) | No (secure) |
42+
43+
---
44+
45+
## Metadata File Compatibility
46+
47+
**The old `passwords.json` file is NOT compatible with v4.0.0**
48+
49+
Public keys stored in v1.x.x files cannot be used with v4.0.0 because:
50+
- Iteration counts changed from fixed 60 to dynamic 45-60
51+
- Salt "public" was added to key derivation
52+
53+
**Result:** Old entries will load but secret verification will fail. Passwords cannot be regenerated.
54+
55+
---
56+
57+
## Migration Steps
58+
59+
### Step 1: Retrieve existing passwords using old version
60+
61+
Before upgrading, retrieve all actual passwords from v1.x.x:
62+
- Open the old version of the application
63+
- For each entry, click **Get** and copy the password
64+
- Save all retrieved passwords in a safe place
65+
66+
### Step 2: Backup old metadata file
67+
68+
The old metadata file is located at `%USERPROFILE%\.config\smart_password_manager\passwords.json`
69+
70+
Copy this file to a safe location (e.g., `passwords.json.v1.bak`).
71+
72+
### Step 3: Upgrade to v4.0.0
73+
74+
Download the new binary or build from source. Replace the old executable.
75+
76+
### Step 4: Remove old metadata file
77+
78+
The old metadata file must be removed or moved away from the default location. v4.0.0 will create a new empty file on first run.
79+
80+
### Step 5: Re-add entries
81+
82+
Launch the application and add all entries again using the **same secret phrases and lengths** as before.
83+
84+
### Step 6: Update services
85+
86+
Replace old passwords (from Step 1) with newly generated ones on each website/service.
87+
88+
### Step 7: Verify
89+
90+
Log in using new passwords. Confirm regeneration works (same secret → same password).
91+
92+
---
93+
94+
## Important Notes
95+
96+
- **No automatic migration** — manual password regeneration required
97+
- **No database migration** — old metadata file is incompatible
98+
- **Your secret phrases remain the same** — use them to recreate entries
99+
- **Secret phrases shorter than 12 characters will now be rejected**
100+
- **Password lengths between 101 and 1000 will now be rejected**
101+
- **Old passwords still work** on services until you change them
102+
- Test with non-essential accounts first
103+
104+
---
105+
106+
## Rollback
107+
108+
If you need to rollback to v1.x.x, use the old binary and restore your backup metadata file.
109+
110+
---
111+
112+
## Need Help?
113+
114+
- **Issues**: [GitHub Issues](https://github.com/smartlegionlab/SmartPasswordManagerCsharpDesktop/issues)
115+
- **Core Library Issues**: [smartpasslib Issues](https://github.com/smartlegionlab/smartpasslib/issues)
116+
117+
---
118+

README.md

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Smart Password Manager Desktop (C#) <sup>v1.1.5</sup>
1+
# Smart Password Manager Desktop (C#) <sup>v4.0.0</sup>
22

33
---
44

@@ -29,6 +29,22 @@ Smart Password Manager stores nothing. Your secrets never leave your device. Pas
2929

3030
---
3131

32+
## 🔄 Breaking Change (v4.0.0)
33+
34+
> **⚠️ This version uses [smartpasslib-csharp](https://github.com/smartlegionlab/smartpasslib-csharp) v4.0.0, which is NOT backward compatible with v1.x.x**
35+
36+
Smart passwords created with older versions **cannot be regenerated** with v4.0.0.
37+
38+
**What changed:**
39+
- Dynamic iterations: private key 15-30 steps (was fixed 30), public key 45-60 steps (was fixed 60)
40+
- Expanded Google-compatible character set
41+
- Secret phrases now require minimum 12 characters (was 4)
42+
- Password length now limited to 100 characters (was 1000)
43+
44+
📖 **Full migration instructions** → see [MIGRATION.md](https://github.com/smartlegionlab/SmartPasswordManagerCsharpDesktop/blob/master/MIGRATION.md)
45+
46+
---
47+
3248
## Core Principles
3349

3450
- **Zero-Storage Security**: No passwords or secret phrases are ever stored or transmitted
@@ -42,7 +58,7 @@ Smart Password Manager stores nothing. Your secrets never leave your device. Pas
4258

4359
- **Decentralized & Serverless**: No central database, no cloud lock-in, complete user sovereignty
4460
- **Smart Password Generation**: Deterministic from secret phrase
45-
- **Public/Private Key System**: 30 iterations for private key, 60 for public key
61+
- **Dynamic Key Derivation**: 15-30 iterations for private key, 45-60 for public key (deterministic per secret)
4662
- **Secret Verification**: Verify secret without exposing it
4763
- **Dark Theme Interface**: Easy on the eyes during extended use
4864
- **Full CRUD Operations**: Create, Read, Update, Delete
@@ -75,14 +91,21 @@ Smart Password Manager stores nothing. Your secrets never leave your device. Pas
7591

7692
Powered by **[smartpasslib-csharp](https://github.com/smartlegionlab/smartpasslib-csharp)** — C# implementation of deterministic password generation.
7793

78-
**Key derivation (same as Python/JS/Kotlin/Go/C# versions):**
94+
**Key derivation (same as Python/JS/Kotlin/Go versions v4.0.0):**
7995

80-
| Key Type | Iterations | Purpose |
81-
|-------------|------------|-------------------------------------------------------|
82-
| Private Key | 30 | Password generation (never stored, never transmitted) |
83-
| Public Key | 60 | Verification (stored locally) |
96+
| Key Type | Iterations | Purpose |
97+
|-------------|-------------------------|-------------------------------------------------------|
98+
| Private Key | 15-30 (dynamic) | Password generation (never stored, never transmitted) |
99+
| Public Key | 45-60 (dynamic) | Verification (stored locally) |
84100

85-
**Character Set:** `abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$&*-_`
101+
**Character Set (Google-compatible):**
102+
```
103+
!@#$%^&*()_+-=[]{};:,.<>?/ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz
104+
```
105+
106+
**Validation Rules:**
107+
- Secret phrase: minimum 12 characters
108+
- Password length: 12-100 characters
86109

87110
**Decentralized Architecture**:
88111
- No central authority required
@@ -169,10 +192,13 @@ The application allows you to export password metadata to the **Smart Password M
169192
### Secret Phrase
170193
- **Minimum 12 characters** (enforced)
171194
- Case-sensitive
172-
- Use mix of: uppercase, lowercase, numbers, symbols, emoji, or Cyrillic
195+
- Use mix of: uppercase, lowercase, numbers, symbols
173196
- Never store digitally
174197
- **NEVER use your password description as secret phrase**
175198

199+
### Password Length Requirements
200+
- **Smart passwords**: 12-100 characters
201+
176202
### Strong Secret Examples
177203
```
178204
✅ "MyStrongSecretPhrase2026!" — mixed case + numbers + symbols
@@ -182,11 +208,12 @@ The application allows you to export password metadata to the **Smart Password M
182208

183209
### Weak Secret Examples (avoid)
184210
```
211+
❌ "short" — too short, rejected
185212
❌ "GitHub Account" — using description as secret (weak!)
186213
❌ "password" — dictionary word, too short
187214
❌ "1234567890" — only digits, too short
188215
❌ "qwerty123" — keyboard pattern
189-
❌ Same as description — never use the same value as password description
216+
❌ Same as description — never use the same value as description
190217
```
191218

192219
### Decentralized Nature
@@ -251,6 +278,13 @@ Smart Password Manager Desktop (C#) produces **identical passwords** to:
251278
- **[Web Smart Password Manager](https://github.com/smartlegionlab/smart-password-manager-web)**
252279
- **[Android Smart Password Manager](https://github.com/smartlegionlab/smart-password-manager-android)**
253280

281+
## Version History
282+
283+
| Version | smartpasslib-csharp | Status | Migration Required |
284+
|------------------|---------------------|--------------------------|------------------------|
285+
| v1.x.x and below | v1.x.x | ❌ Deprecated/Unsupported | Must migrate to v4.x.x |
286+
| **v4.0.0+** | **v4.0.0+** | ✅ Current | N/A |
287+
254288
## License
255289

256290
**[BSD 3-Clause License](https://github.com/smartlegionlab/SmartPasswordManagerCsharpDesktop/blob/master/LICENSE)**
@@ -268,3 +302,5 @@ Copyright (©) 2026, [Alexander Suvorov](https://github.com/smartlegionlab)
268302
- **Issues**: [GitHub Issues](https://github.com/smartlegionlab/SmartPasswordManagerCsharpDesktop/issues)
269303
- **Documentation**: This [README](https://github.com/smartlegionlab/SmartPasswordManagerCsharpDesktop/blob/master/README.md)
270304

305+
---
306+

SmartPasswordManagerCsharpDesktop/Forms/AboutForm.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ private void InitializeComponent()
5959

6060
contentPanel.Controls.Add(new Label
6161
{
62-
Text = $"Version v1.1.5 | .NET 10.0 | Windows",
62+
Text = $"Version v4.0.0 | .NET 10.0 | Windows",
6363
Font = new Font("Segoe UI", 10),
6464
ForeColor = Color.FromArgb(160, 160, 170),
6565
TextAlign = ContentAlignment.MiddleCenter,

SmartPasswordManagerCsharpDesktop/Forms/MainForm.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -616,10 +616,10 @@ private void ExportPasswords()
616616
{
617617
["exported_at"] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss"),
618618
["app_name"] = "Smart Password Manager C# Desktop",
619-
["app_version"] = "v1.1.5",
619+
["app_version"] = "v4.0.0",
620620
["app_type"] = "Desktop",
621621
["lib_name"] = "smartpasslib-csharp",
622-
["lib_version"] = "v1.0.5",
622+
["lib_version"] = "v4.0.0",
623623
["lib_lang"] = "C#",
624624
["count"] = _manager.PasswordCount
625625
};
@@ -858,7 +858,7 @@ private string GetHelpText()
858858
" • Use emoji or non-Latin characters for stronger secrets\n\n" +
859859

860860
"══════════════════════════════════════════════════════════════════════════════\n" +
861-
" Version v1.1.5 | Copyright © 2026 Alexander Suvorov\n" +
861+
" Version v4.0.0 | Copyright © 2026 Alexander Suvorov\n" +
862862
" Licensed under BSD 3-Clause License | https://github.com/smartlegionlab\n" +
863863
"══════════════════════════════════════════════════════════════════════════════";
864864
}

0 commit comments

Comments
 (0)