Ǧardien : Crée ton compte et garde tes secrets en lieu sûr (par sharding, sous forme de fragments)

Le principe :

Guider l’utilisateur dans la création de son compte avec un processus à la fois simple et sécurisé.
Pour ça, une progressive web app destinée à être utilisé hors ligne (comme Gsper) avec le parcours suivant :

  1. Générer un compte (en option : en utilisant un identifiant secret/salt et mdp, autre option, sauvegarder un contenu arbitraire)
  2. Préparer l’impression (combien émettre de fragments, combien de fragment nécessaire pour reconstituer le compte)
  3. Imprimer les fragments sous forme mots + QR-Code selon le protocole SLIP-0039 (éventuellement en option, générer des fragments bonus pour le document de révocation)
  4. Reconstituer les fragments sous forme de fichier EWIF sur le ou les terminaux depuis les quels on veut pouvoir s’authentifier (en option, générer le document de révocation à partir de l’accès au compte)
  5. Distribuer les fragments à des personnes de confiances (et/ou dans des lieux sur)

Prototype (partiellement bugué) existant :

https://seedhodler.io/ (src)

Qu’en pensez-vous ?

8 Likes

Le fichier de révocation contient le BLOCK_UID de création du compte. Si Ğardien (re)crée un compte membre, il a besoin d’être en ligne.

Si on veut que Ğardien soit manipulé uniquement hors-ligne, on peut faire :

  • soit sauvegarder la seed (ou le fichier PubSec) en fragments (compte membre ou non)
  • soit sauvegarder un doc de révocation déjà généré en fragments
  • soit les deux (deux onglets)

Hors-ligne veut probablement dire ici “dont le code provient d’une source locale sûre”, pas “sur une machine déconnectée d’Internet”. Le programme peut demander le dernier blockstamp à un nœud Duniter même en étant un fichier .html ouvert directement depuis le navigateur.

Je serais plutôt pour l’approche ou il est recommandé d’être déconnecté d’internet lorsqu’on l’utilise.

Mais comme pour la prochaine version de Gsper, il peut y avoir certaines étapes ou l’accès internet facilite (retrouver sa clef publique), et d’autres ou il est recommandé de se couper du réseau (saisir ses secrets).

Ceci dit, je préfère que le cas d’utilisation principal de l’app soit faisable 100% hors ligne et que seul des usages auxiliaire sollicite le réseau.

Mon idée initiale est en effet de ne sauvegarder par défaut que la seed sous forme de fragment (un fichier de révocation pouvant être généré à tout moment une fois qu’on a récupérer l’accès au compte).
L’option pour sauvegarder un contenu arbitraire en fragments permettrait de sauvegarder soit un document de révocation pré-généré, soit ses identifiants secrets et mdp pour qui voudrait pouvoir les retrouver pour s’authentifier avec plutôt que par fichier EWIF.

Question stupide : keepassx ne peut-il déjà faire ça ?

Pas à ma connaissance.

L’idée derrière Ğardien, c’est de faire pour Duniter ce que fait DarkCrystal dans Patchbay/SSB : sauvegarder un secret en le partageant à plusieurs personnes, de sorte qu’il faille plusieurs fragments pour reconstituer le secret.

2 Likes

Je déterre ce sujet après des discussions avec @poka il y a quelques mois ou avec @tuxmain il y a quelques jours.

Peut-être que je le ferais au sein de Ǧardien comme je le proposais initialement, histoire de proposer une interface pour ça, ou peut-être que d’autre irons plus vite que moi et l’intègreront dans leurs clients.

L’idée principale, c’est d’utiliser des shards / fragments ou du sharding (fragmentation) pour sauvegarder ses secrets chez des tiers sans que ceux-ci ne puissent utiliser ces secrets à votre insu.

Au gré des discussions, mon idéal d’UX a évolué. Aujourd’hui je n’imagine pas grand monde créer son compte en générant directement ses fragments,

  • d’une part, parce que ça rajout une complexité à un moment où l’utilisateur est encore peu engagé et donc susceptible d’être facilement effrayé par tout ce qui rajoute des étapes entre l’envie d’avoir un compte et le moment de pouvoir s’en servir.
  • d’autre part, parceque, en tant que nouvel⋅le arrivant⋅e, sans connaitre personne, difficile de savoir à qui confier ses fragments.

Les moments qui me semblent pertinents pour générer et partager des fragments de sauvegarde de ses secrets d’accès au compte, c’est, selon ce qui arrive en premier :

  • quand le compte dépasse 100DU en tant que portefeuille
  • quand le compte reçoit ça 5ᵉ certification (et devient membre)

La manière de faire, serait de proposer une interface avec réglages par défaut, mais modifiable simplement (j’en parle là : N/2+1 as default, but customizable like in SLIP-0039 spec · Issue #98 · paritytech/banana_split · GitHub )
shard ux suggestion
Et d’avoir une répartition suggérée des fragments/shards également par défaut, pour pouvoir faire un simple suivant/valider pour valider et mettre en place le sharding comme procédé de sauvegarde de ses secrets.

La répartition par défaut qui me parle est la suivante (avec minimum 4 fragments sur 7 pour reconstituer le secret) :

  1. un fragment envoyé chiffré à son premier certificateur (donc déchiffrable uniquement par lui)
  2. un fragment envoyé chiffré à l’un des 4 autres premiers certificateurs aléatoirement
  3. un fragment envoyé chiffré à un membre aléatoire de la toile forgeron (V2s)
  4. un fragment envoyé chiffré à un membre aléatoire du commité technique (V2s)
  5. un fragment envoyé chiffré à un membre aléatoire de l’assemblée citoyenne (V2s)
  6. un fragment en clair à s’envoyer par email, copier sur PC et smartphone ou à imprimer et garder chez soi
  7. un fragment en clair à confier à un proche (amis, famille, collègue, voisin…) par le moyen de son choix

Pour un compte portefeuille, on remplace les 2 premiers par :

  1. un fragment envoyé chiffré à l’un des 3 premiers comptes vous ayant versé des G1
  2. un fragment envoyé chiffré à l’un des 3 premiers comptes à qui vous avez versé des G1

Chaque fragment en clair contient :

  • Fragment de récupération pour le compte G1 dont la clef publique est : xxxx…xxxx:xxx
  • contenu cryptographique du fragment sous forme de mnémonic
  • contenu cryptographique du fragment sous forme de QRcode
  • instructions de récupération (récupérer suffisamment de fragments, utiliser tel logiciel pour les assembler et reconstituer votre clef privée/seed en utilisant la procédure “charger/reconstituer” un compte à partir de fragments)

Chaque fragment chiffré contient une fois déchiffré :

  • Fragment de récupération pour le compte G1 dont la clef publique est : xxxx…xxxx:xxx
  • contenu cryptographique du fragment sous forme de mnémonic
  • qui détient les autres fragments (et donc leur nombre)
  • combien de fragments sont nécessaires pour reconstituer le secret

(ces 2 dernières lignes étant désactivables pour rendre plus dure le travail d’un attaquant, mais aussi celui du récupérateur légitime)
L’interface devrait aussi demander pour chaque fragment en clair avant génération des fragments chiffrés à qui l’utilisateur compte confier ce fragment ou où il compte le stocker, afin qu’il puisse les retrouver plus facilement au besoin.

Dans tous les cas, nombre de fragments nécessaire et total sont réglables par l’utilisateur, ainsi que modifier les destinataires pour en choisir des personnalisés. Ainsi, si la proposition par défaut ne lui convient pas, il peut changer.

Enfin, après discussion avec @tuxmain il serait possible, et potentiellement préférable, à discuter, de stocker fragmenté non pas la seed, mais une clef délégué ayant besoin d’émettre un document en blockchain une semaine (ou autre délai à définir) avant de pouvoir transférer quoi que ce soit depuis le compte récupéré. De cette manière, si les détenteurs des fragments tentaient de se rassembler pour en faire usage alors que le détenteur légitime a toujours accès à son compte, celui-ci disposerait d’une semaine (ou autre délai défini) pour révoquer cette clef de récupération déléguée (de sharding) avant que sa tentative d’usage frauduleux ne porte à conséquence.

L’idée me semble bonne sur le principe, mais elle nécessite, je crois, des ajouts au protocole, là où sans la partie clef déléguée avec délais, seuls les logiciels clients ont à prendre en charge ces mécanismes.

PS : les fragments chiffrés peuvent aussi bien être envoyé via messagerie cesium+ que par email classique avec en objet “fragment de récupération G1” éventuellement accompagné de la clef publique en clair pour retrouver plus facilement.

2 Likes

Autre outil de sharding existant : GitHub - paritytech/banana_split: Shamir's Secret Sharing for people with friends

Option supplémentaire : l’envoi des shards par email à une liste de bénéficiaire, les intérêts que j’y vois :

  • c’est simple pour l’utilisateur, il est déjà famillier avec l’usage d’email
  • il peut envoyer des shards à des proches non utilisateur de la Ǧ1 (famille, amis…).

Les inconvénients c’est :

  • à implémenter, la délivérabilité des emails est souvent galère (là où du stockage off-chain une fois mis en place devrait être plus simple pour les différents clients/wallet)
  • la sécu est moindre si les shards sont partagés en clair (si trops de destinataires sont chez gmail, google peut rassembler les shards et récupérer les comptes)
  • si on veut chiffrer les shards pour que seul leur destinataire puissent les déchiffrer, on perd l’avantage de pouvoir envoyer à des non-membre, et on as besoin d’indiquer et email et identité G1 du compte cible.

Du coup, l’idéal serait d’avoir et de l’envoi off-chain pour les membres, et de l’envoi par email si besoin de compléter vers des non-utilisateurs de la Ǧ1, et de l’impression pour permettre des stratégies hors-ligne.

1 Like