Sécurité · En détail
Le cycle de vie cryptographique complet
Une description précise de ce que deviennent vos données à chaque étape, avec les primitives, les paramètres et les frontières de confiance détaillés. Chaque étape commence par un résumé en termes simples : lisez au niveau de détail qui vous convient.
Étape 01 · Chiffrement
Votre secret est scellé sur votre appareil
En termes simples : le brouillage a lieu dans votre navigateur, avant tout envoi. Ce que nous recevons est déjà illisible.
Lorsque vous appuyez sur Chiffrer, le navigateur tire une nouvelle clé de contenu de 256 bits du CSPRNG de WebCrypto et chiffre vos données avec AES-256-GCM. GCM est un mode authentifié : chaque bloc porte une étiquette de 128 bits, si bien que toute altération ultérieure est détectée au lieu d’être déchiffrée en silence.
Le texte et les fichiers sont traités de la même façon : tous deux deviennent un bloc binaire opaque, complété jusqu’à une taille standard pour qu’un mot de passe court et un petit fichier se ressemblent. Le texte en clair ne passe jamais sur le réseau et ne quitte jamais la mémoire de l’onglet.
Étape 02 · Garde de la clé
La clé se cache dans le lien, pas sur nos serveurs
En termes simples : la partie du lien située après le # contient la clé, et les navigateurs n’envoient jamais cette partie à aucun serveur.
Votre lien transporte une graine aléatoire de 256 bits dans le fragment de l’URL, c’est-à-dire tout ce qui suit le #. Selon la spécification des URL, le navigateur retire le fragment, qui n’est jamais inclus dans la requête envoyée à nos serveurs. À partir de cette graine, le navigateur dérive, avec HKDF, une valeur de recherche pour retrouver le secret et la clé qui déchiffre la clé de contenu. Le serveur ne voit jamais qu’une empreinte de la valeur de recherche.
Le navigateur du destinataire lit la graine dans le fragment et effectue la même dérivation localement. C’est ce que « divulgation nulle de connaissance » signifie ici : posséder les données chiffrées seules ne sert à rien sans le lien.
Étape 03 · Phrase de passe facultative
Un second verrou que seuls des humains détiennent
En termes simples : ajoutez une phrase de passe, et même une personne disposant du lien complet ne pourra pas ouvrir le secret sans elle.
Si vous définissez une phrase de passe, elle est renforcée par Argon2id, une fonction de dérivation de clé à mémoire intensive, puis combinée à la graine pour former la clé qui chiffre la clé de contenu. La phrase de passe elle-même n’est jamais transmise ni stockée ; seuls vous et le destinataire la connaissez. Les essais erronés sont refaits dans le navigateur du destinataire, sur des données qu’il détient déjà : le serveur ne peut donc pas les compter.
L’usage intensif de la mémoire rend coûteuses les tentatives hors ligne à grande échelle, même sur GPU et ASIC. Transmettez la phrase de passe par un autre canal que le lien, et les deux facteurs ne se trouvent jamais au même endroit. Le module Argon2 est téléchargé à chaque création et à chaque affichage, de sorte que le réseau ne peut pas savoir quels secrets en utilisent une.
Étape 04 · Transit & stockage
Seules des données chiffrées quittent votre appareil
En termes simples : nous stockons une boîte verrouillée et une date d’expiration. Rien d’autre : pas de texte en clair, pas de clé, aucune trace de vous.
Le bloc est envoyé via TLS et stocké au repos sous forme chiffrée, à côté d’identifiants hachés, de sa durée de vie et d’une heure d’expiration arrondie. Nous ne conservons délibérément aucune identité d’expéditeur, aucun destinataire, aucun journal d’IP, aucune date de création ni aucun historique d’accès. Il n’existe pas de système de comptes qui permettrait de relier un secret à une personne. La limitation de débit repose sur un HMAC de l’adresse avec un sel qui change régulièrement, si bien que rien de ce qui précède une rotation ne peut être relié à ce qui la suit.
Comme l’objet stocké n’a aucun sens sans la graine contenue dans le fragment, une compromission du serveur ou une réquisition judiciaire ne livre que des octets opaques et des empreintes dont on ne peut rien tirer.
Étape 05 · Récupération & destruction
La première lecture l’emporte, puis tout est effacé
En termes simples : ouvrir un lien à usage unique remet la boîte une seule fois et supprime la copie du serveur. Vous pouvez aussi la détruire vous-même, à tout moment.
Rien n’est récupéré au chargement de la page d’affichage : la requête ne part qu’après un vrai clic ou une vraie pression de touche, pour que les scanners de liens et les aperçus de chat ne puissent pas consommer un secret. Pour un secret à usage unique, le serveur réclame la ligne en une seule mise à jour conditionnelle (une seule requête l’emporte) et le secret est considéré comme consommé dès cet instant. Le même navigateur peut retélécharger pendant 15 minutes si la connexion est coupée ; personne d’autre ne le peut, et une réclamation non confirmée est détruite, jamais annulée. Les secrets à durée limitée sont simplement lus jusqu’à leur expiration.
Chaque secret dispose aussi d’un lien de destruction privé. L’ouvrir ne détruit rien à lui seul ; confirmer efface les données chiffrées immédiatement, avant que le moindre destinataire puisse les lire.
Modèle de menace
Ce que shhnote peut voir, et ce qu’il ne peut pas voir
La version honnête. Voici exactement où se situe la frontière de confiance.
Ne quitte jamais votre appareil
Ce que nous ne pouvons pas voir
Votre texte en clair · la clé de contenu et la graine · votre phrase de passe · le fait qu’une phrase de passe ait été définie ou non · qui a créé ou ouvert un secret · quand il a été créé · les journaux d’accès au niveau IP. Rien de tout cela n’est transmis ni conservé.
Stocké sur nos serveurs
Ce que nous détenons
Un bloc chiffré que nous ne pouvons pas ouvrir · sa classe de taille après remplissage · des empreintes à sens unique des valeurs que votre navigateur utilise pour le retrouver ou le détruire · s’il est à usage unique ou à durée limitée · une heure d’expiration arrondie. Tout cela est inutile sans la graine contenue dans votre lien.
Bon à savoir
Les limites, honnêtement
Toute personne disposant du lien complet (et de la phrase de passe, le cas échéant) peut lire un secret à usage unique : considérez le lien comme le secret lui-même. Après l’affichage d’un secret, la page écrase ce qu’elle peut lorsque vous la quittez, mais JavaScript ne peut pas le garantir ; fermez l’onglet quand vous avez terminé. Un navigateur piloté par un automate qui injecte de vraies saisies peut ouvrir un secret à usage unique comme le ferait une personne ; le destinataire ne trouve alors rien, ce qui est le résultat honnête. Supprimer un secret efface l’enregistrement ; des restes chiffrés peuvent subsister dans les journaux, l’espace disque libre ou les sauvegardes jusqu’à ce qu’ils soient écrasés, sous forme de données chiffrées sans clé. Les secrets volumineux stockés en dehors de la base de données portent l’heure d’écriture du fichier. Enfin, comme pour toute application web, vous faites confiance au code envoyé à votre navigateur : c’est pourquoi shhnote est open source et auto-hébergeable.
Spécification cryptographique
Toutes les primitives, au même endroit
Chiffrement
Chiffrement symétrique authentifié par blocs de 64 KiB. Une clé de 256 bits et une étiquette d’intégrité par bloc : toute altération ou troncature est détectée, pas seulement rendue illisible.
Dérivation de clé
Les clés et les identifiants sont dérivés de la graine par HKDF-SHA-256. Les phrases de passe facultatives sont renforcées par une KDF à mémoire intensive, ce qui rend la force brute hors ligne lente et coûteuse, même sur du matériel dédié.
Aléa
Les graines, clés, sels et nonces proviennent du générateur cryptographiquement sûr du navigateur. Jamais Math.random(), jamais prévisibles.
Garde de la clé
La graine voyage après le # de votre lien. Les navigateurs ne transmettent jamais le fragment : elle n’atteint donc jamais nos serveurs.
En transit
Seules des données chiffrées quittent votre appareil, via un TLS moderne. Ce que nous recevons est un bloc opaque que nous ne pouvons pas ouvrir.
Au repos
Nous conservons un bloc chiffré, des empreintes à sens unique de ses identifiants et une expiration arrondie : pas de texte en clair, pas de clés, pas de métadonnées sur l’expéditeur ou le destinataire.
FAQ technique
Pour les plus exigeants en sécurité
Comment la garantie d’usage unique résiste-t-elle aux accès concurrents ?
L’affichage exécute une seule mise à jour conditionnelle qui fait passer la ligne de l’état « actif » à l’état « réclamé ». Deux requêtes simultanées ne peuvent pas réussir toutes les deux ; la seconde trouve un enregistrement déjà réclamé et reçoit la même réponse « aucun secret trouvé » que n’importe qui d’autre. La réclamation n’est jamais annulée : si le téléchargement échoue, le détenteur du jeton de réclamation peut retélécharger pendant la fenêtre prévue ; sinon, le secret est détruit sans avoir été lu.
Pourquoi le fragment d’URL plutôt qu’un paramètre de requête ?
Les paramètres de requête sont envoyés au serveur et se retrouvent dans les journaux d’accès, les proxys et les outils d’analyse. Le fragment (après le #) est défini par la spécification des URL comme restant côté client : le navigateur ne l’inclut jamais dans la requête HTTP. Cette propriété est le fondement même de la conception à divulgation nulle de connaissance. Après l’affichage, la page retire aussi le fragment de la barre d’adresse et de l’historique.
Qu’est-ce qui empêche les scanners de liens de consommer les secrets à usage unique trop tôt ?
La page de consultation est le même document statique pour tous les secrets et ne récupère rien au chargement. La requête n’est envoyée qu’après un vrai clic ou une vraie pression de touche : un click() scripté ou une soumission de formulaire ne compte pas. Les scanners automatiques (sécurité des e-mails, aperçus de liens dans les chats, antivirus) ne chargent jamais que cette coquille statique.
Puis-je vérifier tout cela ou l’héberger moi-même ?
Oui. L’intégralité du code source est publique sous licence AGPLv3, le protocole est décrit dans une spécification accompagnée de vecteurs de conformité que toute implémentation peut utiliser pour se vérifier, et il existe un guide d’auto-hébergement. Vous pouvez auditer la cryptographie côté client et faire tourner votre propre instance, pour que la frontière de confiance soit entièrement la vôtre.
Est-ce que quelque chose est journalisé pour lutter contre les abus ?
Nous ne conservons ni journaux d’accès par secret ni historique d’adresses IP. La limitation de débit utilise un hachage à clé de l’adresse, avec un sel qui change régulièrement et remet à zéro tous les compteurs à chaque rotation. Les signalements d’abus sont comptés par jour ; aucune trace n’indique quel secret a été signalé.
Conseils pour partager en toute sécurité
- Transmettez la phrase de passe par un autre moyen que le lien, par exemple le lien par e-mail et la phrase de passe par téléphone.
- Choisissez la durée d’expiration la plus courte possible.
- Utilisez un secret à usage unique pour les mots de passe et les autres informations qui ne doivent être lues qu’une seule fois.
Signaler une vulnérabilité
Si vous pensez avoir trouvé un problème de sécurité sur ce site, écrivez à [email protected] et prévenez-nous en privé avant d’en parler à qui que ce soit. Indiquez ce que vous avez trouvé et comment le reproduire.
Nous nous engageons à :
- répondre sous 5 jours ouvrés ;
- vous tenir informé pendant la correction ;
- vous créditer lors de la publication du correctif, si vous le souhaitez.
Pendant vos tests, merci de ne pas accéder aux données d’autrui, de ne pas perturber le service et de ne pas lancer de scans automatisés qui le surchargent.
Pour les vulnérabilités du logiciel shhnote lui-même, consultez la politique de sécurité du projet.
Essayez : cela prend dix secondes
Écrivez quelque chose de secret, obtenez votre lien à usage unique et regardez-le disparaître.