1. Introduction
Konstruct est une messagerie à chiffrement de bout en bout, construite sur Signal Protocol et centrée sur la confidentialité. La présente politique explique précisément quelles données nous collectons, pourquoi, et lesquelles nous ne collectons pas. Konstruct a été conçu dès l’origine pour que nous détenions le moins de données possible sur vous.
Principe fondamental : nous ne collectons que le strict minimum de données nécessaire au routage des messages chiffrés. Le contenu de vos messages est protégé par un chiffrement de bout en bout — nos serveurs ne peuvent pas le lire, et nous n’essayons pas de le faire.
2. Données que nous collectons
2.1 Identifiant de compte
Konstruct n’exige ni numéro de téléphone, ni adresse e-mail, ni mot de passe, ni vrai nom.
- User ID : un UUID aléatoire que le serveur génère à la création du compte. Il n’est dérivé ni de vos clés ni d’aucune autre information vous concernant, et il est impossible d’en extraire quoi que ce soit sur vous.
- Device ID : un hachage de 32 caractères de la clé publique d’identité (Identity Key) de votre appareil. Contrairement au User ID, il est déterministe — quiconque possède déjà cette clé publique peut le calculer —, c’est pourquoi il sert à associer vos propres appareils et aux liens d’invitation, et non d’identifiant de compte.
- Nom d’utilisateur (facultatif) : un pseudonyme public permettant de vous trouver si vous activez la découverte. Le serveur ne conserve qu’un hachage à clé du nom, et non le nom lui-même. Il peut être modifié ou supprimé à tout moment.
Aucune information permettant de vous identifier n’est requise pour créer un compte et utiliser Konstruct.
2.2 Ensemble de clés cryptographiques
Pour que l’échange de clés de Signal Protocol fonctionne, votre appareil génère et envoie au serveur les clés publiques suivantes. Les clés privées correspondantes ne quittent jamais l’appareil et sont conservées dans le stockage de clés protégé de la plateforme (iOS Keychain, Android Keystore).
| Clé | Type | Stockée sur le serveur | Finalité |
|---|---|---|---|
| Identity Public Key | X25519 (long terme) | Oui, en permanence | Authentifie votre appareil ; utilisée dans le handshake X3DH |
| Signed PreKey | X25519 (moyen terme) | Oui, renouvelée périodiquement | Utilisée dans l’accord de clés X3DH |
| Préclés à usage unique (OTPK) | X25519 (éphémère) | Oui, jusqu’à leur utilisation | Consommées une par session, pour la confidentialité persistante parfaite |
| Clés privées | — | Jamais | Toutes les clés privées restent uniquement sur votre appareil |
Le serveur suit le nombre de préclés à usage unique restantes et demande à l’appareil de reconstituer le stock lorsqu’il baisse. Une fois qu’une OTPK a servi à établir une session, elle est supprimée définitivement du serveur.
2.3 File des messages en attente
Lorsque vous envoyez un message, il est chiffré sur votre appareil avant la transmission. Le serveur conserve le message chiffré dans la boîte aux lettres du destinataire. Il ne supprime pas un message parce qu’un appareil a signalé l’avoir reçu : les boîtes ne sont purgées que selon la durée de conservation — chacune a une limite de taille, et tout ce qui date de plus d’environ 7 jours est supprimé. Un message déjà remis peut donc rester sur notre serveur — chiffré et illisible pour nous — pendant environ 7 jours au plus.
Ce qui est stocké dans la boîte aux lettres (jusqu’à expiration) :
- Corps du message chiffré (blob binaire opaque — nous ne pouvons pas le lire)
- Le User ID de l’expéditeur est omis sur le chemin de la protection de l’expéditeur (toujours active pour le trafic éligible — voir « Furtivité » ci-dessous) ; à sa place voyage un certificat scellé que seul le destinataire peut lever
- User ID du destinataire
- ID du message (UUID)
- Horodatage
- Numéro d’ordre du message (nécessaire à l’algorithme Double Ratchet)
- Clé publique éphémère (élément de l’étape de ratchet de Signal Protocol — ce n’est pas un secret)
Si votre appareil est hors ligne, les messages attendent dans la boîte aux lettres jusqu’à la prochaine connexion. Un message non récupéré en environ 7 jours est supprimé sans avoir été lu.
Furtivité — protection de l’expéditeur (sealed sender) : toujours active pour le trafic utilisateur éligible (messages, accusés de réception, signalisation des appels, etc. ; quelques chemins de service sont exclus par conception). Votre appareil retire le User ID de l’expéditeur de l’enveloppe et scelle un certificat d’expéditeur signé sur la clé d’identité du destinataire — seul le destinataire peut savoir qui a écrit, le serveur ne le peut pas. Des jetons anonymes Privacy Pass peuvent accompagner les envois scellés pour lutter contre le spam ; la vérification des jetons côté serveur est encore en cours de déploiement. La protection de l’expéditeur ne masque à la couche réseau ni l’heure d’envoi, ni la taille, ni votre adresse IP.
2.4 Relations avec les contacts
Lorsque vous ajoutez un contact (par code QR ou lien d’invitation), le serveur enregistre cette relation afin de déterminer le routage des messages et l’abonnement au flux. Cela permet à Konstruct de vous signaler qu’un contact connu est en ligne et de vous abonner à son flux de messages. L’enregistrement est masqué : les deux parties sont stockées sous la forme d’un hachage à clé (HMAC-SHA256) de l’identifiant du compte, et non sous la forme des identifiants eux-mêmes ; une fuite de la base de données ne livre donc pas de graphe social lisible. Disons précisément ce que cela vaut : la clé appartient au serveur, cette protection vaut donc contre une fuite, pas contre nous.
2.5 Jetons de notification push
Sur iOS, pour remettre en temps réel les notifications de messages lorsque l’application est en arrière-plan (sur Android il n’y a pas de service push : l’application maintient sa propre connexion) :
- Jeton d’appareil Apple APNs : stocké sur le serveur et utilisé exclusivement pour envoyer le signal de réveil « nouveau message ».
- Jeton Apple PushKit VoIP : stocké séparément et utilisé exclusivement pour réveiller l’application lors d’une invitation entrante à un appel audio. Comme le jeton APNs, il ne transporte ni le contenu d’un message ni celui d’un appel.
- Le contenu des messages n’est jamais inclus dans les notifications push. La notification ne contient qu’un signal générique, à réception duquel votre appareil se connecte et récupère le message chiffré, ou, dans le cas d’un appel, affiche l’appel entrant.
2.6 Authentification de session
- Jetons de session : un jeton d’accès (valable 24 heures) et un jeton d’actualisation (90 jours) authentifient votre connexion ; les deux sont révoqués à la déconnexion ou à la suppression du compte.
2.7 Appels audio et vidéo
Les appels audio et vidéo sont protégés par chiffrement de bout en bout. L’établissement de l’appel — la description de session WebRTC (SDP) et les candidats de connectivité ICE — transite par le même chemin chiffré de bout en bout que la conversation, de sorte que nos serveurs ne peuvent pas le lire. Le son et la vidéo de l’appel utilisent DTLS-SRTP de WebRTC ; comme les clés de chiffrement du média sont échangées et authentifiées au sein de cette signalisation chiffrée de bout en bout, le média est chiffré de bout en bout entre les deux appareils : ni nos serveurs ni les relais que nous utilisons ne peuvent le déchiffrer. Notre serveur sait si un appel commence en audio ou en vidéo, afin que le téléphone du destinataire affiche un appel du bon type ; l’activation et la désactivation de la caméra pendant l’appel ne lui sont pas transmises. Un relais peut distinguer la vidéo de la voix d’après le volume de trafic chiffré qu’il transmet.
Pour établir un appel, les appareils échangent des adresses réseau candidates (ICE standard de WebRTC) à la recherche d’un chemin direct. Lorsqu’une connexion directe est impossible, le média chiffré est relayé par un serveur TURN : le relais ne transmet que le média chiffré, qu’il ne peut pas lire, mais il voit les adresses réseau des participants. Ces métadonnées de connexion sont nécessaires au routage de l’appel et ne sont pas associées au contenu des messages. Sur iOS, les appels entrants réveillent l’application via le jeton PushKit VoIP décrit à la section 2.5 ; le push lui-même ne transporte aucun contenu d’appel. Sur Android, l’appel arrive par la propre connexion de l’application, sans push. Le serveur TURN fonctionne aux Pays-Bas.
2.8 Pièces jointes multimédias
Lorsque vous envoyez une photo, une vidéo, un fichier ou un message vocal, la pièce jointe est compressée et chiffrée sur votre appareil (AES-256-GCM avec une clé neuve pour chaque fichier) avant le téléversement. La clé de déchiffrement voyage uniquement à l’intérieur du message chiffré de bout en bout jusqu’au destinataire : elle n’est jamais transmise au serveur de médias ni conservée par lui. Le serveur ne stocke qu’un blob chiffré opaque associé à un media ID aléatoire et ne peut pas en lire le contenu.
Les objets multimédias chiffrés sont supprimés automatiquement environ 7 jours après le téléversement (qu’ils aient été téléchargés ou non) ; l’appareil du destinataire les récupère et les déchiffre dans cette fenêtre. Nous ne conservons pas de média en clair ; pour chaque objet, le serveur ne connaît que le blob chiffré lui-même, son identifiant, sa classe de taille après remplissage, le hachage du texte chiffré ainsi que l’heure de téléversement et de suppression.
2.9 Ce que nous ne collectons PAS
Les éléments suivants ne sont expressément pas collectés ni conservés :
- Numéro de téléphone
- Adresse e-mail
- Mot de passe
- Nom réel
- Contenu des messages (chiffrement de bout en bout : nous n’y avons pas accès)
- Historique des messages (il n’existe qu’une boîte aux lettres chiffrée, décrite à la section 2.3, que nous ne pouvons pas lire)
- Données de localisation
- Indicateurs de saisie et accusés de lecture au-delà de la confirmation de remise
- Analyses tierces et SDK de suivi
2.10 Adresses IP et métadonnées de connexion
Se connecter à n’importe quel service en ligne expose votre adresse IP à ses serveurs au niveau du réseau — c’est inévitable, et Konstruct ne fait pas exception. Toutefois, nous n’écrivons pas votre adresse IP brute dans nos bases de données. Pour les limitations lors de l’enregistrement des appareils et pour les défis de preuve de travail (proof-of-work), nous n’utilisons qu’un hachage unidirectionnel salé de l’adresse. Pour limiter le débit d’envoi des messages et des demandes de clés, le serveur conserve brièvement l’adresse elle-même (pour IPv6, son réseau /64) dans un compteur en mémoire vive, qui expire au bout d’environ une minute. Nous ne conservons aucune correspondance « IP — compte ».
Nous n’utilisons ni votre adresse ni son empreinte hachée pour construire des profils comportementaux, les relier au contenu de vos messages ou les transmettre à des fins publicitaires. Mais un hachage salé réduit l’exposition sans anonymiser parfaitement — l’espace d’adresses IPv4 étant restreint, une partie détenant le sel secret pourrait encore tester des adresses candidates. Il retire l’adresse brute de tout ce que nous conservons ; ce n’est pas une garantie que l’origine réseau de la connexion ne pourra jamais être déterminée par notre infrastructure.
Si vous voulez retirer complètement votre adresse réseau du chemin, activez la Protection anti-censure dans Paramètres, ou utilisez un VPN ou Tor — même si le point qui termine votre connexion voit tout de même l’adresse source apparente de celle-ci.
3. Protection contre l’analyse du trafic
Konstruct applique du remplissage et, sur iOS, une gigue aléatoire de l’heure d’envoi, afin qu’un observateur du réseau — et notre serveur — ait plus de mal à déduire ce que vous envoyez d’après la taille ou l’heure exacte. Les messages sont complétés jusqu’à des blocs de taille fixe. Les pièces jointes (photos, vidéos, messages vocaux, fichiers, photos de profil) sont complétées jusqu’à des classes de taille : le serveur conserve une plage de taille, et non la taille exacte du fichier — un fichier grossit d’au plus 12 %, d’environ 3 % en général (les plus petits fichiers sont complétés jusqu’à 4 Ko) — et ne reçoit pas le type du fichier. Ces mesures sont activées par défaut et ne demandent aucun réglage.
Nous n’envoyons volontairement pas de faux trafic de couverture planifié. Une couverture permanente exige une connexion toujours ouverte et des envois programmés, ce qui vide la batterie et consomme des données ; un client mobile ne le supporterait pas, et l’imposer reviendrait à sacrifier un vrai confort pour un faible gain sur les métadonnées. Le remplissage et la gigue (ci-dessus) sont notre réponse mobile ; une couverture permanente n’est possible que sur un client de bureau toujours allumé et reste une option réservée au bureau, non une promesse sur mobile. Nous préférons ne pas fournir de couverture du tout plutôt que d’annoncer ce qui ne fonctionne pas.
À part, la protection anti-censure est une couche d’obfuscation au niveau du réseau qui aide votre connexion à se fondre dans le trafic HTTPS ordinaire lorsque le TLS direct est bloqué. C’est un mécanisme de contournement de la censure, et non de dissimulation des métadonnées : il n’empêche pas, à lui seul, un observateur qui voit déjà votre connexion d’en déduire l’heure et la taille des messages.
4. Protection contre le spam : Proof of Work
Pour prévenir le spam sans numéro de téléphone ni adresse e-mail, Konstruct demande à votre appareil d’effectuer un petit calcul de Proof of Work à l’inscription, ainsi qu’à l’envoi lorsque la limite de fréquence est dépassée. Ce calcul s’effectue côté client : pour un usage honnête, son coût est négligeable, tandis que le spam de masse devient coûteux en calcul. Aucune donnée personnelle n’est impliquée.
5. Comment nous utilisons vos données
| Données | Finalité |
|---|---|
| User ID | Authentification de votre appareil et routage des messages |
| Ensemble de clés publiques | Prise en charge de l’échange de clés du chiffrement de bout en bout Signal Protocol |
| File des messages non remis | Conservation des messages chiffrés jusqu’à leur remise |
| Relations avec les contacts | Routage des messages et abonnements aux flux |
| Jeton APNs | Remise des notifications push en arrière-plan |
| Jeton PushKit VoIP | Réveil de l’application lors des invitations entrantes à un appel |
| Jeton de session | Authentification de la connexion gRPC |
Nous n’utilisons pas les données collectées pour la publicité, le profilage, l’analyse ni à aucune fin étrangère au fonctionnement du service de messagerie.
6. Conservation des données et sécurité
6.1 Infrastructure
- Hébergement : VPS chez DigitalOcean (Pays-Bas)
- Stockage persistant : base de données PostgreSQL (données de compte, ensembles de clés, relations avec les contacts)
- Stockage éphémère : Redis (jetons de session, files de messages non remis)
- Juridiction : Pays-Bas / Union européenne — le RGPD s’applique
6.2 Chiffrement
- En transit : l’échange de messages entre le client et le serveur passe par un flux gRPC bidirectionnel sur QUIC sur iOS lorsqu’il est disponible, avec repli automatique sur gRPC sur HTTP/2 + TLS (Android utilise HTTP/2 + TLS ; la frontière est Caddy sur le port 443, TLS 1.2 ou 1.3). Les RPC de service et l’authentification utilisent la même pile de transport chiffrée
- Au repos : le contenu des messages et des médias n’est stocké que chiffré sur les appareils, au moyen de clés ; les sauvegardes de la base de données sont chiffrées avant leur envoi vers le stockage des sauvegardes (section 7.1)
- De bout en bout : fondé sur Signal Protocol — accord de clés X3DH / PQXDH (X25519 associé au ML-KEM-1024 post-quantique) et Double Ratchet avec AEAD ChaCha20-Poly1305. Les préclés de l’appareil sont signées deux fois — Ed25519 et signature hybride Ed25519 + ML-DSA-65 (post-quantique) — et une session sans les deux signatures ne s’établit pas ; la clé hybride elle-même est pour l’instant certifiée par une signature Ed25519. Les pièces jointes multimédias sont chiffrées en AES-256-GCM avec une clé distincte pour chaque fichier.
6.3 Ce qui est stocké sur votre appareil
Votre appareil conserve l’historique complet des messages localement, dans un stockage protégé par le système d’exploitation (protection des données iOS ; sur Android, stockage isolé de l’application, clés dans l’Android Keystore). Cela comprend :
- L’historique complet des conversations
- Les pièces jointes multimédias
- La liste de contacts et les noms affichés
- L’état des sessions cryptographiques (Keychain / Keystore)
- Les brouillons de messages
Ces données sont sous votre contrôle. La désinstallation de l’application efface définitivement toutes les données locales.
6.4 Durées de conservation
| Type de données | Conservation |
|---|---|
| Messages non remis | Supprimés selon la durée de conservation : limite de taille de la boîte aux lettres et au plus ~7 jours — et non à la remise |
| Pièces jointes multimédias (chiffrées) | Suppression automatique environ 7 jours après le téléversement (selon l’âge de l’objet, qu’il ait été téléchargé ou non) |
| Préclés à usage unique | Supprimées du serveur dès leur utilisation |
| Jetons de session | Jeton d’accès : 24 heures, jeton d’actualisation : 90 jours ; révoqués à la déconnexion ou à la suppression du compte |
| Jeton APNs | Conservé jusqu’à la suppression du compte ou le renouvellement du jeton |
| Jeton PushKit VoIP | Conservé jusqu’à la suppression du compte ou le renouvellement du jeton |
| Hachage du nom d’utilisateur et User ID | Conservés jusqu’à la suppression du compte |
| Signed PreKey | Remplacée lors de la rotation, l’ancienne clé est supprimée |
| Relations avec les contacts | Actuellement non supprimées, ni à la suppression d’un contact ni à celle du compte (enregistrements dépersonnalisés, voir 8.3) |
7. Transfert de données et tiers
Nous ne vendons ni ne louons vos données, et nous ne les transmettons pas à des fins publicitaires, de profilage ou à toute autre fin étrangère au fonctionnement du service. Le fonctionnement lui-même exige les prestataires énumérés ci-dessous ; chacun reçoit le minimum nécessaire à sa tâche, et aucun ne reçoit le contenu des messages.
7.1 Prestataires d’infrastructure
- DigitalOcean (Pays-Bas) : fournit le serveur. N’a accès ni aux données de l’application ni aux clés de chiffrement.
- Hetzner Storage Box (Allemagne) : conserve les sauvegardes de la base de données et des files — 7 quotidiennes et 4 hebdomadaires. Les sauvegardes sont chiffrées avant l’envoi ; Hetzner ne détient aucune clé. Elles contiennent les messages chiffrés des boîtes aux lettres, les relations entre contacts dépersonnalisées et les hachages de noms d’utilisateur ; les médias ne sont pas sauvegardés.
- Serveur TURN (Pays-Bas) et serveurs de contournement des blocages : ne transmettent que du trafic chiffré, qu’ils ne peuvent pas lire, et voient les adresses réseau des connexions. Nous ne publions pas l’emplacement des serveurs de contournement.
- Apple APNs : ne reçoit que le jeton push de votre appareil et un signal de notification générique (sans contenu de message). Soumis à la politique de confidentialité d’Apple.
7.2 Respect de la législation
Nous pouvons être tenus de divulguer des données en vertu d’une injonction légale valide d’une autorité compétente. Toutefois :
- Nous ne pouvons pas déchiffrer vos messages (chiffrement de bout en bout)
- Nous conservons un minimum de métadonnées — ni contenu de messages, ni adresses IP brutes dans les bases de données (le compteur de limitation de courte durée est décrit à la section 2.10), ni profilage comportemental
- Nous informerons les utilisateurs concernés, sauf si la loi l’interdit
8. Vos droits
8.1 Utilisation anonyme
Vous pouvez utiliser Konstruct sans communiquer aucune information permettant de vous identifier. Votre User ID est un UUID aléatoire attribué par le serveur ; il n’encode rien à votre sujet.
8.2 Accès à vos données
Vous pouvez à tout moment demander une copie de toutes les métadonnées associées à votre compte en nous écrivant à l’adresse ci-dessous.
8.3 Suppression du compte
Vous pouvez supprimer votre compte depuis les paramètres de l’application. Lors de la suppression :
- Le hachage du nom d’utilisateur, votre User ID et votre ensemble de clés publiques sont supprimés du serveur. L’identifiant de l’appareil et l’engagement par hachage demeurent dans le journal de transparence des clés : il est en ajout seul, et on ne peut pas en supprimer d’entrée
- Les enregistrements dépersonnalisés des relations avec les contacts ne sont actuellement pas supprimés
- Vos jetons APNs et PushKit VoIP sont supprimés
- Les messages de votre boîte aux lettres sont supprimés selon la durée de conservation habituelle (jusqu’à ~7 jours), et des sauvegardes au fil de leur rotation (jusqu’à ~4 semaines)
- La suppression est terminée sous 24 heures
Les messages précédemment remis à des destinataires ne sont conservés que localement sur leurs appareils et, une fois remis, échappent à notre contrôle.
8.4 Nom d’utilisateur
Vous pouvez ajouter, modifier ou supprimer un nom d’utilisateur à tout moment dans les paramètres du compte.
9. Âge minimum
Konstruct est destiné aux utilisateurs âgés de 16 ans et plus, conformément à la classification d’âge 16+ de l’App Store. Il ne s’adresse pas aux personnes de moins de 16 ans et n’est pas conçu pour elles, et nous ne collectons sciemment aucune donnée les concernant. Comme Konstruct ne conserve que les métadonnées de routage minimales décrites ci-dessus et aucun contenu de message, les données associées à un compte sont limitées par conception. Si vous pensez qu’une personne de moins de 16 ans utilise Konstruct, contactez-nous (section 12) et nous prendrons des mesures.
10. Qui est responsable de vos données
Konstruct est un projet indépendant, et non une entreprise. Le responsable du traitement au sens du RGPD est Maxim Eliseyev, mainteneur du projet ; son adresse figure à la section 12. Konstruct n’est pas assez important pour devoir désigner un délégué à la protection des données (Data Protection Officer), et aucun n’a été désigné : les demandes relevant de la section 8 arrivent à la même adresse et reçoivent une réponse de la même personne. Si cela change — si une personne morale est créée ou si la responsabilité passe à quelqu’un d’autre —, cette section changera aussi, et nous en informerons selon les modalités décrites à la section 11.
11. Modifications de la présente politique
Nous informerons les utilisateurs des modifications importantes par les moyens suivants :
- Une notification dans l’application
- La date « Dernière mise à jour » actualisée dans ce document
La poursuite de l’utilisation de Konstruct après les modifications vaut acceptation de la politique mise à jour.
12. Contact
Pour toute question relative à la confidentialité, toute demande d’accès aux données et tout doute :
- E-mail : maxim.elis@icloud.com
- Site web : konstruct.cc
En bref
| Ni numéro de téléphone ni e-mail requis | Chiffrement de bout en bout (Signal Protocol) |
| Utilisation entièrement anonyme prise en charge | Messages stockés uniquement chiffrés et supprimés selon une durée (jusqu’à ~7 jours) |
| Ni suivi ni SDK d’analyse | Obfuscation du trafic intégrée |
| Les clés privées ne quittent jamais l’appareil | Uniquement des métadonnées minimales |
| Aucune vente de données à des tiers | Juridiction RGPD (UE : serveur aux Pays-Bas, sauvegardes en Allemagne) |