No description
  • HTML 76.5%
  • JavaScript 23.5%
Find a file
2026-07-07 23:14:37 +02:00
cli Update security features and password requirements in UVF Creator and Decryptor 2026-07-07 22:58:43 +02:00
docs Update security features and password requirements in UVF Creator and Decryptor 2026-07-07 22:58:43 +02:00
tool style: implement password field with toggle and Caps Lock warning in UVF Creator and Decryptor 2026-07-07 23:14:37 +02:00
.gitignore Update security features and password requirements in UVF Creator and Decryptor 2026-07-07 22:58:43 +02:00
README.md Update security features and password requirements in UVF Creator and Decryptor 2026-07-07 22:58:43 +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+)

Das Passwort wird interaktiv abgefragt (ohne Echo) oder per --password-file / UVF_PASSWORD bereitgestellt — nicht mehr als Argument (das würde in Shell-History und ps leaken). Beim Erstellen sind mindestens 12 Zeichen erforderlich.

# Einzelnen Ordner verschlüsseln (Passwort wird interaktiv abgefragt)
node uvf-cli.js create --output vault.uvf ./MeinProjekt

# Mehrere Pfade mischen (Dateien + Verzeichnisse), Passwort aus Umgebungsvariable
UVF_PASSWORD="mein-langes-passwort" node uvf-cli.js create --output vault.uvf Fotos/ Dokumente/ config.json

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

# Dateimuster ausschließen, Passwort aus Datei
node uvf-cli.js create --output vault.uvf --password-file pw.txt --exclude "*.log" --exclude "*.tmp" ./Projekt

# Testvault mit Beispiel-Ordnerstruktur erzeugen (Passwort: testvault1234)
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-file pw.txt

Sicherheitszusammenfassung

Parameter Wert Begründung
Cipher AES-256-GCM Authenticated Encryption, WebCrypto-nativ
KDF PBKDF2-SHA-256 WebCrypto-nativ; Argon2 (v2) geplant
KDF-Iterationen 600.000 (default), min. 100.000 OWASP 2023; 310.000 (NIST) weiterhin wählbar
Passwort-Minimum 12 Zeichen (create) Erzwungen in Browser und CLI
Integrität GCM-Auth-Tag pro Block Tampering erkennbar vor Entschlüsselung
Metadaten-Validierung Fail-closed vor Verwendung Schutz gegen böswillige/inkonsistente Vaults
Path-Traversal / Zip-Slip Blockiert CLI lehnt Ausbrüche ab & überschreibt nie; Browser bereinigt ZIP-Pfade
Per-File-Keys 32 Byte, CSPRNG Schlüssel-Isolation zwischen Dateien
Plaintext Nur RAM, wird nach Download genullt Uint8Array.fill(0) nach Blob-Erstellung
CLI-Passwort Nie als Argument nötig Interaktiv / --password-file / UVF_PASSWORD
Browser-Storage Keiner Kein localStorage/sessionStorage/IDB/Cookie
Netzwerk Gesperrt CSP default-src 'none' + 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 12 Zeichen Validierung im Creator und in der CLI 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 600 000 default, min. 100 000 Niedrigere Werte abgelehnt
Passwort-Mindestlänge 12 Zeichen (create) 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