Nous nous connectons à votre Odoo pour synchroniser les factures. Cela signifie que nous détenons un mot de passe. Cette page explique — en français clair d'abord, en détail technique ensuite — exactement comment nous le stockons, qui peut le lire, et pourquoi un dump de notre base serait inutile à un attaquant. Revue à chaque release.
Mots de passe stockés en chiffré AES-128 + HMAC. La base ne voit jamais de clair.
La clé maître vit dans un magasin de secrets managé. Jamais dans la base, jamais dans git.
On lit uniquement les factures et données de ventes. On n'écrit jamais dans votre Odoo. Jamais.
Chaque appel API scope les requêtes par user_id, côté serveur. Pas d'accès cross-tenant.
Quand vous connectez une instance Odoo, seuls ces champs sont persistés dans notre base. Rien d'autre — pas de cookies, pas de tokens de session, pas de clés admin Odoo, aucune donnée d'analytics au-delà de ce qui sert à synchroniser vos factures.
Voici la forme réelle de la table qui contient votre connexion. Notez ce qui en est absent : aucune colonne plaintext_password, aucun password_hint, aucun champ de récupération.
# forme simplifiée de ce qui se trouve en base odoo_connections ( id SERIAL PRIMARY KEY, user_id INTEGER, url TEXT, -- ex. https://acme.odoo.com database TEXT, -- ex. acme-prod username TEXT, -- ex. bot@acme.com encrypted_password TEXT, -- chiffré uniquement — jamais de clair ... )
Trois éléments rendent cette ligne sûre à conserver :
Nous utilisons Fernet, le schéma de chiffrement de la bibliothèque Python cryptography bien auditée. Fernet n'est pas un protocole maison — c'est une spécification bâtie sur des primitives revues depuis des décennies.
Chaque mot de passe que vous enregistrez passe par les deux mêmes fonctions. C'est littéralement tout le code — pas de crypto custom, pas de raccourcis :
# backend/app/core/security.py (extrait) from cryptography.fernet import Fernet def encrypt(value: str) -> str: return get_fernet().encrypt(value.encode()).decode() def decrypt(value: str) -> str: return get_fernet().decrypt(value.encode()).decode()
Le chiffrement ne vaut que ce que vaut la gestion de clé. La clé maître — celle qui peut transformer un chiffré en votre mot de passe — est délibérément tenue loin des données qu'elle protège.
Votre mot de passe fait exactement deux sauts quand vous enregistrez une connexion, et exactement un à chaque sync. Les deux sauts sont protégés par TLS avec des suites cipher modernes.
Nous n'acceptons jamais d'identifiants sur une connexion non chiffrée. Le mot de passe n'est déchiffré en mémoire que pour la durée d'un seul appel RPC à votre Odoo, puis effacé.
L'ensemble des processus et des personnes qui peuvent déchiffrer un mot de passe stocké est délibérément minuscule.
Même avec des identifiants valides, notre code ne peut pas modifier votre Odoo. Le worker de sync n'appelle que des méthodes en lecture — search_read, read — sur les modèles facture, partenaire et produit.
Les promesses de sécurité ne sont significatives que mesurées contre des menaces précises. Voici comment chaque scénario courant se déroule :
Cliquez sur le × à côté d'une connexion dans la sidebar et la ligne — y compris le mot de passe chiffré — est supprimée immédiatement de notre base.
Nous accueillons les revues de sécurité. Chercheur en sécurité, CISO en évaluation, ou client souhaitant mener son propre audit : nous travaillerons avec vous.
Signaler une vulnérabilité, demander des détails d'architecture ou solliciter une fenêtre de pentest : security@hazenfield.com