David Madore's WebLog: Nouvelle clé PGP (0xBE8D3426C06FFAE6)

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]

↓Entry #2749 [older| permalink|newer] / ↓Entrée #2749 [précédente| permalien|suivante] ↓

(mardi)

Nouvelle clé PGP (0xBE8D3426C06FFAE6)

Cette entrée est de nature essentiellement technique, pour annoncer que je me suis généré une nouvelle clé PGP. Mais j'en profite quand même pour expliquer au grand public de quoi il s'agit sous forme de vulgarisation rapide concernant la cryptographie à clé publique :

Explications sommaires pour les gens ne connaissant rien à la crypto :

PGP (Pretty Good Privacy) est son implémentation GPG (GNU Privacy Guard) est un standard de cryptographie à clé publique (ou asymétrique).

De quoi s'agit-il ? La forme la plus simple de la cryptographie est la cryptographie symétrique (=à clé secrète partagée). En cryptographie symétrique, si Alice veut envoyer un message secret à Bob, Alice et Bob doivent partager une clé secrète et connue d'eux seuls, servant à la fois au chiffrement et au déchiffrement.

(Cette clé prend la forme d'une assez longue chaîne binaire, typiquement quelque chose comme 256 bits, ou, ce qui revient au même, 64 chiffres hexadécimaux, c'est-à-dire quelque chose comme e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, qui doit impérativement avoir été tirée aléatoirement (ou pseudo-aléatoirement de façon cryptographiquement correcte) pour que la sécurité soit correcte — ce n'est pas du tout le cas de celle que je viens de donner —, et c'est elle qui est fournie aux algorithmes de chiffrement et de déchiffrement qui font le travail proprement dit. En fait, normalement l'utilisateur ne la voit jamais vraiment, Alice et Bob vont typiquement avoir uniquement affaire à une passphrase servant à générer ou à déverrouiller la clé selon les circonstances, et qui, elle, est quelque chose de mémorisable par un humain, comme un mot de passe assez long ou une suite de mots formant une phrase suffisamment longue pour assurer le niveau de sécurité voulu. Peu importent ces détails, ce que je cherche avant tout à dire est qu'en cryptographie symétrique, le secret — passphrase ou clé — doit être partagé à l'avance par les personnes qui souhaitent communiquer.)

Au contraire, en cryptographe à clé publique, Bob a deux clés, une clé publique connue de « tout le monde » et une clé privée ou secrète connue de lui seul. Si Alice veut envoyer un message chiffré à Bob, elle le chiffre avec la clé publique de Bob, ce qui produit un message que Bob seul est capable de déchiffrer avec sa clé privée. Et inversement, la cryptographie à clé publique permet aussi de faire de la signature, c'est-à-dire qu'Alice peut, en utilisant sa clé privée, produire un message n'ayant rien de secret dont tout le monde pourra vérifier, au moyen de la clé publique d'Alice, qu'elle en est bien l'émettrice. (Et bien sûr on peut combiner les deux : Alice peut envoyer à Bob un message chiffré par la clé publique de Bob et signé par la clé privée d'Alice, dont Bob pourra, avec sa clé privée à lui et la clé publique d'Alice, lire le contenu et vérifier que c'est bien Alice l'expéditrice.)

(Bon, tout ça est immensément simplifié et outre qu'il existe toutes sortes d'algorithmes différents, je passe énormément de subtilités sous silence. Je n'ai notamment pas expliqué que, pour des raisons essentiellement d'efficacité, la cryptographie à clé publique est utilisée pour chiffrer non pas le message lui-même mais une clé de session qui est elle-même utilisée pour chiffrer le message avec un algorithme de cryptographie symétrique ; et pareil, en signature, on ne signe pas le message lui-même mais une empreinte calculée par une fonction de hachage. J'aurais aussi peut-être dû mentionner le petit miracle de la cryptographe à clé publique qu'est le protocole de Diffie-Hellman qui permet à Alice et Bob de communiquer de façon sécurisée même sans partager de clé à l'avance et même si toutes leurs communications sont espionnées par une tierce personne malveillante ! et ce, sous la seule hypothèse que cette personne (Ève) ne peut qu'écouter et pas modifier les communications au passage, et pas, notamment, se faire passer pour Alice auprès de Bob et pour Bob auprès d'Alice. Je devrais peut-être au moins dire que la cryptographie à clé publique sert absolument partout : dès que vous vous connectez à un site web en https, c'est-à-dire l'immense majorité des sites web de nos jours, celui-ci faisant de la résistance, la connexion est sécurisée par de la cryptographie à clé publique — mais sous un standard qui diffère de PGP dont je parle dans ce billet — essentiellement au moyen d'une clé publique du site web contacté, et qui est elle-même signée par des autorités censément de confiance sous forme d'un certificat ; mais là non plus, je ne veux certainement pas entrer dans les détails.)

L'avantage immense de la cryptographie à clé publique par rapport à la cryptographe symétrique est qu'on simplifie immensément le problème de la distribution des clés : on n'a pas besoin de créer, et de trouver comment partager de façon sûre, une clé secrète différente pour chaque paire de participants qui peut avoir envie de communiquer (une pour Alice et Bob, une pour Alice et Charlie, une pour Alice et David, une pour Bob et Charlie, une pour, etc.), mais seulement deux clés par participants, dont l'une n'a pas besoin d'être communiquée du tout (elle est privée et reste secrète) et l'autre n'a pas besoin d'être communiquée de façon secrète puisqu'elle est, justement, publique. Évidemment, il y a un prix à payer, notamment en termes de longueur des clés, de coût computationnel des opérations, mais je ne rentre pas là-dedans ; par contre il y a une question cruciale qui reste en suspens, c'est la question de l'identité (ou plutôt, de la confiance en l'identité) :

Si Alice veut envoyer un message secret à Bob (ou reçoit un message signé par Bob), elle va utiliser la clé publique de Bob, mais comment est-elle sûre que la clé publique qu'elle croit être celle de Bob est vraiment celle de Bob ?

Par exemple, si Bob est l'auteur d'un logiciel très célèbre (pensez, par exemple, au noyau Linux), et qu'Alice veut utiliser ce logiciel et être sûre qu'il s'agit bien du bon logiciel et pas d'une version malicieuse écrite par une personne malveillante se faisant passer pour Bob, il est utile que Bob signe le logiciel au moment de le mettre en ligne, et Alice pourra vérifier la signature et avoir confiance dans ce qu'elle utilise. Mais qu'est-ce qui assure que la signature vient bien de Bob et pas d'une personne malicieuse ? Il faut avoir confiance en la clé servant à la signature. Or ceci ne fait que repousser le problème (à ceci près qu'une clé est quelque chose de plus léger à contrôler, et change moins souvent, qu'un logiciel énorme dont il y a une nouvelle version tous les quelques jours).

Évidemment, si Alice a rencontré Bob en personne et que Bob lui a donné cette clé en main propre, Alice peut être sûre que c'est la bonne clé. Mais si Alice reçoit un mail de Bob, ou voit passer un billet sur le blog de Bob qui dit coucou, je suis Bob et ceci est ma clé publique, comment peut-elle avoir confiance dans le fait que ce message est bien de Bob et pas de quelqu'un qui cherche à se faire passer pour Bob (dans le but de signer des documents en son nom ou de recevoir des messages chiffrés à son intention) ? La signature électronique est justement l'outil qui permet d'authentifier ce genre de messages, mais pour identifier un message censé émaner de Bob qui dit ceci est ma clé publique, il faut la clé publique de Bob, donc le problème est circulaire.

Une façon de résoudre ce problème de l'identité est que Bob accompagne sa clé publique d'une ou plusieurs signatures, réalisées avec des clés publiques de personnes tierces, qui, elles, ont vérifié soigneusement l'identité de Bob et de sa clé, et qui affirment cette clé précise est bien celle de la personne appelée Bob (bon, ceci soulève ensuite la question sociale de savoir ce que cela signifie de vérifier soigneusement l'identité de quelqu'un, et d'ailleurs ce qu'est l'identité, mais évitons d'entrer dans des questions philosophiques à ce stade). Par exemple, si Alice a confiance dans l'identité de la clé publique de Charlie et en l'honnêteté de Charlie, et que Charlie a vérifié soigneusement la clé publique de Bob et publié une signature l'associant à l'identité de Bob, Alice peut faire confiance à cette signature de Charlie pour savoir que Bob est vraiment Bob. Mais évidemment il faut des hypothèses fausses, car après tout un faux Bob aurait pu faire signer sa fausse clé par un faux Charlie, donc la signature n'a de valeur que si Alice a confiance en l'identité et l'honnêteté de Charlie. Il existe ensuite différents modèles (la toile de confiance proposée par PGP ou, au contraire, la chaîne depuis une racine de confiance utilisée dans le HTTPS sur le web) pour essayer d'établir la confiance en l'identité à partir de telles signatures.

En pratique, le logiciel (libre) GPG, dont je vais dire du mal plus bas mais qui reste utile, permet à tout un chacun de se créer une paire de clés (publique+privée), de chiffrer un document avec la clé privée d'un autre, de vérifier des signatures y compris des signatures attestant l'identité du propriétaire d'une clé, et ce genre de choses. Le maniement en est néanmoins malcommode et, pour ce qui est de la confiance en l'identité, on doit en pratique de toute façon faire à un moment ou un autre un acte de foi plus ou moins large selon le compromis qu'on considère acceptable entre la sécurité et la commodité.

Le but de cette entrée est, donc, d'annoncer une nouvelle clé publique me concernant (signée, inter alia, par l'ancienne), de donner quelques raisons de penser qu'elle est bien de moi, et accessoirement de râler parce que montrer que je sais râler si bien est certainement une façon d'assurer mon identité.

Ma clé précédente (0x0D9364260B2790DE) avait été créée le , et sa taille (clé DSA de 1024 bits + clé ElGamal de 1536 bits) ne permet plus de la considérer comme vraiment sûre, et ça fait longtemps que je me disais qu'il fallait en générer une nouvelle ; ce qui me bloquait surtout était l'aspect pénible de ré-apprendre comment on génère une clé PGP et donc relire la documentation de GnuPG qui est, disons-le franchement, une abomination, et enfin, de convaincre des gens de signer la nouvelle clé. Bref, je me suis sorti les doigts du c●l, et j'ai généré une nouvelle clé (RSA de 3584 bits, cette fois, parce que j'aime bien faire mon original). La nouvelle clé a pour empreinte 6AD5 2959 519B FFC6 FCDE A8A5 BE8D 3426 C06F FAE6 (rappelons qu'on désigne une clé par la fin de son empreinte, donc 0xBE8D3426C06FFAE6 ou même 0xC06FFAE6, quand il n'y a pas de risque d'attaque par confusion de l'ID, mais l'empreinte complète l'identifie de façon sûre), mais évidemment il ne faut pas faire confiance à un simple post de blog pour croire que cette empreinte est bien celle d'une clé appartenant à David Madore, sauf si vous ne me connaissez que par ce blog. J'ai mis ici une version de la nouvelle clé signée à la fois par l'ancienne clé et par deux amis qui me connaissent personnellement (mais bon, si vous n'avez pas de raison de faire confiance en leurs clés, ça vous fait une belle jambe aussi) ; et le fait que j'aie annoncé l'empreinte sur Twitter peut aussi aider très légèrement à augmenter la confiance dans le fait qu'il s'agit bien de la bonne personne. Mais si vous me connaissez personnellement, n'hésitez pas à me demander, soit en personne, soit par un canal de communication séparé (par exemple par SMS, en accompagnant votre SMS d'une question dont vous pensez que je serais seul à avoir la réponse) de confirmer l'exactitude de cette empreinte, j'apprécierais d'avoir des versions signées de ma clé en retour.

Mon ancienne clé n'est pas révoquée, je n'ai pas de raison de penser qu'elle aurait été compromise et j'ai toujours la clé privée associée, donc je n'ai pas l'intention de la révoquer dans l'immédiat, elle demeure valable.

Maintenant que j'ai fait l'annonce principale, quelques râleries.

La première concerne la taille des clés. J'ai beau avoir des contacts avec la communauté crypto, je n'ai pas une bonne mémoire pour le niveau de sécurité estimé, et certainement pas le niveau estimé en 2023, des tailles de clé pour différents algorithmes, et la correspondance entre elles. Je ne sais donc pas bien évaluer, par exemple, à quel point une clé DSA de 1024 bits (ma vieille) est déjà cassée, juste menacée ou vaguement considérée comme insuffisante. Je m'attendais à trouver un article Wikipédia, ou une autre page quelque part en ligne, récapitulant les records déjà réalisés et les estimations de complexité future, pour attaquer différentes longueurs de clé pour des algorithmes standards (RSA, DSA [sur groupe multiplicatif], ECDSA [=DSA sur courbe elliptique], ElGamal, tout ça comparé à des longueurs de clés symétriques) : or je ne trouve rien de tel. Donc, première râlerie, quelqu'un voudrait-il bien faire l'effort d'écrire une page synthétique claire à ce sujet ?

La seconde concerne l'utilisation de GPG. L'interface de ce programme est juste épouvantable. La syntaxe en ligne de commande est baroque et incohérente. Il mélange des fonctions de haut niveau (souvent interactives, demandant confirmation à l'utilisateur) et des fonctions de bas niveau sans séparation claire, même sans indiquer clairement ce qu'il faut considérer comme quoi : certaines fonctions demanderont confirmation, d'autres non, certaines demanderont une précision de façon interactive, d'autres non, et on ne sait vraiment pas à l'avance ce qui va faire quoi. (Par exemple, quand on édite une clé avec la fonction --edit-key, on ne sait pas trop si la commande delsig pour effacer des signatures prend un paramètre ou si elle le demandera après, on ne sait pas s'il y aura confirmation avant l'effacement, on ne sait pas trop si on pourra quitter sans sauver si on a fait une erreur, etc.) Le sens des primitives est mal expliqué aux utilisateurs : par exemple, les signatures de confiance produites avec tsign prennent des paramètres très importants dont le sens n'est absolument pas expliqué dans le manuel alors même qu'il n'est pas évident du tout, ni d'ailleurs la différence entre tsign et sign (il est juste dit de lire la RFC 4880, ce qui est un peu se moquer du monde, surtout qu'elle-même n'explique pas vraiment les choses).

Ma troisième râlerie concerne la toile de confiance (web of trust). La dernière fois que j'avais regardé PGP un peu de près, c'est-à-dire il y a presque un quart de siècle (ouch) quand j'ai généré ma clé précédente, la manière standard de diffuser les signatures sur une clé (i.e., les gens qui ont signé ma clé pour attester que c'est bien celle de David Madore) était de les mettre sur un serveur de clés : le principe étant donc, si je récupère la clé 0x0D9364260B2790DE auprès d'un serveur de clé, je récupère aussi les signatures des gens qui attestent que c'est bien celle de David Madore (et si par hasard je connais une de ces personnes, au sens où j'ai déjà vérifié sa clé, ça me permet d'avoir confiance en celle que je viens de récupérer ; sinon, je peux aller chercher un cran plus loin en récupérant sur le serveur les clés des gens les plus susceptibles d'être proches de mon cercle d'amis). Mais il semble que des attaquants (spammeurs ? je ne suis pas sûr de leur motivation) se soient amusés à envoyer sur le serveur des millions de signatures bidon (enfin, les signatures sont bonnes sinon elles ne seraient pas acceptées, mais elles proviennent de clés qui ne sont pas vraiment celles d'humains bien identifiés, ou quelque chose du genre), et pour éviter ce problème, les serveurs de clé n'ont pas trouvé mieux que de… cesser de distribuer les signatures des clés. (Il y avait pourtant plein d'autres façons de faire, par exemple demander de contresigner les signatures — c'est-à-dire attester que la signature est pertinente et souhaitée par la clé qui a été signée — ou bien proposer une forme de login associé à la clé et n'accepter que les signatures uploadées par la personne qui a uploadé la clé.) Toujours est-il que, du coup, il n'y a essentiellement plus aucun moyen de chercher à retrouver une chaîne de confiance de longueur non-triviale menant à une clé : je peux certes publier moi-même ma clé avec les signatures qu'on aura bien voulu m'en faire, mais la personne qui voudrait vérifier l'identité des signataires n'a essentiellement aucune façon de s'y prendre. C'est rare en informatique qu'il y ait une régression aussi forte de fonctionnalité en quelques décennies, et apparemment rien pour compenser.

Bref, c'est un peu triste : on a des outils théoriques qui sont très bien, la cryptographie à clé publique est un concept extraordinaire, mais dans la pratique il n'est essentiellement pas mis en œuvre dans le monde réel d'une manière qui pourrait servir aux vrais gens : d'un côté on a l'espèce de merde supposée « sécuriser » le Web, c'est-à-dire le HTTPS, qui en vrai n'apporte aucune sorte de garantie de confiance parce que les autorités censées être à la racine de la confiance sont de purs parrains mafieux qui ne vérifient rien et se contentent de prendre du fric aux gens pour afficher https dans les navigateurs (les détails de mes récriminations sont ici), et de l'autre on a un truc qui était basé sur des principes un peu plus sains, PGP, dont le fonctionnement est arcane et qui a été privé du moyen pratique de permettre de vérifier cette confiance.

↑Entry #2749 [older| permalink|newer] / ↑Entrée #2749 [précédente| permalien|suivante] ↑

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]