{"id":1331,"date":"2013-12-15T18:23:00","date_gmt":"2013-12-15T16:23:00","guid":{"rendered":"http:\/\/blog.nebule.org\/?p=1331"},"modified":"2016-03-29T19:02:17","modified_gmt":"2016-03-29T17:02:17","slug":"openssl-et-la-cryptographie","status":"publish","type":"post","link":"http:\/\/blog.nebule.org\/?p=1331","title":{"rendered":"OpenSSL et la cryptographie"},"content":{"rendered":"<p style=\"text-align: justify;\">La mise en place du chiffrement\/d\u00e9chiffrement dans <a title=\"Projet sylabe\" href=\"http:\/\/blog.sylabe.org\/\" target=\"_blank\">sylabe<\/a>, l&rsquo;impl\u00e9mentation de <em>nebule<\/em> en <a title=\"php\" href=\"http:\/\/www.php.net\/\" target=\"_blank\">php<\/a>, r\u00e9v\u00e8le quelques probl\u00e8mes et sp\u00e9cificit\u00e9s de <a title=\"OpenSSL\" href=\"http:\/\/www.openssl.org\/\" target=\"_blank\">OpenSSL<\/a>.<\/p>\n<p style=\"text-align: justify;\">Lorsque il a fallu d\u00e9chiffrer avec la commande <em>openssl<\/em> les objets chiffr\u00e9s depuis <em>sylabe<\/em>, \u00e7a n&rsquo;a pas march\u00e9.<\/p>\n<p style=\"text-align: justify;\">Les objets chiffr\u00e9s par <em>sylabe<\/em>, qui utilise <em>openssl<\/em> dans <em>php<\/em>, peuvent \u00eatre d\u00e9chiffr\u00e9s par <em>sylabe<\/em>. Les objets chiffr\u00e9s par <em>nebule<\/em> en <em>bash<\/em>, qui utilise la commande <em>openssl<\/em>, peuvent \u00eatre d\u00e9chiffr\u00e9s via la m\u00eame commande en <em>bash<\/em>. Le point commun est l&rsquo;utilisation de la librairie <em>openssl<\/em>. Mais en pratique un objet chiffr\u00e9 dans <em>sylabe<\/em> que l&rsquo;on essaye de d\u00e9chiffrer avec la commande <em>openssl<\/em> (via <em>nebule<\/em> en <em>bash<\/em>) retourne une erreur &lsquo;Bad Magic Number&rsquo;. Et l&rsquo;inverse ne marche pas non plus. Ah, c&rsquo;est moche&#8230;<\/p>\n<h2 style=\"text-align: justify;\">Salage<\/h2>\n<p style=\"text-align: justify;\">Le probl\u00e8me ici est li\u00e9 \u00e0 l&rsquo;utilisation d&rsquo;un &lsquo;salage&rsquo; (<a title=\"Salt\" href=\"http:\/\/en.wikipedia.org\/wiki\/Salt_%28cryptography%29\" target=\"_blank\">salt<\/a>). Cette valeur est g\u00e9n\u00e9r\u00e9e al\u00e9atoirement par <em>openssl<\/em> pour complexifier le mot de passe de chiffrement et r\u00e9duire les attaques par dictionnaire de mots de passe pr\u00e9-hash\u00e9s (<a title=\"Rainbow-table\" href=\"http:\/\/fr.wikipedia.org\/wiki\/Rainbow_table\" target=\"_blank\">rainbow-table<\/a>). Le sel est une valeur publique contrairement au mot de passe, et doit imp\u00e9rativement \u00eatre envoy\u00e9 avec le fichier chiffr\u00e9. Le salage est un renforcement de la proc\u00e9dure de chiffrement et non du mot de passe lui-m\u00eame. Pour que le sel soit transmit avec les donn\u00e9es chiffr\u00e9es, <em>openssl<\/em> ajoute un petit ent\u00eate aux donn\u00e9es chiffr\u00e9es avec notamment la valeur du sel. Il en r\u00e9sulte une petite augmentation de la taille du fichier des donn\u00e9es chiffr\u00e9es de 16octets. Or, la librairie <em>openssl<\/em> utilis\u00e9e dans <em>php<\/em> ne g\u00e9n\u00e8re pas de sel, les donn\u00e9es chiffr\u00e9es et non chiffr\u00e9es ont la m\u00eame taille.<\/p>\n<p style=\"text-align: justify;\">Quelle solution apporter ?<\/p>\n<p style=\"text-align: justify;\">Il est possible de g\u00e9rer cet ent\u00eate de fichiers chiffr\u00e9s dans le code <em>php<\/em>. Cela entra\u00eene une augmentation de la complexit\u00e9 du chiffrement\/d\u00e9chiffrement mais permet de conserver un comportement commun avec les objets actuellement g\u00e9n\u00e9r\u00e9s en <em>bash<\/em>. Cette compatibilit\u00e9 &lsquo;commune&rsquo; n&rsquo;est pas universelle puisqu&rsquo;elle n&rsquo;est pas g\u00e9r\u00e9e par la librairie <em>openssl<\/em> dans <em>php<\/em>, et donc peut-\u00eatre pas non plus dans d&rsquo;autres environnements.<br \/>\nOn peut aussi ne pas permettre d&rsquo;utiliser un ent\u00eate particulier et de g\u00e9rer le salage de la m\u00eame fa\u00e7on que l&rsquo;IV. Cette solution casse la gestion des objets chiffr\u00e9s actuels mais surtout complexifie les liens de chiffrement.<br \/>\nUne autre solution serait de ne pas utiliser le salage du tout. Une option de <em>openssl<\/em> le permet : <code>-nosalt<\/code>. Cela permet d&rsquo;avoir un chiffrement plus simple et des objets chiffr\u00e9s plus propres, et donc une impl\u00e9mentation plus universelle du chiffrement. On va cependant \u00e0 l&rsquo;encontre des recommandations faites par les d\u00e9veloppeurs de <em>OpenSSL<\/em>. Et on r\u00e9-ouvre potentiellement par dictionnaire pr\u00e9-calcul\u00e9s.<\/p>\n<p style=\"text-align: justify;\">Mais a-t-on vraiment besoin du salage ?<\/p>\n<p style=\"text-align: justify;\">Le salage permet en fait de renforcer la s\u00e9curit\u00e9 de mots de passes potentiellement faibles ou \u00e0 la limite de l&rsquo;attaque par force brute.<br \/>\nLe chiffrement des objets dans <em>nebule<\/em> impose l&rsquo;utilisation d&rsquo;une cl\u00e9 de session al\u00e9atoire. Si l&rsquo;espace des valeurs des cl\u00e9s de sessions est al\u00e9atoire et suffisamment grand, une attaque par dictionnaire est impossible. C&rsquo;est impossible parce qu&rsquo;il est dans ce cas pr\u00e9cis impossible de pr\u00e9-calculer et encore moins de stocker dans un dictionnaire l&rsquo;int\u00e9gralit\u00e9 des valeurs possibles. Un espace des valeurs de cl\u00e9 suffisamment grand peut se comprendre par une entropie correspondant \u00e0 128bits et plus.<\/p>\n<p style=\"text-align: justify;\">Le script <em>bash<\/em> r\u00e9f\u00e9rence de <em>nebule<\/em>\u00c2\u00a0g\u00e9n\u00e8re actuellement une cl\u00e9 de session de 64octets de valeurs hexad\u00e9cimales, soit 256bits d&rsquo;entropie r\u00e9elle. Le code <em>php<\/em> de <em>sylabe<\/em> g\u00e9n\u00e8re actuellement une cl\u00e9 de session de 128octets al\u00e9atoires, soit 1024bits d&rsquo;entropie r\u00e9elle.<\/p>\n<p style=\"text-align: justify;\"><strong><span style=\"color: #ff0000;\">Donc, le salage va \u00eatre volontairement supprim\u00e9 dans le chiffrement des objets tel que mis en place dans <em>nebule<\/em>.<\/span><\/strong><\/p>\n<h2 style=\"text-align: justify;\">Semence<\/h2>\n<p style=\"text-align: justify;\">Un probl\u00e8me similaire existe avec l&rsquo;IV (<a title=\"IV\" href=\"http:\/\/en.wikipedia.org\/wiki\/Initialization_vector\" target=\"_blank\">Initial Vector<\/a>, vecteur initial ou semence).<\/p>\n<p style=\"text-align: justify;\">Lorsque l&rsquo;on r\u00e9alise un chiffrement sym\u00e9trique, celui-ci se fait typiquement par blocs de donn\u00e9es. Ce d\u00e9coupage peut entrer en interf\u00e9rence, en quelque sorte, avec les donn\u00e9es \u00e0 chiffrer. Si ces donn\u00e9es sont r\u00e9p\u00e9titives suivant la taille du bloc ou un multiple, alors les blocs de donn\u00e9es chiffr\u00e9es correspondantes vont \u00eatre identiques. Et cette r\u00e9p\u00e9tition est d\u00e9tectable et fourni des informations sur le contenu non chiffr\u00e9&#8230;<br \/>\nPour rem\u00e9dier \u00e0 ce probl\u00e8me, il existe diff\u00e9rentes m\u00e9thode d&rsquo;organisation du chiffrement (pour le m\u00eame algorithme de chiffrement) que l&rsquo;on appelle modes d&rsquo;op\u00e9ration. Certains modes introduisent un cha\u00eenage entre des blocs contigu\u00ebs pour camoufler les donn\u00e9es r\u00e9p\u00e9titives. D&rsquo;autres modes mettent en place d&rsquo;un compteur par bloc qui sera combin\u00e9 avec les donn\u00e9es pour forcer un peu de variabilit\u00e9 entres blocs r\u00e9p\u00e9titifs.<br \/>\nIl reste cependant \u00e0 traiter le premier bloc. Pour cela on utilise l&rsquo;IV qui est soit la premi\u00e8re valeur pour le cha\u00eenage soit la premi\u00e8re valeur du compteur en fonction du mode d&rsquo;op\u00e9ration. Parce que sinon ce premier bloc, chiffr\u00e9 avec le m\u00eame mot de passe, donnera le m\u00eame bloc chiffr\u00e9 et donc trahira un d\u00e9but de donn\u00e9es identique entre plusieurs fichiers chiffr\u00e9s. L&rsquo;IV est une valeur publique contrairement au mot de passe, et doit imp\u00e9rativement \u00eatre envoy\u00e9 avec le fichier chiffr\u00e9.<\/p>\n<p style=\"text-align: justify;\">Mais a-t-on vraiment besoin de cet IV ?<\/p>\n<p style=\"text-align: justify;\">Comme dans le cas du salage, l&rsquo;utilisation de d&rsquo;une cl\u00e9 de session al\u00e9atoire et diff\u00e9rente pour chaque objet fait que, m\u00eame pour un contenu identique dans les premiers blocs, cela donnera des blocs chiffr\u00e9s diff\u00e9rents.<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #ff0000;\"><strong>Donc, le vecteur initial va \u00eatre volontairement supprim\u00e9 dans le chiffrement des objets tel que mis en place dans <em>nebule<\/em>.<\/strong><\/span><\/p>\n<p style=\"text-align: justify;\">Premier probl\u00e8me suite \u00e0 \u00e7a, l&rsquo;instruction en <em>php<\/em> <code>openssl_encrypt<\/code> n\u00e9cessite un param\u00e8tre IV non nul&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La mise en place du chiffrement\/d\u00e9chiffrement dans sylabe, l&rsquo;impl\u00e9mentation de nebule en php, r\u00e9v\u00e8le quelques probl\u00e8mes et sp\u00e9cificit\u00e9s de OpenSSL. Lorsque il a fallu d\u00e9chiffrer avec la commande openssl les objets chiffr\u00e9s depuis sylabe, \u00e7a n&rsquo;a pas march\u00e9. Les objets chiffr\u00e9s par sylabe, qui utilise openssl dans php, peuvent \u00eatre d\u00e9chiffr\u00e9s par sylabe. Les objets &hellip; <a href=\"http:\/\/blog.nebule.org\/?p=1331\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">OpenSSL et la cryptographie<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[64,73,3,7,20,24,39,40],"tags":[204,212,249,294,295,299,338],"_links":{"self":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts\/1331"}],"collection":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1331"}],"version-history":[{"count":1,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts\/1331\/revisions"}],"predecessor-version":[{"id":2228,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=\/wp\/v2\/posts\/1331\/revisions\/2228"}],"wp:attachment":[{"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1331"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.nebule.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}