# SCREENUS SafePass

Windows-Tresor für TOTP-Codes aus Google Authenticator und Passwörter aus einem
Google-Password-Manager-CSV-Export.

Die Webcam wird direkt über Windows Media Capture angesprochen. QR-Codes decodiert ZXing mit mehreren
softwarebasierten Kontrast- und Schwellenwertvarianten. OpenCV und FFmpeg werden nicht mehr ausgeliefert.

## Tresore und Speicherung

- Die Daten liegen nie in der EXE, sondern in getrennten, verschlüsselten `*.vault`-Dateien.
- Der portable Haupttresor liegt als `SCREENUS.SafePass.vault` neben der EXE.
- Weitere lokale oder direkt per Dropbox-API angebundene Tresore können über das Dropdown links
  ausgewählt werden. Jeder Wechsel verlangt erneut das Kennwort oder Windows Hello.
- Für Dropbox ist weder der Dropbox-Desktopclient noch ein lokaler Dropbox-Ordner erforderlich.
- Der verschlüsselte Dropbox-Cache liegt unter
  `%LOCALAPPDATA%\SCREENUS SafePass\cloud-cache`. Er enthält nur die verschlüsselte Tresordatei.
- `%LOCALAPPDATA%\SCREENUS SafePass\vaults.json` enthält nur nicht geheime Namen, Pfade und
  Dropbox-Revisionsangaben, niemals Authcodes, Passwörter oder Schlüssel.
- Diese Liste gilt für das Windows-Benutzerkonto, nicht nur einen EXE-Ordner. Deshalb kann eine neu
  entpackte EXE einen zuvor geöffneten Tresor aus einem anderen Ordner anbieten. Beim Weitergeben
  des Programmpakets werden weder die Liste noch Tresordaten mitgeliefert.
- Version 1.6 entfernt nicht existierende, automatisch angelegte Haupttresor-Verweise nur bei
  erreichbarem Elternordner. Echte gleichnamige Tresore bleiben erhalten und zeigen ihren Pfad.

## Ausgabe 1.8.0: portable Version und Setup

Die Start-EXE liegt oben; alle zehn Anwendungsbibliotheken und JSON-Laufzeitdateien liegen in
`resources`. Die Start-EXE ist ein regulärer .NET-Apphost mit relativem Verweis auf
`resources/SCREENUS.SafePass.dll`, kein Skript und kein zusätzlicher Hintergrundprozess.
Der Haupttresor bleibt neben der Start-EXE. Der gesamte Programmordner wird zusammen weitergegeben,
der persönliche Tresor nur bei ausdrücklichem Bedarf. Die Microsoft .NET 8 Desktop Runtime (x64)
muss installiert sein. Das Windows-Setup lädt eine fehlende Laufzeit nach Prüfung direkt
von Microsoft nach. Lizenztexte der mitgelieferten Bibliotheken stehen in `resources/licenses`.

## Automatische Updates und zusätzliche Start-Sperre

- Beim Programmstart prüft SafePass im Hintergrund auf eine neue Version. Ohne Internet
  bleibt der Tresor nutzbar. Ein Update wird vorgeschlagen, niemals ungefragt installiert.
- „Version … · Updates“ unten links startet dieselbe Prüfung manuell.
- Update-Metadaten werden per HTTPS geladen und mit einem eingebauten ECDSA-Prüfschlüssel
  verifiziert. Größe und SHA-256 der Setup-Datei werden vor dem Ausführen geprüft.
- Nach Bestätigung aktualisiert das Setup genau den bisherigen Programmordner.
  Installierte Ausgaben bleiben installiert, portable Ausgaben bleiben portabel und
  erhalten weder einen Deinstallationseintrag noch neue Verknüpfungen.
- Tresore, Backups und persönliche Einstellungen werden nicht ersetzt. SafePass wird
  anschließend neu gestartet und verlangt wieder die jeweilige Entsperrung.
- Die Update-Prüfung übermittelt dem Download-Server die übliche IP-Adresse und
  SafePass-Version, keine Tresornamen, Kennwörter, Authcodes oder Schlüssel.
- Unter Optionen lässt sich zusätzlich „SafePass beim Programmstart mit Windows Hello
  entsperren“ aktivieren – unabhängig vom Schutz der einzelnen Tresore, auch bei Dropbox.
  Ein- und Ausschalten verlangt eine Windows-Hello-Bestätigung. Ohne eingerichtetes oder
  verfügbares Hello kann diese Option nicht aktiviert werden.
- Ist die Start-Sperre aktiv, werden vor erfolgreichem Hello weder Tresorliste noch Inhalte
  geladen oder angezeigt. Danach bleibt ein Tresorkennwort weiterhin erforderlich.
- Die Programmeinstellung liegt DPAPI-geschützt in
  `%LOCALAPPDATA%\SCREENUS SafePass\program-settings.bin` und gilt für dieses Windows-Konto
  auf diesem PC. Sie ist eine zusätzliche Anzeige-Sperre, kein Ersatz für die
  Tresorverschlüsselung und kein Schutz gegen Administratoren oder Schadsoftware.
- Version 1.7.1 und älter haben noch keinen Update-Check. Das einmalige Upgrade auf 1.8.0
  erfolgt daher manuell über das Setup oder durch Entpacken der Programmdateien.

`work/PackageApp` erstellt die Ausgabe aus einer festen Komponentenliste und nimmt keine
Tresore, Backups oder Benutzerdaten in das Paket auf.

### Layoutkorrekturen in 1.7.1

- Namensdialoge (auch beim Dropbox-Upload) passen ihre Höhe an den Inhalt an. Die Schaltflächen
  erhalten ihre benötigte Höhe statt einer zu kleinen Restzeile.
- Optionen: vergrößerbares Fenster mit bei Bedarf scrollbarem Inhalt und dauerhaft getrennter
  Schaltflächenleiste. Beide Kennwortfelder und der Schutzhinweis sind vollständig erreichbar.
- Fehlermeldungen stehen oberhalb der Schaltflächen in einer eigenen Zeile, lange Beschriftungen
  werden umgebrochen. Dialoggrößen werden an die Arbeitsfläche des jeweiligen Monitors angepasst.
- Keine Änderung des Tresorformats, der Verschlüsselung oder der Dropbox-Übertragung.

## Direkte Dropbox-Verbindung

SafePass verwendet den offiziellen Dropbox-App-Ordner und OAuth 2.0 mit PKCE. Einmalig wird in der
Dropbox-App-Konsole eine App mit `Scoped access` und `App folder` angelegt. Benötigte Berechtigungen:

- `files.metadata.read`
- `files.content.read`
- `files.content.write`
- `account_info.read`

In SafePass wird nur der öffentliche App key eingetragen. Ein App secret gehört nicht in eine
Desktop-EXE und wird nicht verwendet. Die Freigabe erfolgt im Standardbrowser; der dort angezeigte
Einmalcode wird anschließend in SafePass eingefügt.

In 1.6 und früher fehlte `files.metadata.read` sowohl im angeforderten OAuth-Scope als auch in der
Einrichtungsliste. Version 1.7 korrigiert beides und prüft den Metadatenzugriff vor dem Speichern einer
neuen Freigabe. Bei bestehenden Apps die vier Permissions aktivieren, mit **Submit** speichern und
unter **Tresor + → Dropbox-Verbindung neu autorisieren** die Rechte erneut freigeben. Die bestehende
App und dasselbe Dropbox-Konto verwenden; ein anderes Konto ersetzt bestehende Verbindungen nicht.

Quellen, geprüft 2026-09-02:
https://dropbox.tech/developers/migrating-app-permissions-and-access-tokens
https://developers.dropbox.com/oauth-guide

### Lokalen Tresor zu Dropbox übertragen

Unter **Tresor + → Aktuellen lokalen Tresor zu Dropbox übertragen** oder im Dropbox-Auswahlfenster.
Der Tresor muss mit einem Kennwort geschützt sein; einen Windows-Hello-Tresor vorher in den Optionen
umstellen. SafePass erzeugt eine verschlüsselte Momentaufnahme, verweigert Namenskonflikte und prüft
nach dem Upload genau die bestätigte Revision durch einen erneuten Download. Quelle und Prüfsummen
müssen unverändert sein. Danach kann mit erneuter Kennworteingabe auf die Dropbox-Fassung gewechselt
werden. Die lokale Originaldatei wird **nicht gelöscht** und bleibt als unabhängige Sicherung erhalten;
sie wird nach dem Wechsel nicht mehr mitgeführt. Der aktive Cloud-Tresor hat einen verschlüsselten
lokalen Cache und die bisherige revisionsgesicherte Synchronisierung.

Bei einer unterbrochenen Übertragung kann die Cloud-Datei bereits existieren. Deshalb vor einem
erneuten Upload zuerst die Dropbox-Liste prüfen. Es gibt keine automatische Löschung auf Dropbox.
Die verschlüsselte Übertragungs-Momentaufnahme kann bei einem Fehler im Cache erhalten bleiben.

### Dropbox-Tresor herunterladen / wieder lokal verwenden

Im Dropbox-Auswahlfenster einen Tresor markieren und **Herunterladen** wählen; für den aktiven Tresor
auch direkt unter **Tresor + → Aktuellen Dropbox-Tresor herunterladen**. Nur neue Zieldateien sind
erlaubt. Download an eine festgehaltene Revision, Größen-, Format- und Hashprüfung, dann atomare
Veröffentlichung ohne Überschreiben. Bei lokalen ausstehenden Uploads wird ausdrücklich vor einem
möglicherweise älteren Cloud-Stand gewarnt. Keine Klartextdatei, kein Passwort-CSV-Export.

Optional kann die heruntergeladene Kopie nach erneuter Entsperrung als lokaler Tresor geöffnet werden.
Die Dropbox-Fassung bleibt bestehen. Diese lokale Kopie synchronisiert nicht automatisch mit Dropbox.

Das Dropbox-Aktualisierungstoken wird getrennt vom Tresor unter
`%LOCALAPPDATA%\SCREENUS SafePass\dropbox-connections.bin` abgelegt und mit Windows DPAPI an das
aktuelle Windows-Konto und diesen PC gebunden. Es wird nicht in die EXE und nicht in den
Dropbox-Tresor geschrieben. Auf einem anderen PC muss Dropbox neu autorisiert werden.

Vor jedem Upload prüft SafePass Dropbox-Revision und Content-Hash. Eine zwischenzeitlich geänderte
Cloudfassung wird nicht überschrieben; stattdessen entsteht eine getrennte verschlüsselte
Konfliktkopie. Ist Dropbox offline, bleibt der neue Stand verschlüsselt im lokalen Cache und wird
beim nächsten Speichern oder Öffnen erneut hochgeladen. Die Dropbox-Versionshistorie gilt zusätzlich.

Dropbox-Tresore müssen mit einem Tresorkennwort geschützt werden, damit sie auf anderen PCs geöffnet
werden können. Windows-Hello-Tresore sind absichtlich an ein Windows-Konto und einen Computer gebunden.

## Verschlüsselung

- Nutzdaten: AES-256-GCM mit neuem zufälligem 96-Bit-Nonce und 128-Bit-Tag pro Speicherung.
- Tresorkennwort: Argon2id mit 64 MiB, drei Durchläufen, vier parallelen Bahnen, zufälligem
  128-Bit-Salt und 256-Bit-Schlüssel.
- Windows Hello: zufälliger 256-Bit-Tresorschlüssel, durch Windows DPAPI für das aktuelle
  Windows-Konto und den Computer geschützt; Windows Hello dient als interaktive Freigabe.

Die Oberfläche nennt AES-256-GCM „Sehr starke Verschlüsselung“. AES-256 verwendet die größte
standardisierte AES-Schlüssellänge (NIST FIPS 197); eine absolute „stärkste Verschlüsselung überhaupt“
gibt es nicht. GCM ergänzt Manipulationserkennung. Schutz hängt auch vom Kennwort und vom Endgerät ab.
Die Hello-Freigabe ist keine hardwaregebundene Schlüsselfreigabe: Prozesse im selben Windows-Konto
können prinzipiell DPAPI nutzen. Ein kompromittierter entsperrter PC oder Speicherabbild ist durch
Tresorverschlüsselung allein nicht abgesichert. Keine unabhängige Sicherheitszertifizierung.

Quellen: https://csrc.nist.gov/pubs/fips/197/final und https://csrc.nist.gov/pubs/sp/800/38/d/final

## Bedienung

- Die Kamera startet ausschließlich nach einem Klick auf das Kamera-Symbol.
- QR-Inhalte werden nur im Arbeitsspeicher verarbeitet und nicht protokolliert.
- Mehrteilige Google-Authenticator-Exporte werden nacheinander eingelesen; jeder Teil erzeugt einen
  Signalton und nach dem letzten Teil schließt das Kamerafenster automatisch.
- Ein Klick auf einen Code, Benutzernamen oder ein Passwort kopiert den Wert für 20 Sekunden in die
  Zwischenablage. SafePass verwendet einen wiederholenden Win32-Zugriff, zeigt den erfolgreichen
  Kopiervorgang sichtbar an und schließt die Werte vom Windows-Zwischenablageverlauf sowie der
  Cloud-Zwischenablage aus.
- Unter `⚙ Optionen` werden das Minimieren in den Infobereich sowie der Schutz des aktuellen Tresors
  eingestellt. Die Schutzart kann später geändert werden.
- Über `+` bei GRUPPEN lassen sich Hauptgruppen und beliebig verschachtelte Untergruppen anlegen.
  Bei ausgewählter Gruppe ist sie im Dialog als übergeordnete Gruppe vorbelegt; „Hauptgruppe“ ist
  weiterhin wählbar. „Gruppe bearbeiten“ erlaubt Umbenennen und Verschieben mit Zyklusschutz.
- Die Auswahl einer Gruppe umfasst deren Untergruppen. Die Suche berücksichtigt den vollständigen
  Gruppenpfad. Authcodes und Passwörter verwenden dieselbe Hierarchie.
- Beim Löschen einer Gruppe bleiben ihre Einträge unter „Ohne Zuordnung“ und ihre Untergruppen eine
  Ebene höher erhalten. Namenskollisionen müssen vorher durch Umbenennen aufgelöst werden.
- Nach dem Anlegen von Untergruppen den Tresor nur noch mit SafePass 1.6 oder neuer bearbeiten:
  ältere Versionen kennen die Elternzuordnung nicht und können sie beim Speichern verlieren.

## Prüfung

`--update-self-test`: ausschließlich künstliche Daten; Signatur-/Versions-/URL-/Größenprüfung,
abgelaufene Metadaten, manipulierte und abgebrochene Downloads, Aktualisierungspfade,
DPAPI-Programmeinstellungen und positive/negative Start-Sperren-Entscheidungen ohne eine
echte biometrische Abfrage. Die echte Windows-Hello-Bestätigung muss interaktiv erfolgen.

`--self-test`: ausschließlich synthetische temporäre Tresore; AES/Argon2id/DPAPI-Rundlauf,
1310 Passwörter mit Untergruppen nach Neustart, Manipulations- und Kennwortabwehr, Revisionsschutz,
Katalogdubletten, reale gleichnamige Tresore, Ordnerlayout, Gruppenzyklen, QR-Decoder und CSV-Parser.
Zusätzlich simulierte Dropbox-Transfers: Upload/Rückdownload, Wiederentschlüsseln mit Authcodes,
Passwörtern und Untergruppen, Namenskonflikte, Netzwerkabbruch, Prüfsummen-/Revisionsfehler,
konkurrierende Quelldatei- und Zieländerungen sowie Hello-Sperre und OAuth-Scope-Regressionstest.
`--ui-self-test`: temporärer DEMO-Tresor; Filter beider Bereiche, Untergruppensuche und Gruppendialog;
Screenshots mit künstlichen Daten im TEMP-Verzeichnis; außerdem Dropbox-Upload-/Downloadauswahl und
Berechtigungshinweis. Die Tests greifen nicht auf ein echtes Dropbox-Konto zu.
`--camera-self-test`: erstes echtes Kamerabild, ohne Tresorzugriff oder QR-Import.
`--dialog-layout-self-test`: reine Offscreen-Layoutprüfung der beiden korrigierten Dialoge,
ohne ein echtes Fenster oder einen Tresor zu öffnen. 24 Kombinationen aus 100/125/150/200 Prozent
simulierter Skalierung, normaler/größerer Schrift und Standard-/Kompaktfenster; Prüfung der
Schaltflächen, des Scrollzugriffs, von Fehlermeldungen und des Schutzartwechsels. Bericht und
synthetische PNG-Vorschauen in `%TEMP%\SCREENUS.SafePass.DialogLayouts`.

Google Password Manager stellt keine öffentliche API zum Abruf des persönlichen Passwortspeichers
bereit. Der Import erfolgt daher über dessen CSV-Export. Diese CSV enthält Klartextpasswörter und
sollte nach geprüftem Import gelöscht werden; SafePass löscht Quelldateien nie automatisch.
