{"id":765,"date":"2016-01-17T22:58:39","date_gmt":"2016-01-17T21:58:39","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=765"},"modified":"2020-12-26T11:40:53","modified_gmt":"2020-12-26T10:40:53","slug":"php-hashes-und-ihre-probleme","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/php-hashes-und-ihre-probleme\/","title":{"rendered":"PHP Hashes und ihre Probleme"},"content":{"rendered":"<p>Ein schon ein etwas \u00e4lteres Ph\u00e4nomen, welches mir demletzt erneut \u00fcber den Weg gelaufen ist und ich es deswegen f\u00fcr &#8222;verbloggenswert&#8220; halte:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\nif (md5(&#039;240610708&#039;) == md5(&#039;QNKCDZO&#039;))\n{\necho &quot;yep equal&quot;;\n}\n<\/pre>\n<p>Ups? Eine <a href=\"https:\/\/d-mueller.de\/blog\/hashverfahren-und-sicherheit\/\">MD5-Kollision<\/a>? Nein. Eine Eigenart von PHP.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\nvar_dump(md5(&#039;240610708&#039;)); \/\/string(32) &quot;0e462097431906509019562988736854&quot;\nvar_dump(md5(&#039;QNKCDZO&#039;));   \/\/string(32) &quot;0e830400451993494058024219903391&quot;\n<\/pre>\n<p>2 verschiedene Strings, die aber laut PHP-Vergleich identisch sein sollen? Genau da liegt der Knackpunkt: Die Strings sind <b>gleich<\/b>, aber nicht <b>identisch<\/b>. Da beide mit <i>0e<\/i> anfangen, werden sie als Exponentialdarstellung einer Zahl aufgefasst. Und da 0<sup>irgendwas<\/sup> immer 0 ergibt, sind die beiden Hashes im Vergleich auch gleich.<\/p>\n<p>Das &#8222;Problem&#8220; l\u00e4sst sich einfach l\u00f6sen, indem mit <i>===<\/i> verglichen wird. Dann evaluiert PHP den Zahlenwert des Strings nicht mehr. Oder indem <a href=\"http:\/\/php.net\/manual\/de\/function.strcmp.php\">strcmp<\/a> verwendet wird:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\nvar_dump(strcmp(md5(&#039;240610708&#039;), md5(&#039;QNKCDZO&#039;))); \/\/int(-1)\n<\/pre>\n<p>SHA und Konsorten sind f\u00fcr diese Problematik <a href=\"https:\/\/blog.whitehatsec.com\/magic-hashes\/\">genau so anf\u00e4llig<\/a>, es ist nur entsprechend unwahrscheinlicher, dass es zu solch einem &#8222;0e&#8220;-Ph\u00e4nomen kommt. In der Praxis h\u00e4tten Angreifer also eine bessere Chance, wenn zu &#8222;0e&#8220; evaluierende Hashes beim Bruteforcen vorrangig probiert werden. Aber auch dann ist der Angriff selbstverst\u00e4ndlich von der Nachl\u00e4ssigkeit des Entwicklers abh\u00e4ngig: Sobald mit <i>===<\/i> verglichen wird (bzw. ein &#8222;ordentliches&#8220; Hash-Verfahren wie bcrypt mit Salt verwendet wird) sieht es d\u00fcsterer aus.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein schon ein etwas \u00e4lteres Ph\u00e4nomen, welches mir demletzt erneut \u00fcber den Weg gelaufen ist und ich es deswegen f\u00fcr &#8222;verbloggenswert&#8220; halte: if (md5(&#039;240610708&#039;) == md5(&#039;QNKCDZO&#039;)) { echo &quot;yep equal&quot;; } Ups? Eine MD5-Kollision? Nein. Eine Eigenart von PHP. var_dump(md5(&#039;240610708&#039;)); &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/php-hashes-und-ihre-probleme\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6,8,3],"tags":[],"class_list":["post-765","post","type-post","status-publish","format-standard","hentry","category-php","category-security","category-quicktips","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=765"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/765\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}