CloudFlare présente la League of Entropy, pour obtenir des nombres aléatoires
Le 18 juin 2019 à 09h25
2 min
Internet
Internet
Dans le cas présent, l'entropie peut être définie comme le niveau d'imprédictibilité d'un nombre aléatoire. En effet, il faut distinguer nombre aléatoire et nombre aléatoire… car ce n'est pas si évident d'avoir un nombre véritablement aléatoire.
CloudFlare, par exemple, utilise toute une panoplie de lampes à lave et une caméra servant d'entrée à un générateur de nombres pseudo-aléatoires. L'université du Chili utilise des mesures sismiques, etc. Chacun y va de sa sauce maison pour arriver au résultat souhaité.
Partant du principe qu'un mélange de nombres aléatoires est toujours plus aléatoire qu'un seul nombre, League of Entropy mélange cinq sources (Cloudflare, École polytechnique fédérale de Lausanne, Université du Chili, Kudelski Security et Protocol Labs) pour produire un résultat. La ligue est ouverte et de nouveaux membres peuvent venir rejoindre les rangs pour encore renforcer le caractère aléatoire et limiter le risque de dépendance à une poignée de sources.
Le nombre ainsi généré est affiché sur le site avec une mise à jour toutes les 60 secondes. Pourquoi 60 secondes ? « Sans raison particulière » affirme CloudFlare. Vous pouvez voir l'ensemble des précédents résultats, mais pas en choisir un au hasard.
La génération de clés de chiffrement repose sur l'utilisation de grands nombres aléatoires. Mais attention, les résultats affichés par la League of Entropy ne vous serviront à rien dans le cas présent : « les utilisateurs ne doivent PAS utiliser ces nombres générés aléatoirement pour leurs clés secrètes », car ils sont accessibles à tout le monde.
Pour autant, obtenir de vrais nombres générés aléatoirement et disponibles publiquement est très utile. Par exemple pour les élections lorsqu'il faut sélectionner au hasard des bureaux de vote, pour les tirages au sort, etc. Des détails sont donnés dans ce billet de blog. Des détails plus techniques sont également disponibles par ici.
La ligue utilise Drand (disponible sur GitHub, licence MIT) pour générer les nombres aléatoires annoncés publiquement, mais il est aussi possible d'utiliser un ou plusieurs nœuds de la ligue pour obtenir un nombre privé. De la documentation est disponible par ici.
Le 18 juin 2019 à 09h25
Commentaires (22)
Vous devez être abonné pour pouvoir commenter.
Déjà abonné ? Se connecter
Abonnez-vousLe 18/06/2019 à 12h19
Alors pourquoi afficher publiquement des valeurs ?
Le but ici n’est pas de prouver quoi que ce soit, c’est juste un mélange de plusieurs sources supposées être les meilleures sources d’entropie possibles. Or justement, on ne peut pas vérifier ces sources, on ne peut que se baser sur leur réputation.
Le 18/06/2019 à 12h27
Ah bon ??? C’est marrant, ce n’est pas ce que je lis… Allez, je cite ta citation :
To retrieve and verify the latest random value using the experimental configuration, install Golang v1.11+, set your GOPATH, and execute:
A ton avis, le “and verify” dans le texte, il veut dire quoi ?
Le 18/06/2019 à 14h08
Et le “retrieve”, il veut dire quoi ?
Le 18/06/2019 à 15h46
Woaw l’argument imparable. Scotché je suis, tu as tout compris.
Que tu le comprennes ou non est indifférent. Le système tel qu’il est décrit (et pour s’en convaincre il suffit de lire les documents - ce qui je l’admets requiert un minimum d’ouverture d’esprit) a pour intérêt principal la possibilité pour un auditeur de vérifier que le tirage n’a pas été biaisé par un des participants.
Je ne peux donc que te proposer de lire attentivement l’article de blog et d’essayer de le comprendre. Par exemple en s’attardant sur les mots “unbiasability” et “verifiability” qui sont d’une portée plus importante qu’une remarque sur le mot “retrieve” sur lequel tu sembles faire une fixation.
Évidemment que le protocole te permet de retrouver la valeur… personne n’affirme le contraire. Ca servirait à quoi un générateur aléatoire parfait, mais dont on ne pourrait pas retrouver les valeurs ? " />
Le 18/06/2019 à 18h00
Si la méthode t’intéresse plus que le résultat, c’est que tu n’en as pas réellement besoin.
J’ai développé une application de crypto pour laquelle il faut des nombres aléatoires. Alors le sujet m’intéresse sûrement au moins autant que toi. Je pourrais en écrire des pages, mais j’ai mieux à faire.
Le 18/06/2019 à 18h28
Oh oui, surtout, arrête d’en parler ça vaudra mieux pour tout le monde. En deux courtes phrases tu viens de démontrer que tu n’as strictement rien compris au problème, alors en plusieurs pages, j’ai peur que tu t’enfonces encore plus.
Déjà toute personne un peu au courant sait qu’on de “développe” pas des applications de cryptographie, on utilise scrupuleusement les technologies déjà analysées par des gens plus compétents que soi. Mais oui, tu l’as dit aussi: surtout ne pas s’intéresser à la théorie, juste au résultat. Le meilleur moyen en cryptographie de faire n’importe quoi.
Et dans le genre n’importe quoi, ne me dis pas que tu es réellement intéressé ici par une source publique d’entropie pour en dériver des clés secrètes ? Vite, donne-moi les références de l’application que tu as écrite, histoire que je m’assure de ne jamais l’utiliser.
Le 18/06/2019 à 19h48
Le 19/06/2019 à 06h11
Le 19/06/2019 à 06h39
Pourquoi autant de violence ? Pourquoi prendre les gens de haut ?
Etre passionné par un sujet ne veut pas dire qu’on connait tout mieux que tout le monde et qu’on sait mieux ce qu’il faut faire ou ne pas faire et ce qu’il faut comprendre ou pas.
D’ailleurs, j’ai moi aussi du mal à comprendre pourquoi on ne peux demander à ce système de nous sortir des clé aléatoire “secrète” à la demande. Ce ne système ne peut servir du coup qu’à prouver à quelqu’un “regarde, la clé que j’ai utilisé pour ce truc est aléatoire”.
Le 19/06/2019 à 08h52
Le 19/06/2019 à 10h11
Ce mécanisme n’a pas pour but de générer à la demande un “simple” nombre aléatoire. Tout simplement parce que cela n’a aucun sens. Je vais essayer de t’expliquer pourquoi, sans m’énerver, promis…
Si tu veux un nombre aléatoire, ton système d’exploitation contient déjà une primitive pour ce faire. Elle est “cryptographically secure” et donc tu peux l’utiliser comme clé de chiffrement, tu n’as pas besoin d’une source extérieure.
Imagine maintenant que tu n’aies pas confiance en ce générateur aléatoire (et c’est une crainte parfaitement légitime !) que fais-tu ? Eh bien tu demandes à une autre source. Certes, mais comment fais-tu pour te connecter de façon sécurisée à cette autre source ?
Tu me dis “pourquoi ne pas simplement utiliser cUrl ou wGet qui font ça très bien ?”.
Hé bien tout simplement parce que ces outils vont utiliser du SSL/TLS.
Et ce SSL/TLS, pour être sécurisé, il aura besoin de quoi ?
D’un nombre aléatoire…
Et qui va lui fournir ce nombre aléatoire ?
Ben… une fonction random tournant localement, pardi !
Ha oui mais non, tu viens de dire que tu ne fais pas confiance au système local pour la génération de clés cryptographiques !
Tu es dans une impasse : pour recevoir de l’extérieur un nombre aléatoire en lequel tu as confiance, tu dois préalablement générer localement un nombre aléatoire en lequel tu as confiance. Le “simple” SSL/TLS ne suffit pas. Et je ne parle même pas de l’hérésie de transmettre 512 bits sur un canal chiffré par une clé à (au mieux) 256 bits: en pratique tu as transmis 256 bits d’entropie, pas 512…
Bref, si tu veux t’isoler totalement des menaces extérieures, tu est obligé d’utiliser un stack cryptographique dont tu as la maîtrise complète, que tu exécutes sous ton propre contrôle, et qui ne nécessite pas que tu fasses confiance à un acteur en particulier. C’est une telle solution qu’ils proposent, à base de preuves cryptographiques et de chiffrements asymétriques (partiels, ce que je dois moi-même approfondir, parce que je suis un peu largué).
Leur solution garantit entre autres que le nombre qui a été généré ne peut pas avoir été biaisé, du moment que dans les sources il y en ait au moins quelques unes qui ne sont pas corrompues (et sans même qu’il te soit nécessaire de savoir lesquelles sont corrompues et lesquelles sont saines)
Mais encore une fois, si tu n’as pas besoin de telles garanties, et que tu veux une solution simple à utiliser, tu n’as pas besoin d’une source distribuée, continue à utiliser ton générateur local, il est très bien.
Le 19/06/2019 à 11h17
Le 19/06/2019 à 12h03
Le 19/06/2019 à 13h16
Le 19/06/2019 à 14h21
Le 19/06/2019 à 17h56
Je parlais de l’implémentation de référence. L’adaptation au SSE2 ne change rien car tout se passe toujours dans des registres (excepté qu’ils sont 4 fois plus gros et qu’on traite 4 blocs simultanément).
Pour l’attaque que tu cites, ça suppose un accès physique à la machine. Et c’est beaucoup trop difficile à réaliser. Il ne faut pas oublier qu’un simple keylogger casse les meilleures cryptographies qui soient… Et bien sûr, les menaces sont également efficaces.
Le 20/06/2019 à 07h30
Sauf que … non … Tu ne peux pas affirmer que “ça ne change rien”. Les ingénieurs d’Intel aussi disaient “ça ne change rien si on exécute cette instruction sans vérifier les protections mémoire puisque le résultat sera annulé plus tard”. Et vlan ! SPECTRE et Meltdown.
C’est typique des gens qui comme toi réfléchissent en terme de fonctionnalité: la fonctionnalité est la même donc les deux implémentations sont équivalentes. Tant qu’on en reste à la partie fonctionnelle, tu as parfaitement raison. En termes de sécurité, il faut réfléchir en termes de surface d’attaque et de scénarios d’attaque, et là tout change.
C’est toute la différence entre montrer qu’une application fait tout ce qu’on lui demande de faire, et démontrer qu’elle ne fait rien de plus que ce qu’on lui demande de faire.
Ici, en utilisant des instructions SSE tu augmentes la surface d’attaque puisque tu es maintenant à la merci d’un leak au niveau des registres SSE alors que l’implémentation de référence ne l’était pas.
Imagine maintenant que le round est décomposé en deux parties distinctes, une sensible à une attaque par timing, et une autre beaucoup plus longue qui ne l’est pas. Imagine ensuite que la variabilité du timing de la partie sensible est complètement noyé dans celui global d’un round et le risque a été classé comme négligeable. Si tu optimises la partie longue, la proportion de temps passée dans la partie sensible sera plus grande, et l’attaque par timing redevient plausible.
Je ne dis pas que tu as forcément introduit ces faiblesses, mais en analyse de risque tu ne peux pas balayer ces objections d’un revers de main, tu dois démontrer que ces risques ont été pris en compte et mitigés de manière appropriée.
Le 18/06/2019 à 09h13
D’après ce que j’en ai compris, le but ici n’est pas de fournir “simplement” des sources d’entropie supplémentaires (ce n’est, en soi, pas trop compliqué). Le but est de fournir des nombres “prouvablement” aléatoires, c’est-à-dire dérivés de plusieurs sources fiables.
Le protocole est ainsi que N sources réputées fournissent chacune un nombre aléatoire, et que de ces N sources on dérive un unique nombre aléatoire final qui possède deux caractéristiques fondamentales: d’une part il est démontrable que ce résultat final utilise l’entropie combinée des N sources, et d’autre part que même si un nombre restreint de sources se liguent entre elles pour fournir des valeurs biaisées, il leur est statistiquement impossible d’influer sur le résultat final.
Le 18/06/2019 à 10h36
33A20158-2813-4F0D-9D4A-FD05E2C42E48, ton pseudo aussi a été généré aléatoirement ? " />
Le 18/06/2019 à 11h30
Pourquoi faire simple quand on peut faire compliqué ?
To retrieve and verify the latest random value using the experimental configuration, install Golang v1.11+, set your GOPATH, and execute:
go get -u github.com/dedis/drand
cd $GOPATH/src/github.com/dedis/drand
go build
./drand get public deploy/190604/group.toml
Ils auraient pas pu donner un fichier sur une adresse fixe à récupérer directement avec cURL ou Wget ?
Le 18/06/2019 à 11h37
Oui.
C’est un UUID v4 ( reconnaissable au 4 dans -4F0D- ) donc contenant 122 bits aléatoires. Pas nécessairement “vraiment” aléatoires, mais qui contiennent quand même pas mal d’entropie… Je ne sais pas exactement combien (il a été généré par la fonction “generate GUID” d’un IDE Delphi 7 tournant sous Windows XP SP 2…) mais je ne me fais pas trop de souci quant à son unicité :-)
Le 18/06/2019 à 11h40
Non, ils n’auraient pas pu faire plus simple. Le but n’est pas “bêtement” de générer une valeur aléatoire, mais bien de prouver que cette valeur est sans biais. Cette preuve ne peut être fournie qu’en donnant une implémentation du protocole, que tu peux vérifier.