Initial commit: Sanctum encrypted single-file container for Windows
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# Sanctum 🛡️
|
||||
|
||||
Sanctum ist eine eigenständige, speichersichere und hochperformante CLI-Anwendung in Rust, die einen verschlüsselten Ein-Datei-Container (`.sanctum`) unter Windows (10/11) im reinen Userland verwaltet.
|
||||
|
||||
- **Keine Administratorrechte erforderlich**
|
||||
- **Keine Kernel-Treiber** (weder WinFsp noch Dokan)
|
||||
- **Transparenter Windows Explorer-Zugriff** über einen integrierten lokalen WebDAV-Server (`127.0.0.1`) via Windows-Bordmittel (`net use`)
|
||||
- **Statisches Single-Binary** (`sanctum.exe`, ~4.6 MB) ohne externe DLL-Abhängigkeiten
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Kryptografie & Sicherheitsarchitektur
|
||||
|
||||
- **Key Derivation (Argon2id)**:
|
||||
Aus dem Master-Passwort wird mittels `Argon2id` ($M=64\,\text{MB}, T=3, P=4$) ein 256-Bit Key Encryption Key (KEK) abgeleitet.
|
||||
- **Data Encryption Key (DEK)**:
|
||||
Ein zufälliger 256-Bit Schlüssel via CSPRNG (`OsRng`). Der DEK wird mit dem KEK via AES-256-GCM verschlüsselt und im Header abgelegt.
|
||||
- **RAM-Schutz**:
|
||||
Alle Schlüsselstrukturen implementieren das `Zeroize`-Trait (`Zeroizing<[u8; 32]>`), um sensible Schlüsseldaten beim Verlassen des Gültigkeitsbereichs im Arbeitsspeicher sicher zu nullen.
|
||||
- **Chunk-Verschlüsselung (AES-256-GCM)**:
|
||||
Dateien werden in Blöcken von 1 MB verschlüsselt.
|
||||
- **Schutz vor Swap-Angriffen**:
|
||||
Als Associated Data (AAD) werden `node_id` (8 Bytes LE) und `chunk_index` (8 Bytes LE) fest eingebunden. Dadurch wird verhindert, dass Chunks zwischen Dateien oder innerhalb einer Datei vertauscht werden können.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Storage Engine (SQLite3 im VFS-Container)
|
||||
|
||||
Der gesamte Container besteht aus exakt **einer** Datei auf der Host-Festplatte (`.sanctum`), die dynamisch bis über 100 GB wachsen kann.
|
||||
|
||||
- **Pragmas**:
|
||||
- `PRAGMA journal_mode = WAL;`
|
||||
- `PRAGMA synchronous = NORMAL;`
|
||||
- `PRAGMA page_size = 8192;`
|
||||
- `PRAGMA foreign_keys = ON;`
|
||||
- **Tabellen**:
|
||||
- `meta`: Container-Header mit Magic Bytes (`SANCTUM\0`), Version 1, Salt, KDF-Parametern und Wrapped DEK.
|
||||
- `nodes`: Verzeichnis- und Dateiknoten mit Hierarchiebaum und Zeitstempeln.
|
||||
- `chunks`: Verschlüsselte Nutzdatenblöcke mit Nonce und Authentifizierungstag.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Kompilieren
|
||||
|
||||
Voraussetzungen: Rust (>= 1.85) mit GCC/MinGW-Toolchain für SQLite:
|
||||
|
||||
```powershell
|
||||
cargo build --release
|
||||
```
|
||||
|
||||
Das fertige Binary befindet sich unter `target/release/sanctum.exe`.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Verwendung
|
||||
|
||||
### 1. Neuen Container anlegen
|
||||
```powershell
|
||||
sanctum.exe init --path "C:\Users\username\Documents\safe.sanctum"
|
||||
```
|
||||
|
||||
### 2. Container als Windows-Laufwerk einbinden
|
||||
```powershell
|
||||
sanctum.exe mount --path "C:\Users\username\Documents\safe.sanctum" --drive S
|
||||
```
|
||||
Das Netzlaufwerk `S:` steht sofort im Windows Explorer zur Verfügung.
|
||||
Zum Beenden und sicheren Trennen einfach `Ctrl+C` im Terminal drücken.
|
||||
|
||||
### 3. Laufwerk manuell trennen
|
||||
```powershell
|
||||
sanctum.exe unmount --drive S
|
||||
```
|
||||
Reference in New Issue
Block a user