No description
  • HTML 79.4%
  • JavaScript 20.6%
Find a file
JP.Böhm de42a8d67d style: remove fade animation and simplify rendering logic in UI components
Co-authored-by: Copilot <copilot@github.com>
2026-05-06 02:10:32 +02:00
cli feat: implement decrypt command in CLI for vault decryption 2026-05-06 01:25:11 +02:00
docs docs: aktualisiere CLI-Dokumentation zur Überprüfung des Shebangs 2026-05-06 01:26:11 +02:00
tool style: remove fade animation and simplify rendering logic in UI components 2026-05-06 02:10:32 +02:00
.gitignore inital commit 2026-05-05 20:38:15 +02:00
README.md feat: add limitations and constraints section to README for browser and CLI usage 2026-05-06 01:12:42 +02:00
test-vault.uvf feat: implement decrypt command in CLI for vault decryption 2026-05-06 01:25:11 +02:00

UVF — Universal Vault Format

Version: 1.2
Getestet: Node.js 22 · Chrome 124 · Firefox 125 · Safari 17


Was ist UVF?

UVF ist ein portables, browsernatives Verschlüsselungssystem. Dateien und ganze Ordnerstrukturen werden in einem einzigen binären Container (.uvf) gespeichert, verschlüsselt mit AES-256-GCM. Der Schlüssel wird aus einem Passwort via PBKDF2-SHA-256 abgeleitet. Verschlüsselung und Entschlüsselung laufen vollständig im Browser — keine Installation, keine Adminrechte, kein Server.

USB-Stick
├── decrypt.html          ← Vault öffnen & entschlüsseln (self-contained, ~49 KB)
├── uvf-creator.html      ← Vault erstellen & verschlüsseln (self-contained, ~52 KB)
├── vault.uvf             ← verschlüsselter Container
└── README.txt            ← Benutzerhinweis (Klartext)

Beide HTML-Dateien sind vollständig eigenständig und verlinken sich gegenseitig über einen Toggle im Header — sofern sie im gleichen Verzeichnis liegen.


Kerndesign-Entscheidungen

Anforderung Entscheidung
Keine Installation Zwei selbst­ständige HTML-Dateien, null externe Dependencies
Kein Server Alle Crypto-Operationen via WebCrypto API
OS-unabhängig Windows, macOS, Linux, ChromeOS
Keine Adminrechte FileReader / File System Access API, kein Schreibzugriff nötig
Ordner-Support Drag & Drop mit FileSystem Entry API; Pfade im Metadaten-Block
ZIP-Export Pure-JS ZipBuilder (stored, keine Kompression)
Toggle zwischen Apps Sibling-Erkennung via sandboxed iframe, kein Netzwerk

Browser-Kompatibilität

Browser Min-Version Status
Chrome / Chromium 90+ ✓ Empfohlen
Firefox 88+ ✓ Vollständig
Safari 14+ ✓ Vollständig
Edge (Chromium) 90+ ✓ Vollständig
IE / Legacy Edge ✗ Nicht unterstützt

Schnellstart

Vault öffnen (Browser)

  1. USB-Stick einstecken.
  2. decrypt.html im Browser öffnen (Doppelklick oder Datei → Öffnen).
  3. Vault-Datei per Drag-and-Drop oder Klick auswählen.
  4. Passwort eingeben → Unlock Vault.
  5. Ordnerstruktur durchsuchen — einzelne Dateien entschlüsseln oder ganze Ordner als ZIP herunterladen.

Vault erstellen (Browser)

  1. uvf-creator.html im Browser öffnen.
  2. Dateien oder Ordner per Drag-and-Drop oder Klick hinzufügen (inkl. Unterordner-Rekursion).
  3. Vault-Name und Sicherheitsstufe wählen.
  4. Starkes Passwort eingeben und bestätigen.
  5. Encrypt & Build Vault.uvf-Datei herunterladen.

Kein Node.js nötig. Alles läuft im Browser, nichts verlässt das Gerät.

Vault erstellen (CLI, Node.js 18+)

# Einzelnen Ordner verschlüsseln
node uvf-cli.js create --output vault.uvf --password "MeinPasswort" ./MeinProjekt

# Mehrere Pfade mischen (Dateien + Verzeichnisse)
node uvf-cli.js create --output vault.uvf --password "MeinPasswort" Fotos/ Dokumente/ config.json

# Ohne Verzeichnisstruktur (alle Dateien auf Root-Ebene)
node uvf-cli.js create --output vault.uvf --password "MeinPasswort" --flatten ./src

# Dateimuster ausschließen
node uvf-cli.js create --output vault.uvf --password "MeinPasswort" --exclude "*.log" --exclude "*.tmp" ./Projekt

# Testvault mit Beispiel-Ordnerstruktur erzeugen
node uvf-cli.js test

Vault inspizieren (CLI)

# Header-Infos ohne Entschlüsselung
node uvf-cli.js inspect vault.uvf

# Vollständige Metadaten + Verzeichnisbaum
node uvf-cli.js inspect vault.uvf --password "MeinPasswort"

Sicherheitszusammenfassung

Parameter Wert Begründung
Cipher AES-256-GCM Authenticated Encryption, WebCrypto-nativ
KDF PBKDF2-SHA-256 WebCrypto-nativ; Argon2 nicht verfügbar
KDF-Iterationen 310.000 (default) NIST SP 800-132 (2023)
Integrität GCM-Auth-Tag pro Block Tampering erkennbar vor Entschlüsselung
Per-File-Keys 32 Byte, CSPRNG Schlüssel-Isolation zwischen Dateien
Plaintext Nur RAM, wird nach Download genullt Uint8Array.fill(0) nach Blob-Erstellung
Browser-Storage Keiner Kein localStorage/sessionStorage/IDB/Cookie
Netzwerk Gesperrt CSP connect-src 'none'

Architektur (Text-Diagramm)

USB-Stick
┌─────────────────────────────────────────────────────────────────┐
│  uvf-creator.html (SPA)              vault.uvf (binär)           │
│                                                                 │
│  ┌─────────────────────┐  erzeugt  ┌─────────────────────┐     │
│  │ VaultBuilder        │ ────────► │ Header  (128 Byte)  │     │
│  │ CryptoEngine        │           ├─────────────────────┤     │
│  │ FileCollector       │           │ Metadaten-Block     │     │
│  └─────────────────────┘           │ (AES-256-GCM)       │     │
│                                    ├─────────────────────┤     │
│  Passwort + Dateien                │ Datenblock [0] …    │     │
│     │ PBKDF2-SHA-256               └─────────────────────┘     │
│     ▼                                          │                │
│  Master Key → Metadaten-Verschlüsselung         │                │
│  Per-File-Keys → Chunk-Verschlüsselung           │                │
│     ▼                                          │                │
│  Blob → vault.uvf Download                      ▼                │
│                                                                 │
│  decrypt.html (SPA)                                             │
│                                                                 │
│  ┌─────────────────────┐   lädt    ┌─────────────────────┐     │
│  │ UVFParser           │ ────────► │ vault.uvf           │     │
│  │ CryptoEngine        │           └─────────────────────┘     │
│  │ VaultSession        │                                        │
│  │ ChunkDecryptor      │  Passwort → PBKDF2 → Master Key        │
│  │ DownloadManager     │  Master Key → Metadaten entschlüsseln  │
│  │ ZipBuilder          │  Per-File-Key → Chunks entschlüsseln   │
│  └─────────────────────┘                                        │
│     ▼                                                           │
│  Blob-URL → Download (Plaintext sofort genullt)                 │
│  oder ZipBuilder → ZIP-Download                                 │
└─────────────────────────────────────────────────────────────────┘

Dokumentations-Index

Dokument Inhalt
README.md Diese Datei
docs/UVF_SPEC.md Binäres Containerformat v1
docs/CRYPTO_DESIGN.md Kryptografisches Design
docs/BROWSER_APP.md SPA-Architektur decrypt.html
docs/THREAT_MODEL.md Bedrohungsmodell und Gegenmaßnahmen
docs/IMPLEMENTATION_GUIDE.md Implementierungsplan mit Pseudocode
docs/CLI.md CLI-Referenz (create, inspect, test)

Grenzen & Einschränkungen

Browser-App (uvf-creator.html + decrypt.html)

Grenze Wert Ursache
Praktische Vault-Gesamtgröße ≤ ~500 MB empfohlen Browser-Tab-RAM; Warnung ab 200 MB
Einzeldatei-Größe ≤ verfügbarer RAM Chunk wird vollständig in JS-RAM gehalten
ZIP-Export (Entschlüsseln) ≤ ~500 MB Alle entschlüsselten Daten liegen gleichzeitig im RAM
Download-Link (Creator) 5 Minuten Blob-URL wird nach Ablauf widerrufen
Vault-Name 255 Zeichen maxlength-Attribut im Formular
Passwort-Mindestlänge 8 Zeichen Validierung im Creator erzwungen
Chunk-Größe 64 KiB 16 MiB, Zweierpotenz AES-GCM / Spec-Vorgabe
PBKDF2-Iterationen (min.) 100 000 Decoder verweigert schwächere Vaults
Dateinamen-Kodierung UTF-8 ZIP-Builder-Flag 0x0800

RAM-Faustregel (Browser): Vault-Erstellung benötigt ca. 23× die unkomprimierte Datenmenge als freien RAM. Beim ZIP-Export werden alle entschlüsselten Dateien gleichzeitig gehalten — für große Vaults einzelne Dateien bevorzugen.

CLI (cli/uvf-cli.js)

Grenze Wert Ursache
Einzeldatei-Größe Kein hartes Limit (Node.js Streams) Wird chunk-weise verarbeitet
Vault-Gesamtgröße BigUint64 im Header (~16 EiB) Kein praktisches Limit
Chunk-Größe 64 KiB 16 MiB, Zweierpotenz Identische Spec-Vorgabe
PBKDF2-Iterationen (min.) 100 000 Abgelehnt mit Fehlermeldung
Anzahl Dateien Kein hartes Limit Durch RAM für Metadaten-JSON begrenzt

Nicht-Ziele

  • Multi-User / geteilte Schlüssel
  • Schlüssel-Wiederherstellung
  • Netzwerk-Sync oder Cloud-Backup
  • Datei-Kompression im Vault