{"id":179,"date":"2018-01-06T16:11:21","date_gmt":"2018-01-06T15:11:21","guid":{"rendered":"https:\/\/kalaxia.org\/?p=179"},"modified":"2018-01-06T16:11:21","modified_gmt":"2018-01-06T15:11:21","slug":"extension-du-module-de-chiffrement","status":"publish","type":"post","link":"https:\/\/kalaxia.org\/?p=179","title":{"rendered":"Extension du module de chiffrement"},"content":{"rendered":"<p>Cette nuit, d&rsquo;importantes modifications ont \u00e9t\u00e9 apport\u00e9es aux modules de chiffrement du portail et du serveur de jeu. Cela du fait de limitations rencontr\u00e9es avec la premi\u00e8re version du module. Cet article est l&rsquo;occasion de revenir sur cette \u00e9volution et d&rsquo;en partager les diff\u00e9rents \u00e9l\u00e9ments techniques. Commen\u00e7ons par remettre en place le contexte.<\/p>\n<p>R\u00e9cemment, nous avons impl\u00e9ment\u00e9 les factions dans le jeu ! Cr\u00e9\u00e9es depuis le portail, elles comprennent un nom et une description. Lors de la cr\u00e9ation d&rsquo;une nouvelle partie, l&rsquo;administrateur du portail s\u00e9lectionne les factions participantes, dont les donn\u00e9es sont ensuite envoy\u00e9es de mani\u00e8re chiffr\u00e9e au serveur de jeu en plus des donn\u00e9es de base d\u00e9j\u00e0 pr\u00e9sentes dans l&rsquo;appel. Pour la s\u00e9curisation des donn\u00e9es, un <strong>module de chiffrement RSA<\/strong> avait d\u00e9j\u00e0 bien souvent \u00e9t\u00e9 mis \u00e0 l&rsquo;\u00e9preuve ces derni\u00e8res semaines. Tout devait \u00eatre simple lors de l&rsquo;ajout des donn\u00e9es de factions, malheureusement, ce ne le fut pas !<\/p>\n<p>Avec stupeur, nous f\u00eemes la d\u00e9couverte d&rsquo;une erreur de d\u00e9chiffrement. Soup\u00e7onnant un probl\u00e8me li\u00e9 \u00e0 la taille du payload envoy\u00e9, le test fut r\u00e9alis\u00e9 de mettre des descriptions de faction courtes. La requ\u00eate dans ce cas \u00e9tait trait\u00e9e avec succ\u00e8s. La nature de l&rsquo;obstacle \u00e9tait confirm\u00e9e, il n&rsquo;y a plus qu&rsquo;\u00e0 trouver une solution !<\/p>\n<p>L&rsquo;origine du probl\u00e8me est qu&rsquo;un chiffrement RSA fonctionne avec une longueur maximale d\u00e9pendant de la taille du <em>modulus<\/em>. Une contrainte vraisemblablement non contournable de mani\u00e8re propre. Il fallait donc une nouvelle piste. Heureusement, Stack Overflow poss\u00e8de souvent la r\u00e9ponse \u00e0 nos questions, et ce fut encore le cas ! Notre solution fut donc d&rsquo;utiliser un <strong>chiffrement sym\u00e9trique pour le payload<\/strong>, \u00e0 l&rsquo;aide d&rsquo;une cl\u00e9 AES g\u00e9n\u00e9r\u00e9e \u00e0 la vol\u00e9e, pour ensuite<strong> chiffrer la cl\u00e9 AES elle-m\u00eame \u00e0 l&rsquo;aide de RSA<\/strong>. Nous obtenons donc un <strong>chiffrement hybride<\/strong>, o\u00f9 le contenu est prot\u00e9g\u00e9 par une seule cl\u00e9, elle-m\u00eame prot\u00e9g\u00e9e par les deux paires de cl\u00e9s publiques\/priv\u00e9es que nous utilisions jusqu&rsquo;ici.<\/p>\n<p>C\u00f4t\u00e9 Symfony, peu de modifications \u00e0 faire, \u00e9tant donn\u00e9 que l&rsquo;extension openssl_* manipule tr\u00e8s bien ce genre de cas. Nous g\u00e9n\u00e9rons donc une cl\u00e9 al\u00e9atoire sur 32 octets et un IV de 16 octets. Avec ces \u00e9l\u00e9ments, nous chiffrons donc le contenu, qui ne subit plus aucune contrainte de taille. La cl\u00e9 et l&rsquo;IV sont ensuite chiffr\u00e9s en RSA sur 512 octets. Nous avons d\u00e9sormais les diff\u00e9rentes parties de la requ\u00eate qui sont s\u00e9curis\u00e9es. Il ne reste plus qu&rsquo;\u00e0 les transmettre !<\/p>\n<figure id=\"attachment_181\" aria-describedby=\"caption-attachment-181\" style=\"width: 1085px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-181 size-full\" src=\"https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_aes_payload.png\" alt=\"\" width=\"1085\" height=\"734\" srcset=\"https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_aes_payload.png 1085w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_aes_payload-300x203.png 300w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_aes_payload-768x520.png 768w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_aes_payload-1024x693.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-181\" class=\"wp-caption-text\">En Symfony, rien de tr\u00e8s compliqu\u00e9<\/figcaption><\/figure>\n<p>Apr\u00e8s avoir cod\u00e9 l&rsquo;extension du module, c\u00f4t\u00e9 API du serveur de jeu (\u00e9crit en Go), les premiers tests sont effectu\u00e9s ! La requ\u00eate comprend en contenu le payload chiffr\u00e9 avec AES, <strong>tandis que la cl\u00e9 et l&rsquo;IV sont stock\u00e9s dans deux ent\u00eates HTTP distincts<\/strong> (<em>Application-Key<\/em> et <em>Application-Iv<\/em>). Cependant, premi\u00e8re surprise, le r\u00e9sultat de la requ\u00eate est une 400, <em>Bad Request<\/em> donc.<\/p>\n<p>La raison ne fut pas longue \u00e0 d\u00e9couvrir, en effet, envoyer des ent\u00eates HTTP chiffr\u00e9s n&rsquo;est pas tr\u00e8s standard ! Il fallu donc les <strong>encoder en base64<\/strong> et le tour fut jou\u00e9.<\/p>\n<p>En revanche, seconde surprise, du c\u00f4t\u00e9 de l&rsquo;API on notait une erreur de parsing du payload JSON apr\u00e8s d\u00e9chiffrement. Apr\u00e8s avoir effectu\u00e9 un relev\u00e9 des valeurs aux diff\u00e9rents stades de d\u00e9chiffrement, une suite d&rsquo;octets similaires en fin de cha\u00eene furent d\u00e9couvert. C&rsquo;est ici que fut rencontr\u00e9 le concept de <strong>Padding<\/strong>, inh\u00e9rent \u00e0 AES, qui comble une cha\u00eene d&rsquo;octets pour atteindre une taille \u00e9gale \u00e0 un multiple de bloc bien pr\u00e9cis. Il fallait donc supprimer ces octets de remplissage pour pouvoir correctement r\u00e9cup\u00e9rer le JSON final.<\/p>\n<figure id=\"attachment_182\" aria-describedby=\"caption-attachment-182\" style=\"width: 914px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-182 size-full\" src=\"https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_go_decryption.png\" alt=\"\" width=\"914\" height=\"920\" srcset=\"https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_go_decryption.png 914w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_go_decryption-150x150.png 150w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_go_decryption-298x300.png 298w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_go_decryption-768x773.png 768w, https:\/\/kalaxia.org\/wp-content\/uploads\/2018\/01\/crypt_go_decryption-100x100.png 100w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption id=\"caption-attachment-182\" class=\"wp-caption-text\">Au secours, nous avons cr\u00e9\u00e9 un monstre<\/figcaption><\/figure>\n<p>Une fois ceci effectu\u00e9, il fallut reproduire le m\u00eame sch\u00e9ma de chiffrement et de d\u00e9chiffrement dans l&rsquo;autre sens, c&rsquo;est \u00e0 dire de l&rsquo;API vers le portail. C&rsquo;est par exemple n\u00e9cessaire pour<strong> r\u00e9cup\u00e9rer le JSON Web Token du joueur<\/strong> lors de sa connexion, et prochainement pourquoi pas pour des exports de classement ou d&rsquo;autres donn\u00e9es vers le portail.<\/p>\n<p>Le nouveau module de chiffrement enfin op\u00e9rationnel, nous pouvons d\u00e9sormais assurer une s\u00e9curit\u00e9 totale des transferts de donn\u00e9es entre une instance du portail et les serveurs de jeu !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cette nuit, d&rsquo;importantes modifications ont \u00e9t\u00e9 apport\u00e9es aux modules de chiffrement du portail et du serveur de jeu. Cela du fait de limitations rencontr\u00e9es avec la premi\u00e8re version du module. Cet article est l&rsquo;occasion de revenir sur cette \u00e9volution et d&rsquo;en partager les diff\u00e9rents \u00e9l\u00e9ments techniques. Commen\u00e7ons par remettre en place le contexte. R\u00e9cemment, nous &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/kalaxia.org\/?p=179\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Extension du module de chiffrement&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":183,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-179","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/posts\/179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/kalaxia.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=179"}],"version-history":[{"count":2,"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/posts\/179\/revisions"}],"predecessor-version":[{"id":184,"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/posts\/179\/revisions\/184"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kalaxia.org\/index.php?rest_route=\/wp\/v2\/media\/183"}],"wp:attachment":[{"href":"https:\/\/kalaxia.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kalaxia.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kalaxia.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}