Architecture & cryptographie
Sécurité
& cryptographie
Architecture de sécurité
OVELIYA SCELLÉ est conçu selon le principe de minimisation des données. Nous ne pouvons pas lire vos décisions — même si nous le voulions.
Cryptographie
Hash SHA-256 des documents
Le hash de votre document de synthèse est calculé côté client (votre navigateur) avant toute transmission. Le serveur ne reçoit jamais le contenu de vos réponses, uniquement leur empreinte.
Signature Ed25519
OVELIYA signe les hashs avec une clé Ed25519 (RFC 8032, Curve25519). Cette signature est :
- Asymétrique — la clé privée ne quitte jamais Netlify
- Déterministe — même message + même clé = même signature
- Vérifiable publiquement — n'importe qui peut vérifier avec la clé publique
La clé publique de vérification est disponible à : /api/public-key
Vérification indépendante
Toute signature OVELIYA peut être vérifiée sans nous :
openssl pkeyutl -verify -pubin -inkey pub.pem -rawin -in msg.txt -sigfile sig.bin
→ "Signature Verified Successfully"
→ "Signature Verified Successfully"
Jeton privé
Le jeton privé (private_token) donné après paiement :
- Est généré aléatoirement côté serveur (32 octets cryptographiques)
- N'est jamais stocké en clair — uniquement son hash SHA-256 est conservé
- Est affiché une seule fois — OVELIYA ne peut pas le récupérer
- Est nécessaire pour accéder au document (avec le proof_id)
Contrôle d'accès
- Row Level Security (RLS) activé sur toutes les tables Supabase — aucun accès anonyme direct aux données
- La clé service_role Supabase est uniquement accessible aux Netlify Functions (jamais au frontend)
- Vérification du webhook Stripe via signature HMAC-SHA256
- Vérification du webhook Stripe (statut payé, montant, cohérence métadonnées / base)
- Pré-enregistrement serveur du dossier (
AWAITING_PAYMENT) avant session Checkout — le hash scellé ne peut pas être choisi arbitrairement après coup
Headers de sécurité
- HSTS — max-age=31536000, includeSubDomains, preload
- Content-Security-Policy — politique déployée sur Netlify :
default-src 'self',object-src 'none',base-uri 'self',frame-ancestors 'none'; scripts autorisés'self','unsafe-inline'(SPA / inline historique) etjs.stripe.com; pas d’eval - X-Frame-Options: DENY — protection contre le clickjacking
- X-Content-Type-Options: nosniff
- Permissions-Policy — caméra, micro, géolocalisation désactivés
Signalement d'une vulnérabilité
Si vous découvrez une faille de sécurité, contactez-nous de manière responsable avant toute divulgation publique.
contact@oveliya.com — Objet : [SECURITY]