Illustration of a laptop with an app open and a subscription with a shield overlaying.
Agence web » Actualités du digital » La beauté des signatures logicielles

La beauté des signatures logicielles

Imaginez que vous êtes un développeur de logiciels et que vous partagez votre logiciel ou ses mises à jour sur Internet. Comment vous assurer que personne ne falsifie votre logiciel et ne distribue cette copie falsifiée à vos clients ? La solution est une signature logicielle. Le fonctionnement de ces signatures est tout à fait intelligent et fascinant.

Qu'est-ce qu'une signature logicielle ?

Nous utilisons des signatures manuscrites pour l'auto-identification pour deux raisons : elles sont censées être vérifiables et impossibles à falsifier. Le même principe s'applique lorsque vous essayez de vous assurer que la copie d'un logiciel sur votre ordinateur est authentique et n'est modifiée d'aucune façon. Le développeur laissera une signature numérique sur le progiciel (qui ne peut être falsifiée) et les clients vérifieront cette signature dans leur copie avant d'installer le logiciel.

Cela vaut également pour les mises à jour logicielles. Une mise à jour malveillante (par exemple un logiciel malveillant déguisé en pilote) pourrait faire des ravages sur votre machine. Votre système d'exploitation (que ce soit Windows, macOS ou Linux) doit vérifier qu'une mise à jour provient de la source d'origine avant de l'installer sur le système.

Les signatures numériques sont censées effectuer les deux mêmes tâches qu’une signature manuscrite, mais leur fonctionnement réel ne pourrait pas être plus différent. Il faut des astuces de cryptographie très intelligentes pour créer et vérifier des signatures numériques.

Comment cacher un message secret à la vue de tous

Supposons que vous souhaitiez partager un secret avec un ami via des notes manuscrites. Dans ce scénario, vous devez également les laisser dans un espace public pour que votre ami puisse les récupérer plus tard. N'importe qui passant par là pourrait simplement prendre la note et lire votre secret. Voilà donc notre problème : comment s'assurer que seul votre ami peut lire le message, même si quelqu'un qui fouine met la main sur la note ?

Une manière intelligente serait d’utiliser une « clé » pour verrouiller et déverrouiller ce secret partagé. Permettez-moi de vous expliquer.

Vous et votre ami êtes d'accord sur une clé et vous utilisez cette clé pour convertir votre message secret en charabia. La clé pourrait être n'importe quoi. Par exemple, vous pourriez convenir de remplacer chaque lettre du message par la lettre située juste à côté dans l'alphabet.

Ensuite, vous prendriez votre message et remplaceriez chaque lettre en fonction de la clé. Ainsi, le message « SECRET » devient « TFDSFU ». Vous écrivez « TFDSFU » sur une note et vous la laissez dans l’espace public. Votre ami peut le décoder car il possède la clé que vous avez tous les deux échangée plus tôt. Il leur suffit donc de déplacer chaque lettre à un endroit dans « TFDSFU » et ils obtiendront le message original « SECRET ». Tous les indiscrets verraient simplement l’absurdité parce qu’ils ont d’abord besoin de la clé pour comprendre le message.

Ce que nous venons de décrire ici est une technique de cryptographie très simple et la clé qu'elle utilise est un chiffre de base de César.

Comment les ordinateurs envoient des messages secrets sur Internet

Imaginez maintenant si vous faites la même chose sur Internet et que vous souhaitez que votre communication soit totalement sécurisée. Dans le monde réel, vous pouvez vous rencontrer à l’avance et échanger des clés. On ne peut pas échanger la clé comme ça sur internet car c'est un espace public. N’importe qui pourrait récupérer cette clé et l’utiliser pour décoder le reste de votre communication. Alors, comment échanger une clé sans la partager avec son ami ?

Vous avez donc besoin d’une clé pour communiquer en toute sécurité, mais vous devez d’abord communiquer la clé en toute sécurité. C’est ainsi que deux ordinateurs s’accordent sur la même clé sans envoyer cette clé sur Internet.

Sans devenir trop technique, le chiffrement fonctionne avec des équations mathématiques faciles à résoudre dans un sens, mais incroyablement difficiles (voire impossibles) à résoudre dans le sens opposé. Donc, si un ordinateur disposait de l’équation avec tous les bons nombres qui y entrent, il pourrait la résoudre facilement. Cependant, il lui serait impossible de procéder à une ingénierie inverse de l’équation elle-même si la solution lui était donnée.

Je simplifie beaucoup ici, sinon nous serons là toute la journée. Si vous souhaitez approfondir votre fonctionnement, consultez l'échange de clés Diffie-Hellman.

Voici le scénario : il y a un ordinateur A, un ordinateur B et un espace public. Cela commence par une clé envoyée dans l'espace public (appelons-la clé publique). L'ordinateur A crée une autre clé et la garde privée (appelons-la clé privée A). L'ordinateur B fait de même.

La clé publique est accessible à tous, mais les clés privée A et privée B sont conservées en toute sécurité sur leurs ordinateurs respectifs.

L'ordinateur A prend désormais la clé publique et la combine avec sa propre clé privée pour créer une combinaison. L'ordinateur B fait de même avec sa propre clé privée. Les deux combinaisons sont différentes. Au lieu d’envoyer leurs clés privées dans l’espace public, les ordinateurs envoient ces combinaisons.

N'oubliez pas qu'il est impossible de procéder à une ingénierie inverse de ces combinaisons pour trouver la clé privée utilisée pour les créer. Et à aucun moment, les deux ordinateurs ne voient les clés privées de chacun.

Passons maintenant au véritable truc. Chaque ordinateur récupère la combinaison que l'autre a envoyée à l'espace public. Ensuite, l'ordinateur A ajoute sa clé privée à cette combinaison avec sa propre clé privée pour obtenir la clé finale. L’autre ordinateur fait de même avec sa clé privée et obtient exactement la même clé finale que celle créée par l’ordinateur A.

Désormais, les deux ordinateurs disposent de la même clé qu’ils peuvent utiliser pour crypter et déchiffrer toutes les communications futures. Voici la réponse simpliste : les deux ordinateurs « créent » leur propre copie de la clé sans réellement partager la clé elle-même.

L’ensemble de ce processus est appelé cryptographie à clé publique. Ce type de cryptographie à clé publique constitue la base des signatures numériques telles que les signatures logicielles.

Comment les développeurs cachent une signature secrète dans leur code

La signature numérique d’un logiciel implique également des clés publiques et privées. Cependant, l’intention est différente, donc le fonctionnement interne est également un peu différent. L’idée ici n’est pas d’établir une ligne de communication sécurisée. Nous voulons juste une vérification à sens unique. Le développeur du logiciel n'essaie pas de cacher le contenu du progiciel. Leur seul intérêt est de prouver l'origine du colis.

Le développeur crée donc une paire de clés privées et publiques. N'oubliez pas que ces deux clés sont différentes, mais qu'elles sont mathématiquement liées et qu'il est impossible de faire de l'ingénierie inverse entre une clé et l'autre.

Le développeur utilise sa clé privée pour chiffrer le progiciel. Cette copie cryptée ne peut être déchiffrée que par la clé publique déjà publiée sur Internet. Ainsi, lorsque vous et moi utilisons une clé publique pour déchiffrer cette copie, nous pouvons être absolument sûrs qu'elle a été envoyée par le développeur, car il ne dispose que de la clé privée qui aurait pu initialement chiffrer son progiciel.

Les hachages facilitent le travail

D'accord, alors j'ai menti un peu. Il n'est pas pratique de chiffrer des progiciels entiers, car ces fichiers peuvent devenir assez volumineux. Il existe une autre façon intelligente de résoudre ce problème grâce aux fonctions de hachage. Les fonctions de hachage sont des formules mathématiques qui créent une longueur fixe de chiffres et de lettres à partir d'un fichier de n'importe quelle taille.

Par exemple, une fonction de hachage SHA256 prendra n'importe quel fichier et générera une liste de 256 chiffres et lettres. Si ce fichier change ne serait-ce que d'un seul bit, cela créera un résultat complètement différent. Le développeur exécutera donc le progiciel via une fonction SHA256 pour générer un fichier texte. Et au lieu de chiffrer l’ensemble du package, ils chiffrent simplement ce fichier texte à l’aide d’une clé privée (comme je l’ai expliqué ci-dessus). Ils attachent le texte de hachage crypté au progiciel et nous l'envoient.

Lorsque vous et moi recevrons le progiciel, nous l'exécuterons également via SHA256 pour obtenir notre propre liste de hachage. Ensuite, nous décrypterons le message crypté joint au progiciel à l'aide de la clé publique fournie par le développeur. Si la liste de hachage déchiffrée correspond à la liste que nous avons générée de notre côté, nous pouvons être absolument certains que ce package provient du développeur et qu'il n'est pas falsifié. Toute altération du colis pendant le transport entraînera un texte de hachage complètement différent. Ces fichiers texte sont appelés sommes de contrôle.

En un mot, c'est exactement ce qu'est une signature logicielle : le hachage crypté et la clé publique. Une signature numérique fonctionne car elle est infalsifiable (la clé privée s'en assure) et vérifiable (la clé publique associée peut déchiffrer le message).

Qui surveille les observateurs ?

Si vous avez prêté attention, vous avez peut-être remarqué qu'il existe encore une faille dans ce système que nous n'avons pas encore corrigée.

Que se passe-t-il si quelqu'un prend une copie du progiciel, le manipule, crée une nouvelle somme de contrôle et utilise une nouvelle paire de clés pour le chiffrer ? Cet acteur menaçant pourrait diffuser la clé publique associée ou nous l’envoyer directement. Nous décrypterions la signature falsifiée en utilisant la clé publique en pensant que les hachages correspondent donc qu'elle doit provenir de l'auteur original. Mais la clé publique que nous avons utilisée provenait d’un imposteur.

C'est là qu'interviennent les autorités de certification. Une organisation de confiance comme celle-ci examine les développeurs et leur décerne des certificats numériques liés à leurs clés publiques. Il signe le certificat de manière cryptographique, tout comme le développeur le fait pour nous, et une autorité de certification encore plus élevée se porte garante de la signature de cette organisation. Ce sont les organismes de certification jusqu'au bout.

Ces certificats sont juridiquement contraignants et nous pouvons les vérifier de notre côté pour être absolument sûrs que nous avons obtenu les bonnes clés publiques.


Tout cela se produit automatiquement en arrière-plan car l'ordinateur se charge du hachage, du cryptage et de la vérification. Nous voyons simplement une boîte de dialogue nous demandant la permission d'installer l'application ou la mise à jour. Si une application n'est pas signée, le système d'exploitation nous avertira avant de l'installer.

★★★★★