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 selbststä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)
- USB-Stick einstecken.
decrypt.html im Browser öffnen (Doppelklick oder Datei → Öffnen).
- Vault-Datei per Drag-and-Drop oder Klick auswählen.
- Passwort eingeben → Unlock Vault.
- Ordnerstruktur durchsuchen — einzelne Dateien entschlüsseln oder ganze Ordner als ZIP herunterladen.
Vault erstellen (Browser)
uvf-creator.html im Browser öffnen.
- Dateien oder Ordner per Drag-and-Drop oder Klick hinzufügen (inkl. Unterordner-Rekursion).
- Vault-Name und Sicherheitsstufe wählen.
- Starkes Passwort eingeben und bestätigen.
- 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. 2–3× 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