📦 1. Architektur & Betriebsmodell
Die Anwendung besteht aus einer einzigen HTML‑Datei. Alle kryptografischen Operationen nutzen die Web Crypto API des Browsers – eine standardisierte, hardware‑beschleunigte und manipulationssichere Schnittstelle. Es existiert kein Backend, kein Speicher auf einem Server, keine Cookies oder Tracker.
.html Datei gespeichert und auf jedem modernen
Gerät geöffnet werden – ohne Installation, ohne Abo.
📋 2. Datenmodell & Block‑Format
Ein einzelner Eintrag (Passwortdatensatz) enthält folgende Felder:
url(String) – Webadresse des Dienstesusername(String) – Benutzername oder E‑Mailpassword(String) – Klartext‑Passwort (wird verschlüsselt gespeichert)info(String) – Notizen, Sicherheitsfragen, TOTP‑Seeds etc.version(Number) – Formatversion (aktuell 2 für AES‑GCM)
Die Daten werden als JSON‑String serialisiert. Beispiel:
{"url":"https://example.com","username":"alice","password":"geheim123","info":"Backup-Code","version":2}
Dieser String wird anschließend mit AES‑GCM verschlüsselt und in einen [B:…] Block verpackt:
[B:Q2lGcmFtZVdpdGhCYXNlNjRFbmNvZGVkRGF0YQ==]
Der Inhalt zwischen [B: und ] ist eine Base64‑kodierte Zeichenkette, die
Salt (16 Byte), IV (12 Byte) und den verschlüsselten JSON‑String (inkl. 16‑Byte Authentisierungstag)
enthält.
🔐 3. Verschlüsselungsverfahren (AES‑GCM + PBKDF2)
3.1. Schlüsselableitung – PBKDF2
Das vom Benutzer eingegebene Masterpasswort wird niemals direkt als Verschlüsselungsschlüssel verwendet. Stattdessen wird für jeden Block ein eigener, kryptografisch zufälliger Salt (16 Byte) generiert. Mit diesem Salt wird das Masterpasswort über PBKDF2 mit 200.000 Iterationen und SHA‑256 gestreckt:
dk = PBKDF2( Masterpasswort, Salt, Iterationen=200000, Hash=SHA‑256, Länge=256 Bit )
Ein leeres Masterpasswort wird durch einen nichtleeren Standard ersetzt
(LocalCrypt2025!), damit die Verschlüsselung immer deterministisch funktioniert – aber
ein selbst gewähltes, starkes Passwort wird dringend empfohlen.
3.2. Authentisierte Verschlüsselung – AES‑GCM
Für die Verschlüsselung des JSON‑Strings wird AES‑256‑GCM (Galois/Counter Mode) verwendet. Dieser Modus bietet:
- Vertraulichkeit – der Klartext kann nicht ohne Kenntnis des Schlüssels gelesen werden.
- Integrität & Authentizität – ein 128‑Bit Authentication Tag stellt sicher, dass das Chiffrat nicht manipuliert wurde.
- Zufälliger IV (12 Byte) – für jeden Block wird ein neuer, zufälliger Initialisierungsvektor verwendet.
3.3. Kodierungskette (Verschlüsselung)
- JSON‑String (UTF‑8) → AES‑GCM mit abgeleitetem Schlüssel → verschlüsselte Bytes (inkl. Tag).
- Zusammensetzen: Salt (16) + IV (12) + verschlüsselte Bytes → ein einziger Binärstring.
- Base64‑Kodierung (mit
btoaauf sauberen Byte‑Daten). - Umhüllung mit
[B:…]– fertiger Block.
Die Entschlüsselung kehrt die Schritte um: Block parsen → Base64 dekodieren → Salt/IV extrahieren → Schlüssel ableiten → AES‑GCM entschlüsseln (inkl. Tag‑Verifikation) → JSON parsen → Felder befüllen.
🛡️ 4. Sicherheitsmerkmale & Bewertung
| Merkmal | Umsetzung in PsM | Bewertung |
|---|---|---|
| Datenübertragung | Keine – nach dem Laden der Seite werden keine HTTP‑Requests durchgeführt | ✅ Ausgezeichnet (Zero‑Knowledge) |
| Speicherung von Blöcken | Die Sammlung bleibt nur im Textfeld der aktuellen Sitzung; Benutzer muss sie
explizit als .txt speichern |
⚠️ Hinweis: Beim Schließen des Tabs gehen ungesicherte Blöcke verloren → regelmäßig exportieren! |
| Verschlüsselungsstärke | AES‑256‑GCM, PBKDF2 mit 200.000 Iterationen, pro Block neuer Salt/IV | ✅✅ Sehr stark – entspricht aktuellen Best Practices |
| Integritätsschutz | Ja – der Authentication Tag verhindert unbemerkte Manipulation | ✅ Wenn der Block auch nur ein Bit verändert wird, schlägt die Entschlüsselung zuverlässig fehl. |
| Masterpasswort | Wird im Klartext im Arbeitsspeicher gehalten, aber niemals gespeichert oder übertragen | ⚠️ Grundsätzlich akzeptabel für clientseitige Tools; Risiko durch XSS ist minimal. |
| Offline‑Fähigkeit | Vollständig – speicherbare HTML‑Datei mit inline‑Code | ✅ Perfekt für Notfallzugriff ohne Internet |
🔒 5. Datenschutz & Transparenz
Es werden keine personenbezogenen Daten erhoben. Es gibt keine Analyse‑Tools, keine externen Fonts, keine CDNs. Die Seite nutzt ausschließlich native Browser‑Funktionen. Der Quellcode ist vollständig einsehbar und kann von jedem Sicherheitsforscher überprüft werden.
.html Datei herunter und legen
Sie sie auf einem verschlüsselten USB‑Stick ab. So haben Sie Ihren Passwortmanager immer griffbereit
– unabhängig von Cloud‑Diensten.
🌐 6. Kompatibilität & Zeichensatz
Unterstützt alle Unicode‑Zeichen (Emojis, Kyrillisch, Chinesisch, Sonderzeichen) durch konsequente
Nutzung von TextEncoder / TextDecoder mit UTF‑8. Die Base64‑Kodierung
erfolgt auf Byte‑Ebene, sodass keine Daten verfälscht werden.
Browser‑Voraussetzung: Moderne Browser mit Web Crypto API (Chrome 37+, Firefox 34+, Edge 79+, Safari 11+). Mobile Geräte (iOS/Android) sind voll unterstützt.
⚖️ 7. Vergleich mit anderen Passwortmanagern
PsM setzt auf maximale Benutzerkontrolle und Transparenz. Im Gegensatz zu Cloud‑basierten Lösungen (Bitwarden, 1Password, LastPass) gibt es:
- ❌ Keine zentrale Datenbank → keine Angriffsfläche auf Serverseite.
- ❌ Kein Abo, keine versteckten Kosten.
- ✅ Volle Kontrolle: Die [B:…] Blöcke können über beliebige Kanäle geteilt werden – die Verschlüsselung bleibt erhalten.
- ✅ Die Möglichkeit, die Sammlung als einfache Textdatei zu archivieren und mit jedem Texteditor zu sichern.
📌 8. Empfehlungen für den sicheren Gebrauch
- Verwenden Sie ein starkes, einmaliges Masterpasswort (min. 16 Zeichen, Groß‑/Kleinbuchstaben, Zahlen, Sonderzeichen).
- Speichern Sie die Sammlung regelmäßig als
.txtDatei (Button „💾 speichern“) und legen Sie diese Datei sicher ab. - Übertragen Sie [B:…] Blöcke nur über sichere Kanäle (Ende‑zu‑Ende‑verschlüsselte Messenger, persönliche verschlüsselte E‑Mails).
- Nutzen Sie die Funktionen „Daten löschen“ und „Reset“, bevor Sie die Seite auf einem öffentlichen oder fremden Rechner schließen.
- Testen Sie die Entschlüsselung mit einem selbst erstellten Block, bevor Sie wichtige Passwörter ausschließlich in dieser Form speichern.
💻 9. Implementierungsdetails (Auszug)
Die Kernfunktionen nutzen die Web Crypto API und sind in etwa 80 Zeilen JavaScript realisiert:
async function deriveKey(password, salt) {
const enc = new TextEncoder();
const keyMaterial = await crypto.subtle.importKey(
"raw", enc.encode(password), "PBKDF2", false, ["deriveKey"]
);
return crypto.subtle.deriveKey(
{ name: "PBKDF2", salt, iterations: 200000, hash: "SHA-256" },
keyMaterial, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]
);
}
async function encryptAESGCM(plainText, password) {
const salt = crypto.getRandomValues(new Uint8Array(16));
const iv = crypto.getRandomValues(new Uint8Array(12));
const key = await deriveKey(password, salt);
const encrypted = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv, tagLength: 128 },
key, new TextEncoder().encode(plainText)
);
const combined = new Uint8Array(salt.length + iv.length + encrypted.byteLength);
combined.set(salt); combined.set(iv, salt.length);
combined.set(new Uint8Array(encrypted), salt.length + iv.length);
return bytesToBase64(combined);
}
Die vollständige Anwendung ist quelloffen, kann direkt aus dem HTML ausgelesen werden und unterliegt keiner obskuren Minimierung.
⚠️ 10. Fehlerbehandlung & Benutzerhinweise
Bei falschem Masterpasswort oder beschädigtem/ manipuliertem Block zeigt die Anwendung eine klare Fehlermeldung an – ohne Absturz. Die Authentizitätsprüfung (Authentication Tag) stellt sicher, dass bereits ein einziges verändertes Byte als Fehler erkannt wird. Die Sammlung bleibt editierbar, sodass defekte Einträge manuell entfernt werden können.
Die Statusmeldungen (z.B. „Entschlüsselung erfolgreich“) erscheinen für einige Sekunden und verschwinden dann automatisch. Im Dark Mode sind die Meldungen farblich angepasst.