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

CoucheAlgorithmeParamètres
Dérivation de cléArgon2id128 Mo RAM · 3 passes · 4 threads · 32 octets
ChiffrementAES-256-GCMNonce 12 octets OsRng · Tag auth 16 octets
AuthentificationTOTP RFC 6238BASE32 · SHA-1 · 30s · 6 chiffres
RécupérationBIP3924 mots · OsRng · entropie 256 bits
MémoirezeroizeEffacement garanti par le compilateur Rust

Protection mémoire

ProtectionPlateformesStatut
zeroize sur clés et secretsToutes✓ Actif
Wipe champs de saisieToutes✓ Actif
mlock() — anti-swapLinux · macOS✓ Actif
Anti core dumpLinux · macOS✓ Actif
VirtualLock — anti-swapWindows⏳ Phase 2
Anti-keylogger bas niveauWindows⏳ 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 →