https://zkproof.org/.
Dans son rapport publié en décembre 2018, la mission d’information commune de l’Assemblée nationale sur les usages des chaînes de blocs et autres technologies de certification de registre donne la définition suivante de la blockchain :
"Une blockchain est un registre, une grande base de données qui a la particularité d’être partagée simultanément avec tous ses utilisateurs, tous également détenteurs de ce registre, et qui ont également tous la capacité d’y inscrire des données, selon des règles spécifiques fixées par un protocole informatique très bien sécurisé grâce à la cryptographie."
Au sein de la blockchain, chaque utilisateur est identifié avec une clé publique, cela peut être assimilé à une boîte postale. Pour interagir avec la blockchain, chaque utilisateur doit signer ses transactions avec la clé privée associée à sa clé publique.
Voici un exemple de clé privée : "0x8da4ef21b864d2cc526dbdb2a120bd2874c36c9d0a1fb7f8c63d7f7a8b41de8f".
Les clés privées sont longues et difficiles à retenir, c'est pourquoi bien souvent les utilisateurs font de simples copier/coller dans des fichiers textes ou les notent sur papier. La première solution est propice aux vols et aux piratages, ce qui met en danger l'ensemble des fonds détenus d'un utilisateur.
Il convient donc de mettre en place un système sécurisé permettant de vérifier que celui qui interagit avec la blockchain est bien le propriétaire de la clé privée qui a signé la transaction, à savoir un Two Factor Authentication (2FA).
Hors blockchain, les 2FA sont assez faciles à mettre en place. Les principaux moyens sont :
Ce qui nous donne le problème suivant : Comment mettre en place un 2FA sur blockchain sachant que toutes les données sont transparentes et qu'il n'est pas possible de faire des appels vers des systèmes extérieurs à l'écosystème, dans le but de requêter une base de données ?
Je me suis penché sur cette question dans le contexte d'un sujet de R&D chez OCTO Technology de 6 mois et ai trouvé une solution que j'ai pu implémenter.
Pour comprendre cette solution, il faut comprendre le fonctionnement d'une fonction de hachage.
Illustration d'une fonction de hachage
Une fonction de hachage est une fonction cryptographique qui prend en entrée une préimage, pouvant être n'importe quelle chaîne de caractère et ressort un hash hexadécimal unique de taille fixe. Par exemple, le hash, en SHA256, du mot "maison" sera toujours "0x32d2f1f71cfc1913e32c0738f1027a4e85acf9fac3bf26148820d5b363bc319b". De plus, à partir de ce hash, il sera impossible de remonter au mot "maison". Il existe plusieurs fonctions de hachages différentes, cependant nous utiliserons ici SHA256 qui est une fonction de hachage robuste et non cassée à l'heure actuelle.
Etant donné que chaque préimage a un unique hash, si je hash mon mot de passe et que je suis capable de créer une preuve ZKP que je connais bien la préimage de ce hash, alors implicitement, j'aurais prouvé que je connais bien mon mot de passe.
Il faut rappeler qu'une telle preuve ZKP est créée à partir du mot de passe mais que depuis la preuve, il est impossible de remonter au mot de passe.
J'ai appliqué ce principe a une plateforme de location de jardins, décentralisée, sur la blockchain Ethereum. Le choix de cette blockchain a été motivé par le fait que le langage d'écriture des smart contracts(2) sur Ethereum est puissant et moderne, et qu'il existe une librairie compatible, ZoKrates, permettant de créer et vérifier des preuves ZKP. Dans le but de pouvoir interagir avec la plateforme, le propriétaire d'un jardin devra fournir une preuve qu'il est bien en possession de son mot de passe en plus de signer ses transactions.
Comment se passe la génération de preuves de connaissance de mot de passe ?
Création d'un jardin sur la plateforme nécessitant l'enregistrement du mot de passe
Proposition d'offre de location en envoyant une preuve de mot de passe ZKP
Voici un exemple de preuve ZKP, générée à partir d'un mot de passe, c'est un fichier json(4) :
Génération de preuve à partir de la librairie Zokrates
L'objet proof contient trois champs a****, b et c****, ils sont le résultat de diverses opérations cryptographiques sur le mot de passe. Inputs est le hash du mot de passe, généré automatiquement par la librairie Zokrates dans le fichier, cependant nous n'en avons pas besoin car il est déjà stocké sur la blockchain. proof est directement reliée au hash du mot de passe, de façon cryptographique**.** Ainsi, en envoyant cette preuve sur la blockchain, il sera vérifié que a, b et c correspondent bien au hash associé à l'utilisateur effectuant la transaction.
Précisons tout de même que ce fichier fait office de mot de passe et qu'il ne faut donc pas le rendre public. Le cas échéant, il conviendra tout simplement de changer de mot de passe, en changeant le hash enregistré sur la blockchain.
Fonctionnement de la vérification de preuve :
Contenu d'une transaction
Vérification de la transaction sur la blockchain
On a ici un 2FA car l'utilisateur devra d'une part prouver qu'il connaît bel et bien son mot de passe et d'autre part il devra signer la transaction avec sa clé privée.
Cette solution permet de contrer les nombreux vols de clés privées blockchain car en ne possédant que la clé privée, l'usurpateur ne sera pas en mesure d'accéder ou d'interagir avec du contenu qui ne lui est pas destiné.
Ce système comporte tout de même quelques limitations car il assure un 2FA uniquement pour les interactions avec les smart contracts. Par conséquent, le 2FA peut être appliqué pour tous les transferts de tokens (ERC20(5), ERC721), c'est-à-dire de jetons créés par smart contracts et répondant à un certain type de standard, et les appels vers les protocoles décentralisés tels que Uniswap, Aave, etc… Mais non sur les envois d'Ether ou de Bitcoin qui ne sont pas gérés via smart contracts.
Zero knowledge Proof (ZKP) est une technologie remarquable qui doit encore faire ses preuves. En effet, aujourd'hui le ZKP est très peu utilisé pour plusieurs raisons énoncées plus haut, notamment à cause du manque de développeurs sur ce sujet complexe. Cependant, les cas d'utilisation de cette technologie sont de plus en plus nombreux, principalement dans le domaine de la blockchain.
De nos jours, pour intégrer un protocole Zero Knowledge Proof sur une blockchain, il y a différents moyens :
Si l'on veut intégrer une technologie ZKP sur une blockchain, il faut impérativement passer par une de ces 4 étapes. Il sera donc plus ou moins facile d'intégrer le ZKP en fonction du mode de fonctionnement de la blockchain. Une intégration sur bitcoin par exemple serait plus compliqué car il faudrait un fork de la blockchain et une proposition d'amélioration, un BIP (Bitcoin Improvement Proposal), ce qui prendrait du temps.
(1) Scalable : Se dit d'un système informatique pouvant s'adapter en fonction de la demande. Un système scalable aura une performance stable malgré le fait qu'il soit utilisé par 10 ou 100 000 personnes.
(2) Smart contract : Les smart contracts, sont des programmes informatiques immuables, le plus souvent déployés sur la blockchain Ethereum, qui exécutent un ensemble d’instructions prédéfinies.
(3) Transaction : Interaction avec la blockchain.
(4) Json : Le JavaScript Object Notation (JSON) est un format standard utilisé pour représenter des données structurées de façon semblable aux objets Javascript.
(5) ERC20 : Standard d'écriture de smart contracts de tokens sur la blockchain Ethereum.
(6) Layer 2 : Surcouche sur un réseau blockchain permettant de diminuer les frais de transactions et en ajoutant des fonctionnalités d'anonymat.