Service léger de chiffrement d’enveloppe : vos propres clés de données, enveloppées par une clé maîtresse qui ne quitte jamais le serveur, avec rotation et audit complet.
Au lieu de chiffrer vos données directement avec la clé maîtresse, la plateforme génère une clé de données aléatoire (32 octets) pour chacune de vos clés. Vos données sont chiffrées avec la clé de données (AES-256-GCM), et la clé de données elle-même est chiffrée par la clé maîtresse puis stockée chiffrée. Résultat : la clé maîtresse ne sert qu’à envelopper les clés et ne touche jamais vos données — le même principe que les grands systèmes de chiffrement cloud.
Chaque clé appartient à votre seul compte. Vous pouvez créer des clés, les faire pivoter (nouvelle clé de données, l’ancienne restant disponible pour déchiffrer les anciennes données) et les désactiver à tout moment. Une clé désactivée refuse tout nouveau chiffrement mais peut toujours déchiffrer — vous récupérez toujours vos données.
Chaque opération (création, chiffrement, déchiffrement, rotation, désactivation) est journalisée avec l’heure et l’adresse IP. Le journal ne contient que des métadonnées — aucune clé, aucun texte chiffré, aucune donnée déchiffrée.
| Méthode | Chemin | Accès | Description |
|---|---|---|---|
POST | /api/kms/keys | Compte client | Créer une nouvelle clé de données |
POST | /api/kms/encrypt | Compte client | Chiffrer un texte (jusqu’à 64 Ko) — refusé si la clé est désactivée |
POST | /api/kms/decrypt | Compte client | Déchiffrer une enveloppe — fonctionne même pour les clés désactivées (récupération) |
POST | /api/kms/rotate | Compte client | Rotation : nouvelle clé de données, l’ancienne reste pour déchiffrer |
POST | /api/kms/disable | Compte client | Désactiver la clé (bloque seulement les nouveaux chiffrements) |
GET | /api/kms/keys | Compte client | Vos clés — métadonnées uniquement, jamais les clés enveloppées |
// Node.js — create a key, encrypt, decrypt (customer session cookie)
const base = 'https://securecelleouatine.com';
const k = await (await fetch(base + '/api/kms/keys', { method: 'POST' })).json();
const keyId = k.key_id; // ek_...
const enc = await (await fetch(base + '/api/kms/encrypt', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key_id: keyId, plaintext_b64: Buffer.from('secret').toString('base64') })
})).json();
// enc.envelope = { v, iv, ct, tag } — store it, it only decrypts with this key
const dec = await (await fetch(base + '/api/kms/decrypt', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key_id: keyId, envelope: enc.envelope })
})).json();
console.log(Buffer.from(dec.plaintext_b64, 'base64').toString()); // 'secret'