Two-factor verification
++ Enter the 6-digit code from your authenticator app, or one of your + recovery codes. +
+ ++ +
+diff --git a/README.md b/README.md index 7f1097b..d900566 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Vault data is encrypted on the client with a key derived from your master password, and the server only ever stores ciphertext + KDF parameters. A database breach leaks nothing usable. - + The vault treats credentials as connection targets, not just `name + password` rows: every entry carries protocol, hostname, IP, port, and @@ -18,6 +18,14 @@ auto-clear; the server still sees only ciphertext.  +Login is optionally protected by **TOTP 2FA** (Google Authenticator, +1Password, Authy, …) with single-use recovery codes. Vault contents +remain zero-knowledge regardless — even if the OTP secret leaks, the +master key the server never sees is still the only thing that decrypts +the vault. + + + ## Architecture at a glance ``` diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index 39d6e43..06abd1b 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -222,7 +222,7 @@ The dialog greys out actions that don't apply to a credential: Click **+ New credential** in the top-right: - + The form is **protocol-aware**: @@ -357,14 +357,20 @@ schema bump. ### 5g. Two-factor authentication (TOTP) -Open the **Settings** link in the sidebar's user card → click **Set up 2FA**. +Open the **Settings** link in the sidebar's user card. With 2FA off, +the Security section shows a single "Set up 2FA" call to action: -The setup flow has three steps: + + +Click **Set up 2FA** to start the three-step setup flow: 1. **Scan the QR** with your authenticator (Google Authenticator, 1Password, Authy, Microsoft Authenticator, …). If your phone can't reach the screen, expand "Can't scan? Type this manually" and copy the base32 secret directly into the app. + +  + 2. **Confirm the first code.** Type the 6-digit code your authenticator shows. Passman verifies against the stored secret and only then flips the `totp_enabled` flag — if you abandon the flow before this @@ -374,9 +380,19 @@ The setup flow has three steps: them, download the `.txt`, or write them down — Passman keeps only Argon2id hashes server-side, so this list cannot be retrieved later. -Once enabled, login becomes two-step: email + master password, then a -6-digit code. Recovery codes work in place of the 6-digit code (and -are consumed on first use — `9 remaining` becomes `8`). +  + +Once enabled, the Settings page shows the active state + how many +recovery codes are left: + + + +Login becomes two-step: email + master password (the existing screen), +then a 6-digit code on a second screen. Recovery codes work in place +of the 6-digit code (and are consumed on first use — `9 remaining` +becomes `8`): + + > **Trade-off, plainly stated.** TOTP is **not** zero-knowledge — > RFC 6238 requires the verifier to know the shared secret, so the diff --git a/docs/img/login-otp.png b/docs/img/login-otp.png new file mode 100644 index 0000000..f38159f Binary files /dev/null and b/docs/img/login-otp.png differ diff --git a/docs/img/settings-2fa-off.png b/docs/img/settings-2fa-off.png new file mode 100644 index 0000000..677fb28 Binary files /dev/null and b/docs/img/settings-2fa-off.png differ diff --git a/docs/img/settings-2fa-on.png b/docs/img/settings-2fa-on.png new file mode 100644 index 0000000..c607112 Binary files /dev/null and b/docs/img/settings-2fa-on.png differ diff --git a/docs/img/settings-2fa-setup-qr.png b/docs/img/settings-2fa-setup-qr.png new file mode 100644 index 0000000..a25e615 Binary files /dev/null and b/docs/img/settings-2fa-setup-qr.png differ diff --git a/docs/img/settings-2fa-setup-recovery.png b/docs/img/settings-2fa-setup-recovery.png new file mode 100644 index 0000000..da867c9 Binary files /dev/null and b/docs/img/settings-2fa-setup-recovery.png differ diff --git a/docs/img/vault-add.png b/docs/img/vault-add.png index 7b3e5fb..80dbdb1 100644 Binary files a/docs/img/vault-add.png and b/docs/img/vault-add.png differ diff --git a/docs/img/vault-connect.png b/docs/img/vault-connect.png index a4a2322..edda1eb 100644 Binary files a/docs/img/vault-connect.png and b/docs/img/vault-connect.png differ diff --git a/docs/img/vault.png b/docs/img/vault.png index 9f3440f..1d96160 100644 Binary files a/docs/img/vault.png and b/docs/img/vault.png differ diff --git a/docs/preview/index.html b/docs/preview/index.html index 9fda7b1..2e3d999 100644 --- a/docs/preview/index.html +++ b/docs/preview/index.html @@ -16,9 +16,14 @@
+ Enter the 6-digit code from your authenticator app, or one of your + recovery codes. +
+ ++ +
+Zero-knowledge password manager
+ ++ Adds a 6-digit code from your authenticator app (Google Authenticator, + 1Password, Authy, …) to login. Note: enabling 2FA + stores the OTP secret server-side. Vault contents stay encrypted + with your master key — the server still can't read them. +
++ ← Back to vault +
+Zero-knowledge password manager
+ ++ Adds a 6-digit code from your authenticator app (Google Authenticator, + 1Password, Authy, …) to login. Note: enabling 2FA + stores the OTP secret server-side. Vault contents stay encrypted + with your master key — the server still can't read them. +
++ ← Back to vault +
+Zero-knowledge password manager
+ ++ Adds a 6-digit code from your authenticator app to login. +
++ Open Google Authenticator / 1Password / Authy / etc. and scan + this code. Then click Next. +
+JBSW Y3DP EHPK 3PXP GS6F W2T2 EHPK
+
+ Zero-knowledge password manager
+ ++ Adds a 6-digit code from your authenticator app to login. +
++ ⚠️ Save these codes now. Each one logs you in + once if you lose access to your authenticator app. They are + shown only this time — Passman keeps only a + hash on the server, so this list cannot be recovered later. +
+a4n2-mz8q
+ k7vb-6xwd
+ tr5g-9hjf
+ e3p1-cdm7
+ y8s4-uwq2
+ b6kn-rt3v
+ x9z2-fl5p
+ m1qa-7gjy
+ w4rh-d8ke
+ o2vc-px6n
+ 6 entriesDecrypted in your browser
- +