{"id":3103,"date":"2019-09-10T14:18:59","date_gmt":"2019-09-10T12:18:59","guid":{"rendered":"https:\/\/blog.alwaysdata.com\/?p=3103"},"modified":"2020-02-11T15:14:46","modified_gmt":"2020-02-11T14:14:46","slug":"la-crypto-de-zero","status":"publish","type":"post","link":"https:\/\/blog.alwaysdata.com\/fr\/2019\/09\/10\/la-crypto-de-zero\/","title":{"rendered":"La Crypto de&nbsp;Z\u00e9ro"},"content":{"rendered":"<p>Quel que soit le produit que vous d\u00e9veloppez, qu\u2019il soit <em>open source<\/em> ou propri\u00e9taire, vous en \u00eates rarement l\u2019utilisateur\u00b7trice principal\u00b7e. Vous construisez des outils et des applications pour les autres. Et ces utilisateur\u00b7trice\u00b7s produisent beaucoup de donn\u00e9es. Des donn\u00e9es souvent sensibles. Les r\u00e9cents scandales impliquant les acteurs du <em>Big Data<\/em> nous montrent encore \u00e0&nbsp;quel point celles et ceux qui se servent de nos produits ne savent pas comment se prot\u00e9ger.<\/p>\n<p>Pour pr\u00e9server les donn\u00e9es qui nous sont confi\u00e9es, nous n\u2019avons pas d\u2019autre choix que de nous appuyer sur des politiques de chiffrement. <a href=\"https:\/\/www.whatsapp.com\/security\/\">Whatsapp<\/a>, <a href=\"https:\/\/www.signal.org\/\">Signal<\/a>, <a href=\"https:\/\/keybase.io\/\">Keybase<\/a>, <a href=\"https:\/\/nextcloud.com\/endtoend\/\">Nextcloud E2E module<\/a>\u2026 tous ces outils utilisent de la cryptographie, de fa\u00e7on plus ou moins transparente, nativement, au c\u0153ur de leur&nbsp;code.<\/p>\n<p>Nous donnons de plus en plus souvent des conf\u00e9rences sur la s\u00e9curit\u00e9 informatique et le chiffrement dans le cadre de notre programme de <a href=\"https:\/\/www.alwaysdata.com\/fr\/open-source\/\">Relations D\u00e9veloppeur\u00b7euse\u00b7s<\/a>. Il nous a&nbsp;sembl\u00e9 important d\u2019en parler ici aussi, pour ne pas limiter la diffusion des savoirs uniquement au cercle, parfois restreint, des publics de conf\u00e9rences. Voici donc une introduction \u00e0&nbsp;la <em>cryptographie de z\u00e9ro<\/em>.<\/p>\n<figure class=\"embed-media__giphy\" style=\"width:65%; padding-bottom:calc(65% * (480 + 12) \/ (480 + 12))\">\n    <video id=\"giphy-${token}\" autoplay loop muted playsinline>\n        <source src=\"https:\/\/media.giphy.com\/media\/5bxBsk0qT5cjK\/giphy.mp4\" type=\"video\/mp4\">\n        <img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/5bxBsk0qT5cjK\/giphy.gif\" alt=\" @Giphy\">\n    <\/video>\n<\/figure>\n<hr>\n<h2>Vous avez dit \u00ab&nbsp;chiffrement&nbsp;\u00bb&nbsp;?<\/h2>\n<p>Commen\u00e7ons par un rappel simple&nbsp;: le chiffrement n\u2019est rien d\u2019autre que l\u2019obfuscation d\u2019un contenu. Cela signifie qu\u2019un contenu chiffr\u00e9 devient illisible pour qui n\u2019en poss\u00e8de pas la clef. Certains algorithmes ne fonctionnent que dans une direction&nbsp;: le contenu chiffr\u00e9 ne pourra pas revenir \u00e0&nbsp;son \u00e9tat d\u2019origine. Ce sont les algorithmes de sommes de contr\u00f4le, utilis\u00e9s uniquement \u00e0&nbsp;des fins de v\u00e9rification, pour garantir que les contenus n\u2019ont pas \u00e9t\u00e9 alt\u00e9r\u00e9s. D\u2019autres algorithmes vont produire des contenus pouvant \u00eatre d\u00e9chiffr\u00e9s, et sont utilis\u00e9s pour garantir la s\u00e9curit\u00e9 des donn\u00e9es lors de leur transfert, ou de leur stockage.<\/p>\n<p>Tous s\u2019appuient sur un \u00e9l\u00e9ment commun&nbsp;: la clef. Sans elle, pas de d\u00e9chiffrement ou de contr\u00f4le fiable du contenu, quel que soit la technique de chiffrement. Il s\u2019agit de la partie la plus critique dans toute action cryptographique. La clef doit \u00eatre gard\u00e9e secr\u00e8te, et doit \u00eatre suffisamment robuste pour r\u00e9sister \u00e0&nbsp;une attaque par force&nbsp;brute.<\/p>\n<p>Les techniques de chiffrement des donn\u00e9es num\u00e9riques apportent une capacit\u00e9 \u00e0&nbsp;r\u00e9aliser des op\u00e9rations complexes, qui ne pourraient pas \u00eatre r\u00e9alis\u00e9es manuellement. Elles garantissent la protection des contenus. Les algorithmes de chiffrement s\u2019appuient sur des probl\u00e8mes math\u00e9matiques complexes<span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_1');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_1');\"><sup id=\"footnote_plugin_tooltip_3103_1_1\" class=\"footnote_plugin_tooltip_text\">1)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_1\" class=\"footnote_tooltip\"><\/span><\/span> pour forger des clefs r\u00e9sistantes, et (d\u00e9)chiffrer les donn\u00e9es.<\/p>\n<h3>Bien, comment \u00e7a fonctionne&nbsp;?<\/h3>\n<p><em>Cette partie contient des explications th\u00e9oriques simples sur le fonctionnement des algorithmes de chiffrement. N\u2019h\u00e9sitez pas \u00e0&nbsp;passer \u00e0&nbsp;la section suivante si seule la mise en \u0153uvre vous int\u00e9resse&nbsp;:)<\/em><\/p>\n<p>L\u2019objectif d\u2019un chiffrement est de rendre son contenu inaccessible aux yeux ind\u00e9sirables. Depuis les d\u00e9buts de l\u2019histoire du chiffrement, la technique n\u2019a pas chang\u00e9&nbsp;: il s\u2019agit de substituer du contenu. Vous vous y&nbsp;\u00eates probablement d\u00e9j\u00e0 essay\u00e9, en jouant avec une roue de chiffrement offerte dans <em>Pif Gadget<\/em><span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_2');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_2');\"><sup id=\"footnote_plugin_tooltip_3103_1_2\" class=\"footnote_plugin_tooltip_text\">2)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_2\" class=\"footnote_tooltip\"><\/span><\/span>.<\/p>\n<figure class=\"embed-media__giphy\" style=\"width:65%; padding-bottom:calc(65% * (299 + 12) \/ (299 + 12))\">\n    <video id=\"giphy-${token}\" autoplay loop muted playsinline>\n        <source src=\"https:\/\/media.giphy.com\/media\/455jgiG1HYdQ4\/giphy.mp4\" type=\"video\/mp4\">\n        <img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/455jgiG1HYdQ4\/giphy.gif\" alt=\" @Giphy\">\n    <\/video>\n<\/figure>\n<p>Sur cette roue, si nous effectuons une rotation de trois points,<code>A<\/code> devient <code>D<\/code>, <code>B<\/code> devient <code>E<\/code>, et ainsi de suite. Le texte <code>Hello World!<\/code> devient alors <code>KHOOR ZRUOG!<\/code>.<\/p>\n<p>Les algorithmes de chiffrement modernes agissent de la m\u00eame fa\u00e7on, en plus complexe toutefois. Ils appliquent une s\u00e9rie de substitution en cascade, en rempla\u00e7ant non plus des caract\u00e8res, mais des blocs de donn\u00e9es<span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_3');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_3');\"><sup id=\"footnote_plugin_tooltip_3103_1_3\" class=\"footnote_plugin_tooltip_text\">3)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_3\" class=\"footnote_tooltip\"><\/span><\/span> pour rendre les contenus chiffr\u00e9s plus complexes \u00e0&nbsp;casser par r\u00e9tro-ing\u00e9nierie.<\/p>\n<p>Ces algorithmes n\u00e9cessitent cependant d\u2019\u00eatre initialis\u00e9s dans un \u00e9tat donn\u00e9. De cette fa\u00e7on, les risques de r\u00e9p\u00e9tition dans les motifs de substitution sont moins importants en cas d\u2019attaques sur de grandes quantit\u00e9s de donn\u00e9es ayant \u00e9t\u00e9 chiffr\u00e9es selon le m\u00eame proc\u00e9d\u00e9. Ce <em>vecteur d\u2019initialisation<\/em> (<abbr title=\"Initialization Vector\">IV<\/abbr>) se doit donc d\u2019\u00eatre unique. Il assure qu\u2019une m\u00eame op\u00e9ration de chiffrement ne donnera pas deux fois le m\u00eame r\u00e9sultat sur un jeu de donn\u00e9es identique. Mais pour s\u2019assurer de ce caract\u00e8re unique, il nous faut des sources al\u00e9atoires fiables.<\/p>\n<p>Or nos ordinateurs ne sont pas r\u00e9ellement impr\u00e9visibles&nbsp;: leur design interne les pousse \u00e0&nbsp;reproduire des motifs pr\u00e9cis au fil du temps. Pour \u00e9viter de tomber dans ce pi\u00e8ge, les cryptographes ont cr\u00e9\u00e9 des m\u00e9thodes pour g\u00e9n\u00e9rer des nombres al\u00e9atoires suffisamment robustes au sens cryptographique du terme. Ces fonctions sont des <em>g\u00e9n\u00e9rateurs de nombre pseudo al\u00e9atoires cryptographiquement purs<\/em> (<abbr title=\"Cryptographically secure pseudorandom number generator\">CSPRNG<\/abbr>).<\/p>\n<p>Comme vous pouvez le constater, les principes sont simples depuis le d\u00e9but (substituer des \u00e9l\u00e9ments) mais leur mise en \u0153uvre est loin d\u2019\u00eatre facile. C\u2019est la raison pour laquelle nous n\u2019effectuons jamais d\u2019op\u00e9ration cryptographique \u00ab&nbsp;\u00e0&nbsp;la main&nbsp;\u00bb. Nous nous appuyons sur des biblioth\u00e8ques de chiffrement, d\u00e9velopp\u00e9es et v\u00e9rifi\u00e9es par des cryptographes.<\/p>\n<h3>Tu sais garder un secret&nbsp;?<\/h3>\n<p>Comme nous l\u2019avons dit, la clef est l\u2019\u00e9l\u00e9ment le plus critique de la couche de cryptographie. Pour garantir la s\u00e9curit\u00e9 de vos donn\u00e9es, vous devez prot\u00e9ger cette clef. Dans la famille des algorithmes de chiffrement \/ d\u00e9chiffrement, il existe deux grandes cat\u00e9gories selon la fa\u00e7ons dont les clefs sont g\u00e9r\u00e9es.<\/p>\n<p>La premi\u00e8re cat\u00e9gorie est celle des algorithmes \u00e0&nbsp;<strong>clef sym\u00e9trique<\/strong>, comme <em>AES<\/em> ou <em>IDEA<\/em>. Ils utilisent la m\u00eame clef pour r\u00e9aliser \u00e0&nbsp;la fois les op\u00e9rations de chiffrement et de d\u00e9chiffrement. Ils sont rapides, et peuvent agir sur de gros volumes de donn\u00e9es avec un co\u00fbt de performance raisonnable. Mais vous devrez transmettre \u00e0&nbsp;la fois le contenu chiffr\u00e9 <strong>et<\/strong> la clef pour permettre \u00e0&nbsp;une tierce personne d\u2019acc\u00e9der au contenu. Si votre clef est intercept\u00e9e durant le transfert, votre contenu n\u2019est plus prot\u00e9g\u00e9.<\/p>\n<p>L\u2019autre cat\u00e9gorie est celle des algorithmes \u00e0&nbsp;<strong>clef publique<\/strong>, ou <strong>asym\u00e9triques<\/strong>, comme <em>RSA<\/em>. Ils fonctionnent avec des paires de clefs. L\u2019une est <em>publique<\/em>&nbsp;: elle va servir \u00e0&nbsp;chiffrer les donn\u00e9es que vous souhaitez transmettre \u00e0&nbsp;son propri\u00e9taire. La seconde est <em>priv\u00e9e<\/em>, et ne servira qu\u2019\u00e0 votre destinataire pour d\u00e9chiffrer le contenu. Seul le propri\u00e9taire d\u2019une clef priv\u00e9e peut donc revenir \u00e0&nbsp;la donn\u00e9e initiale<span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_4');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_4');\"><sup id=\"footnote_plugin_tooltip_3103_1_4\" class=\"footnote_plugin_tooltip_text\">4)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_4\" class=\"footnote_tooltip\"><\/span><\/span>. En revanche n\u2019importe qui (propri\u00e9taire inclus) peut envoyer du contenu chiffr\u00e9 \u00e0&nbsp;destination de cette clef priv\u00e9e, en utilisant la clef publique qui lui est associ\u00e9e. De telles op\u00e9rations ne sont possibles qu\u2019en s\u2019appuyant sur des \u00e9nigmes math\u00e9matiques complexes, ce qui les rend particuli\u00e8rement longues \u00e0&nbsp;r\u00e9aliser&nbsp;: elles s\u2019accommodent mal de gros volumes de donn\u00e9es.<\/p>\n<p>Pour faciliter les choses, et avoir le meilleur des deux mondes, nous avons souvent recours \u00e0&nbsp;l\u2019encapsulation de clefs (<em>key wrapping<\/em>). Nous g\u00e9n\u00e9rons un <abbr title=\"Cryptographically secure pseudorandom number generator\">CSPRNG<\/abbr> qui va servir de clef unique pour chiffrer nos donn\u00e9es de fa\u00e7on sym\u00e9trique. Puis nous allons chiffrer cette clef unique avec la clef publique de notre destinataire. Cette op\u00e9ration est rapide, parce qu\u2019une clef, m\u00eame robuste, reste une donn\u00e9e relativement petite, et son chiffrement ne n\u00e9cessitera pas trop d\u2019efforts. Nous empaquetons alors les deux \u00e9l\u00e9ments\u200a\u2014\u200ala clef unique chiffr\u00e9e, et le contenu chiffr\u00e9\u200a\u2014\u200aet nous envoyons ou stockons le&nbsp;tout.<\/p>\n<h2>3\u2026 2\u2026 1\u2026 D\u00e9collage&nbsp;!<\/h2>\n<p>Encore une fois, vous ne devez pas chercher \u00e0&nbsp;r\u00e9aliser vos op\u00e9rations de chiffrement \u00e0&nbsp;la main, ou en inventant vos propres algorithmes. Les cryptographes travaillent ensemble depuis des ann\u00e9es pour constituer un socle commun robuste et approuv\u00e9. Les biblioth\u00e8ques d\u2019abstraction r\u00e9centes permettent de les utiliser facilement, ne nous en privons pas&nbsp;!<\/p>\n<h3>Le chiffrement pour tou\u00b7te\u00b7s&nbsp;: <em>libsodium<\/em>, la biblitoh\u00e8que multi-plateforme<\/h3>\n<p>Tous les langages de d\u00e9veloppement ont leur(s) propre(s) biblioth\u00e8que(s) de cryptographie. Les utiliser en revanche rel\u00e8ve parfois du d\u00e9fi. Elles n\u00e9cessitent souvent un gros bagage de connaissances en cryptographie th\u00e9orique, pour choisir les bons algorithmes et leurs bons param\u00e8tres. Et il est parfois difficile de savoir quoi utiliser, et \u00e0&nbsp;quel moment.<\/p>\n<p>Mais ces outils provoquent un autre effet&nbsp;: ils n\u00e9cessitent que pour chaque langage, une \u00e9quipe de cryptographes les maintienne, les teste, les s\u00e9curise. C\u2019est une situation qui est difficilement tenable sur la dur\u00e9e, et qui peut provoquer l\u2019apparition de failles dans les impl\u00e9mentations.<\/p>\n<p>Une r\u00e9ponse au probl\u00e8me serait de mutualiser les efforts de d\u00e9veloppement sur une biblioth\u00e8que d\u00e9di\u00e9e et agnostique de la plateforme et du langage. C\u2019est exactement le projet <a href=\"https:\/\/download.libsodium.org\/doc\/\">libsodium<\/a>&nbsp;! Il se concentre sur l\u2019utilisabilit\u00e9 au service des d\u00e9veloppeur\u00b7euse\u00b7s, en offrant une excellente abstraction. Il offre une r\u00e9ponse \u00e9l\u00e9gante \u00e0&nbsp;la probl\u00e9matique du choix en pr\u00e9s\u00e9lectionnant les bons algorithmes. Vous pouvez l\u2019utiliser directement dans votre projet ou vous appuyer sur ses librairies tierces de pontage (<em>bindings<\/em>) pour l\u2019interfacer avec votre langage favori&nbsp;!<\/p>\n<h4>Python<\/h4>\n<p>Pour g\u00e9n\u00e9rer un <abbr title=\"Cryptographically secure pseudorandom number generator\">CSPRNG<\/abbr>, vous devriez plut\u00f4t vous appuyer sur la lib <a href=\"https:\/\/docs.python.org\/3\/library\/secrets.html#module-secrets\">secrets<\/a> qui offre une g\u00e9n\u00e9ration plus robuste que le traditionnel <code>os.random()<\/code>.<\/p>\n<pre class=\"python\"><code>import secrets\n\nsecretsGenerator = secrets.SystemRandom()\nrandomNumber = secretsGenerator.randbelow(50)<\/code><\/pre>\n<p>Pour chiffrer \/ d\u00e9chiffrer les contenus, le paquet <a href=\"https:\/\/pynacl.readthedocs.io\/en\/stable\/\">PyNaCl<\/a> est un excellent choix&nbsp;:<\/p>\n<pre class=\"python\"><code>import nacl.secret\nimport nacl.utils\n\nkey = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)\nnonce = nacl.utils.random(nacl.secret.SecretBox.NONCE_SIZE)\n\nsecret_box = nacl.secret.SecretBox(key)\nencrypted = box.encrypt(data, nonce)<\/code><\/pre>\n<h4>Ruby<\/h4>\n<p>Utilisez <a href=\"https:\/\/github.com\/crypto-rb\/rbnacl\">RbNaCl<\/a> pour exploiter la biblioth\u00e8que <a href=\"https:\/\/download.libsodium.org\/doc\/\">libsodium<\/a> avec&nbsp;Ruby&nbsp;:<\/p>\n<pre class=\"ruby\"><code>key = RbNaCl::Random.random_bytes(RbNaCl::SecretBox.key_bytes) \nnonce = RbNaCl::Random.random_bytes(secret_box.nonce_bytes) \n\nsecret_box = RbNaCl::SecretBox.new(key)\nencrypted = secret_box.encrypt(nonce, data)<\/code><\/pre>\n<h4>PHP<\/h4>\n<p>PHP offre l\u2019extension <a href=\"https:\/\/github.com\/jedisct1\/libsodium-php\">libsodium-php<\/a>&nbsp;:<\/p>\n<pre class=\"php\"><code>$key = sodium_crypto_secretbox_keygen();\n$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);\n\n$encrypted = sodium_crypto_secretbox($data, $nonce, $key);<\/code><\/pre>\n<div class=\"inset\" data-title=\"Rappel\">Vous pouvez facilement installer l\u2019extension depuis PECL dans votre compte alwaysdata avec la commande <code>ad_install_pecl libsodium<\/code>. Consultez <a href=\"https:\/\/help.alwaysdata.com\/fr\/langages\/php\/installer-une-extension\/#depuis-peclhttpspeclphpnet\">notre documentation sur l\u2019installation des extensions PECL<\/a> pour plus d\u2019informations.<\/div>\n<h4>Node.js\u00ae<\/h4>\n<p>Node.js\u00ae expose nativement une excellente librairie de cryptographie via son module <code>Crypto<\/code>. Cela \u00e9tant, s\u2019appuyer sur libsodium est probablement un meilleur choix. Vous pouvez utiliser <a href=\"https:\/\/github.com\/jedisct1\/libsodium.js\">libsodium.js<\/a>, compil\u00e9 vers <em>WebAssembly<\/em> depuis le code source de la biblioth\u00e8que principale du projet&nbsp;:<\/p>\n<pre class=\"js\"><code>const _sodium = require('libsodium-wrappers')\n\n(async function () {\n  await _sodium.ready\n  const sodium = _sodium\n\n  let key = sodium.randombutes_buf(sodium.crypto_secretbox_KEYBYTES)\n  let nonce = sodium.randombutes_buf(sodium.crypto_secretbox_NONCEBYTES)\n\n  let encrypted = sodium.crypto_secretbox_easy(data, nonce, key)\n})()<\/code><\/pre>\n<h4>Java<\/h4>\n<p>Java dispose de la biblioth\u00e8que <a href=\"https:\/\/github.com\/muquit\/libsodium-jna\">libsodium-jna<\/a>&nbsp;:<\/p>\n<pre class=\"java\"><code>private static String libraryPath = \"\/usr\/local\/lib\/libsodium.so\";\nSodiumLibrary.setLibraryPath(libraryPath);\n\nbyte[] key = SodiumLibrary.randomBytes(SodiumLibrary.cryptoSecretBoxKeyBytes().intValue());\nint nonceBytesLength = SodiumLibrary.cryptoSecretBoxNonceBytes().intValue();\nbyte[] nonceBytes = SodiumLibrary.randomBytes(nonceBytesLength); \nbyte[] dataBytes = data.getBytes();\n\nbyte[] encrypted = SodiumLibrary.cryptoSecretBoxEasy(dataBytes, nonceBytes, key);<\/code><\/pre>\n<h3>Le c\u00f4t\u00e9 obscur<\/h3>\n<p>Le plus t\u00f4t les donn\u00e9es sont chiffr\u00e9es, meilleure sera leur protection dans votre architecture. C\u2019est le principe du chiffrement <strong>point \u00e0&nbsp;point<\/strong>&nbsp;: les op\u00e9rations cryptographiques devraient s\u2019ex\u00e9cuter dans le client. Heureusement, <em>libsodium<\/em> est utilisable dans un client mobile gr\u00e2ce \u00e0<a href=\"https:\/\/github.com\/joshjdevl\/libsodium-jni\"> libsodium-jni<\/a> pour Android, et <a href=\"https:\/\/github.com\/jedisct1\/swift-sodium\">swift-sodium<\/a> pour iOS<span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_5');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_5');\"><sup id=\"footnote_plugin_tooltip_3103_1_5\" class=\"footnote_plugin_tooltip_text\">5)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_5\" class=\"footnote_tooltip\"><\/span><\/span>.<\/p>\n<p>Le probl\u00e8me reste la cible Web. <em>WebCrypto<\/em> est une bonne API bas-niveau, mais\u2026 et bien\u2026 elle reste bas niveau \u00af\\_(\u30c4)_\/\u00af. Au quotidien, c\u2019est inexploitable, et nous avons besoin d\u2019un outil plus efficace. Un autre probl\u00e8me est li\u00e9 \u00e0&nbsp;la nature m\u00eame de <em>JavaScript<\/em> qui ne peut garantir, par son design, des pr\u00e9requis suffisant pour prot\u00e9ger l\u2019environnement autour de la couche cryptographique.<\/p>\n<p>Heureusement, nous disposons l\u00e0 encore de <a href=\"https:\/\/github.com\/jedisct1\/libsodium.js\">libsodium.js<\/a>&nbsp;! Son utilisation dans le navigateur est aussi facile que&nbsp;:<\/p>\n<pre class=\"html\"><code><script>\nwindow.sodium = {\n  onload (sodium) {\n    let key = sodium.randombutes_buf(sodium.crypto_secretbox_KEYBYTES)\n    let nonce = sodium.randombutes_buf(sodium.crypto_secretbox_NONCEBYTES)\n\n    let encrypted = sodium.crypto_secretbox_easy(data, nonce, key)\n  }\n}\n<\/script>\n<script src=\"sodium.js\" async><\/script><\/code><\/pre>\n<p>Notez que vous pr\u00e9f\u00e8rerez sans doute l\u2019utiliser comme un module<span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_6');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_6');\"><sup id=\"footnote_plugin_tooltip_3103_1_6\" class=\"footnote_plugin_tooltip_text\">6)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_6\" class=\"footnote_tooltip\"><\/span><\/span> et l\u2019embarquer via votre outil de production comme <em>Webpack<\/em> ou <em>Parcel.js<\/em>.<\/p>\n<p>Peut-\u00eatre que vous aurez besoin d\u2019un environnement encore plus s\u00fbr. Dans ce cas, vous pouvez vous tourner vers <em>Rust<\/em> pour d\u00e9velopper le code m\u00e9tier de votre application, et vous appuyer sur <a href=\"https:\/\/github.com\/sodiumoxide\/sodiumoxide\">sodiumoxide<\/a> pour la partie crypto&nbsp;! L\u2019ensemble compile tr\u00e8s bien vers <em>WASM<\/em>, et vous permet d\u2019embarquer votre code logique dans le navigateur, en ne conservant <em>JavaScript<\/em> que pour les t\u00e2ches li\u00e9es \u00e0&nbsp;l\u2019interface.<\/p>\n<figure class=\"embed-media__giphy\" style=\"width:65%; padding-bottom:calc(65% * (283 + 12) \/ (480 + 12))\">\n    <video id=\"giphy-${token}\" autoplay loop muted playsinline>\n        <source src=\"https:\/\/media.giphy.com\/media\/15BuyagtKucHm\/giphy.mp4\" type=\"video\/mp4\">\n        <img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/15BuyagtKucHm\/giphy.gif\" alt=\" @Giphy\">\n    <\/video>\n<\/figure>\n<h2>Encore une&nbsp;chose\u2026<\/h2>\n<p>La cryptographie est un travail \u00e0&nbsp;plein temps. Elle n\u00e9cessite des comp\u00e9tences math\u00e9matiques fortes dans son approche th\u00e9orique. Nous n\u2019avons pas couvert ici ses autres champs d\u2019application comme&nbsp;:<\/p>\n<ul>\n<li>\u00e9changer et stocker des clefs asym\u00e9triques&nbsp;;<\/li>\n<li>utiliser l\u2019algorithme de Diffie-Hellman pour forger une clef sym\u00e9trique priv\u00e9e&nbsp;;<\/li>\n<li>signer un contenu pour l\u2019authentifier&nbsp;;<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p>Encore une fois&nbsp;: quelle que soit votre t\u00e2che, appuyez-vous sur une biblioth\u00e8que cryptographique d\u2019abstraction. Ne cherchez jamais \u00e0&nbsp;concevoir vos propres algorithmes \u00e0&nbsp;moins d\u2019\u00eatre un\u00b7e cryptographe confirm\u00e9\u00b7e.<\/p>\n<p>Quoi que vous cherchiez \u00e0&nbsp;prot\u00e9ger, envisagez toujours le pire sc\u00e9nario possible. Aucune protection n\u2019est assez robuste pour r\u00e9sister \u00e0&nbsp;l\u2019\u00e9preuve du temps. Appuyez-vous toujours sur des algorithmes reconnus avec de hauts standards de r\u00e9sistance, comme de longues clefs <em>ECC<\/em> ou <em>RSA<\/em><span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_7');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_7');\"><sup id=\"footnote_plugin_tooltip_3103_1_7\" class=\"footnote_plugin_tooltip_text\">7)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_7\" class=\"footnote_tooltip\"><\/span><\/span>. Utilisez des clefs uniques. Utilisez des <em>nonces<\/em>. \u00c9vitez de r\u00e9utiliser ces \u00e9l\u00e9ments. N\u2019h\u00e9sitez jamais \u00e0&nbsp;mettre \u00e0&nbsp;jour votre couche cryptographique pour am\u00e9liorer sa s\u00e9curit\u00e9 quand une faille est d\u00e9couverte. Nous avons tous droit \u00e0&nbsp;l\u2019erreur, mais nous devons \u00e0&nbsp;nos utilisateur\u00b7trice\u00b7s de corriger chaque probl\u00e8me trouv\u00e9 qui les mettrait en danger&nbsp;!<\/p>\n<p>Dans le cas d\u2019une application serveur importante, envisagez les dispositifs mat\u00e9riels de gestion de clefs. Les modules <abbr title=\"Hardware Security Module\">HSM<\/abbr> (<em>Hardware Security Module<\/em>) vous permettent d\u2019externaliser les op\u00e9rations cryptographiques. Ils vous permettent de garder les clefs en dehors du syst\u00e8me de fichiers. Elles ne sont ainsi pas compromises en cas d\u2019attaque. Ces modules sont d\u00e9sormais accessibles \u00e0&nbsp;des prix abordables gr\u00e2ce \u00e0&nbsp;des projets <em>open source<\/em><span class=\"footnote_referrer\"><a role=\"button\" tabindex=\"0\" onclick=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_8');\" onkeypress=\"footnote_moveToReference_3103_1('footnote_plugin_reference_3103_1_8');\"><sup id=\"footnote_plugin_tooltip_3103_1_8\" class=\"footnote_plugin_tooltip_text\">8)<\/sup><\/a><span id=\"footnote_plugin_tooltip_text_3103_1_8\" class=\"footnote_tooltip\"><\/span><\/span>.<\/p>\n<hr>\n<p>Gageons que cette (pas si courte) introduction \u00e0&nbsp;la Cryptographie vous aura quelque peu \u00e9clair\u00e9\u00b7e. Si vous voulez aller plus en d\u00e9tail dans le sujet, vous pouvez trouver <a href=\"https:\/\/youtu.be\/GffrOf5aIg0\">une version live sur YouTube<\/a> de la conf\u00e9rence associ\u00e9e au sujet que je (<a href=\"https:\/\/twitter.com\/m4d_z\">m4dz<\/a>) donne r\u00e9guli\u00e8rement.<\/p>\n<p>Nous serons d\u2019ailleurs pr\u00e9sents avec ce <em>talk<\/em> \u00e0&nbsp;<a href=\"https:\/\/www.techorama.nl\/\">Techorama, Netherlands<\/a> et \u00e0&nbsp;<a href=\"https:\/\/piterpy.com\/en\">PiterPy, Saint Petersburg<\/a> avec sa toute nouvelle version&nbsp;!<\/p>\n<p>Vous \u00eates convaincu\u00b7e\u00b7s de l\u2019importance de la cryptographie dans votre projet&nbsp;? Vous souhaitez l\u2019utiliser dans votre <a href=\"https:\/\/www.alwaysdata.com\/en\/pricing\/\">plan d\u2019h\u00e9bergement alwaysdata<\/a>&nbsp;? Demandez-nous de vous fournir un device <abbr title=\"Hardware Security Module\">HSM<\/abbr> sur votre <strong>plan d\u00e9di\u00e9<\/strong>, et nous nous ferons un plaisir de vous le procurer&nbsp;!<\/p>\n<div class=\"speaker-mute footnotes_reference_container\"> <div class=\"footnote_container_prepare\"><p><span role=\"button\" tabindex=\"0\" class=\"footnote_reference_container_label pointer\" onclick=\"footnote_expand_collapse_reference_container_3103_1();\">Notes<\/span><span role=\"button\" tabindex=\"0\" class=\"footnote_reference_container_collapse_button\" style=\"display: none;\" onclick=\"footnote_expand_collapse_reference_container_3103_1();\">[<a id=\"footnote_reference_container_collapse_button_3103_1\">+<\/a>]<\/span><\/p><\/div> <div id=\"footnote_references_container_3103_1\" style><table class=\"footnotes_table footnote-reference-container\"><caption class=\"accessibility\">Notes<\/caption> <tbody> \n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_1');\"><a id=\"footnote_plugin_reference_3103_1_1\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>1<\/a><\/th> <td class=\"footnote_plugin_text\">comme les <em>nombres premiers<\/em>, ou les <em>courbes elliptiques<\/em><\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_2');\"><a id=\"footnote_plugin_reference_3103_1_2\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>2<\/a><\/th> <td class=\"footnote_plugin_text\">si vous \u00eates aussi vieux que moi, sinon c\u2019\u00e9tait probablement <em>Picsou Magazine<\/em><\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_3');\"><a id=\"footnote_plugin_reference_3103_1_3\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>3<\/a><\/th> <td class=\"footnote_plugin_text\">par exemple des blocs d\u2019une longueur de 4096 octets<\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_4');\"><a id=\"footnote_plugin_reference_3103_1_4\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>4<\/a><\/th> <td class=\"footnote_plugin_text\">puisqu\u2019il est le seul \u00e0&nbsp;poss\u00e9der la clef, vu qu\u2019elle est <em>priv\u00e9e<\/em>, vous suivez&nbsp;?<\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_5');\"><a id=\"footnote_plugin_reference_3103_1_5\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>5<\/a><\/th> <td class=\"footnote_plugin_text\">Apple a&nbsp;par ailleurs r\u00e9cemment donn\u00e9 acc\u00e8s \u00e0&nbsp;sa biblioth\u00e8que <a href=\"https:\/\/developer.apple.com\/documentation\/cryptokit\">Cryptokit<\/a>, pour permettre un acc\u00e8s aux primitives cryptographiques directement dans le code Swift&nbsp;natif<\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_6');\"><a id=\"footnote_plugin_reference_3103_1_6\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>6<\/a><\/th> <td class=\"footnote_plugin_text\">comme avec <a href=\"#node-js\">Node.js<\/a> ci-dessus<\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_7');\"><a id=\"footnote_plugin_reference_3103_1_7\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>7<\/a><\/th> <td class=\"footnote_plugin_text\">les clefs <em>ECC<\/em> 256 bits sont consid\u00e9r\u00e9es aussi robustes que des clefs <em>RSA<\/em> 3078&nbsp;bits<\/td><\/tr>\n\n<tr class=\"footnotes_plugin_reference_row\"> <th scope=\"row\" class=\"footnote_plugin_index_combi pointer\" onclick=\"footnote_moveToAnchor_3103_1('footnote_plugin_tooltip_3103_1_8');\"><a id=\"footnote_plugin_reference_3103_1_8\" class=\"footnote_backlink\"><span class=\"footnote_index_arrow\">\u2191<\/span>8<\/a><\/th> <td class=\"footnote_plugin_text\">comme les clefs <a href=\"https:\/\/www.nitrokey.com\/files\/doc\/Nitrokey_HSM_factsheet.pdf\">HSM Nitrokey<abbr title=\"Hardware Security Module\"><\/abbr><\/a><\/td><\/tr>\n\n <\/tbody> <\/table> <\/div><\/div><script type=\"text\/javascript\"> function footnote_expand_reference_container_3103_1() { jQuery('#footnote_references_container_3103_1').show(); jQuery('#footnote_reference_container_collapse_button_3103_1').text('\u2212'); } function footnote_collapse_reference_container_3103_1() { jQuery('#footnote_references_container_3103_1').hide(); jQuery('#footnote_reference_container_collapse_button_3103_1').text('+'); } function footnote_expand_collapse_reference_container_3103_1() { if (jQuery('#footnote_references_container_3103_1').is(':hidden')) { footnote_expand_reference_container_3103_1(); } else { footnote_collapse_reference_container_3103_1(); } } function footnote_moveToReference_3103_1(p_str_TargetID) { footnote_expand_reference_container_3103_1(); var l_obj_Target = jQuery('#' + p_str_TargetID); if (l_obj_Target.length) { jQuery( 'html, body' ).delay( 0 ); jQuery('html, body').animate({ scrollTop: l_obj_Target.offset().top - window.innerHeight * 0.2 }, 380); } } function footnote_moveToAnchor_3103_1(p_str_TargetID) { footnote_expand_reference_container_3103_1(); var l_obj_Target = jQuery('#' + p_str_TargetID); if (l_obj_Target.length) { jQuery( 'html, body' ).delay( 0 ); jQuery('html, body').animate({ scrollTop: l_obj_Target.offset().top - window.innerHeight * 0.2 }, 380); } }<\/script>","protected":false},"excerpt":{"rendered":"<p>Vous \u00eates-vous d\u00e9j\u00e0 demand\u00e9 comment prot\u00e9ger efficacement les donn\u00e9es de vos utilisateur\u00b7trice\u00b7s&nbsp;?&nbsp;Ne cherchez plus&nbsp;!<\/p>\n","protected":false},"author":12,"featured_media":3115,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"wp_typography_post_enhancements_disabled":false,"footnotes":""},"categories":[1,230],"tags":[132,103],"class_list":["post-3103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","category-uncategorized-fr","tag-securite-fr","tag-security"],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/posts\/3103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/comments?post=3103"}],"version-history":[{"count":0,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/posts\/3103\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/media\/3115"}],"wp:attachment":[{"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/media?parent=3103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/categories?post=3103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.alwaysdata.com\/fr\/wp-json\/wp\/v2\/tags?post=3103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}