HViYou PsM 🔑

Technische Spezifikation · AES‑GCM · [B:…] Block‑Format

📦 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.

Lokal & offlinefähig: Nach dem ersten Laden kann die Seite vollständig offline genutzt werden. Sie kann als .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 Dienstes
  • username (String) – Benutzername oder E‑Mail
  • password (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.
Sicherheitsmerkmal: Die Verwendung von AES‑GCM mit einem zufälligen Salt pro Block stellt sicher, dass selbst bei gleichem Masterpasswort und gleichem Klartext die resultierenden [B:…] Blöcke völlig unterschiedlich aussehen.

3.3. Kodierungskette (Verschlüsselung)

  1. JSON‑String (UTF‑8) → AES‑GCM mit abgeleitetem Schlüssel → verschlüsselte Bytes (inkl. Tag).
  2. Zusammensetzen: Salt (16) + IV (12) + verschlüsselte Bytes → ein einziger Binärstring.
  3. Base64‑Kodierung (mit btoa auf sauberen Byte‑Daten).
  4. 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.

📁 Permanente Nutzung: Laden Sie die .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.
💡 Tipp für Power‑User: Sie können die Sammlungsdatei in ein Git‑Repository legen oder mit einem Dateisynchronisationsdienst Ihrer Wahl verwalten – die Blöcke sind immer sicher verschlüsselt.

📌 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 .txt Datei (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.
🔐 Rechtlicher Hinweis: Dieses Tool wird wie besehen bereitgestellt. Der Autor übernimmt keine Gewähr für die absolute Sicherheit. Jede Nutzung erfolgt auf eigene Verantwortung.

💻 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.