Introduction
ObsidianTrunk est un gestionnaire de secrets local écrit en Rust. Il chiffre vos mots de passe, clés API et notes sensibles directement sur votre machine — sans serveur, sans compte, sans réseau.
Le fichier vault (trunk.dat) est chiffré en AES-256-GCM avec une clé dérivée par Argon2id. Sans le mot de passe maître et le code TOTP, le fichier est mathématiquement illisible.
Installation
Binaire précompilé (recommandé)
Téléchargez ObsidianTrunk.exe depuis la page de téléchargement. Placez-le dans un dossier dédié — le vault sera créé dans ce même dossier.
Vérifiez le hash SHA-256 avant d'exécuter le binaire :
Get-FileHash ObsidianTrunk.exe -Algorithm SHA256
Compiler depuis les sources
git clone https://github.com/votre-repo/obsidian-trunk.git cd obsidian-trunk cargo build --release
Rust 1.75 minimum requis. Le binaire est dans target/release/ObsidianTrunk.exe.
Première ouverture
Au premier lancement, ObsidianTrunk vous demande de définir un mot de passe maître. Choisissez-en un long et unique — il ne peut pas être récupéré sans la phrase BIP39.
Après création, un secret TOTP est généré et affiché une seule fois. Scannez-le immédiatement dans Google Authenticator ou Aegis. Notez-le également sur papier et conservez-le séparément de votre ordinateur.
⚠️ Sans ce secret et sans la phrase BIP39, un accès perdu est définitif.
Déverrouillage
À chaque ouverture, entrez votre mot de passe maître puis le code TOTP à 6 chiffres de votre application. Le code change toutes les 30 secondes — attendez un nouveau code si vous avez moins de 5 secondes devant vous.
Après 3 tentatives invalides, le vault est bloqué jusqu'au prochain lancement. Si la fenêtre perd le focus pendant que le vault est ouvert, un écran noir masque le contenu — cliquez pour reprendre.
Gérer les secrets
Ajouter une entrée
Renseignez un nom (ex : github, email-pro) et le secret. Cliquez Sauvegarder. Le secret est immédiatement chiffré et effacé de la mémoire.
Lire une entrée
Entrez le nom et cliquez Rechercher. Le secret s'affiche et est copié dans le presse-papier. Il est automatiquement effacé après 30 secondes.
Noms d'entrées
Les noms sont insensibles à la casse. GitHub et github désignent la même entrée.
Sauvegarde
Le vault est dans trunk.dat dans le dossier du binaire. Sauvegardez ce fichier régulièrement sur un support externe chiffré (clé USB VeraCrypt, disque externe chiffré).
Sans trunk.dat et sans votre phrase BIP39, les secrets sont irrécupérables. La phrase BIP39 de 24 mots permet de restaurer l'accès en cas de perte du fichier clé.
Cryptographie
| Couche | Algorithme | Paramètres |
|---|---|---|
| Dérivation de clé | Argon2id | 128 Mo RAM · 3 passes · 4 threads · 32 octets |
| Chiffrement | AES-256-GCM | Nonce 12 octets OsRng · Tag auth 16 octets |
| Authentification | TOTP RFC 6238 | BASE32 · SHA-1 · 30s · 6 chiffres |
| Récupération | BIP39 | 24 mots · OsRng · entropie 256 bits |
| Mémoire | zeroize | Effacement garanti par le compilateur Rust |
Protection mémoire
| Protection | Plateformes | Statut |
|---|---|---|
| zeroize sur clés et secrets | Toutes | ✓ Actif |
| Wipe champs de saisie | Toutes | ✓ Actif |
| mlock() — anti-swap | Linux · macOS | ✓ Actif |
| Anti core dump | Linux · macOS | ✓ Actif |
| VirtualLock — anti-swap | Windows | ⏳ Phase 2 |
| Anti-keylogger bas niveau | Windows | ⏳ Phase 2 |
Structure du vault
Le fichier trunk.dat est un JSON dont tous les champs sensibles sont chiffrés en AES-256-GCM :
{
"salt": "<base64 — sel Argon2id 16 octets>",
"nonce": "<base64 — nonce AES-GCM config>",
"config": "<base64 — config chiffrée (secret TOTP)>",
"noise": ["<base64 aléatoire>", "..."],
"secrets": {
"nom": {
"nonce": "<base64>",
"data": "<base64 — secret chiffré + paddé>"
}
}
}
Le champ noise contient 3 à 7 chaînes base64 aléatoires régénérées à chaque sauvegarde. Chaque entrée est paddée au multiple de 256 octets supérieur — impossible de deviner la longueur d'un secret depuis le fichier.
Limitations connues
mlock() sur Windows
mlock() n'est pas disponible sur Windows. Les pages mémoire contenant des secrets peuvent théoriquement être swappées sur le disque. zeroize reste actif et efface les données dès leur libération. VirtualLock est prévu en Phase 2.
Clipboard sur X11 (Linux)
Sur X11, le presse-papier vit tant que le process est actif. Si ObsidianTrunk est fermé avant les 30 secondes, le wipe automatique ne s'exécute pas. Limitation inhérente au protocole X11.
Keyloggers kernel
La protection contre les keyloggers au niveau kernel n'est pas implémentée en v1. Les keyloggers en mode user ne peuvent pas intercepter les événements gérés en interne par egui. Un hook bas niveau est prévu en Phase 2.
Compiler
# Debug cargo build # Release (recommandé) cargo build --release # Vérifier sans compiler cargo check
Le binaire release applique automatiquement : strip=true, lto=true, panic=abort, codegen-units=1, opt-level=3.
Contribuer
Les contributions sont les bienvenues. Consultez le fichier CONTRIBUTING.md sur GitHub avant d'ouvrir une Pull Request.
Pour signaler une vulnérabilité de sécurité, contactez directement pro@lends.fr — ne l'ouvrez pas en issue publique.
⎇ GitHub →