Ist md5(file_contents_as_string) gleich md5_file(/path/to/file)?

Lesezeit: 4 Minuten

Benutzer-Avatar
Tom

Wenn ich mache:

<?php echo md5(file_get_contents("/path/to/file")) ?>

…wird dies immer den gleichen Hash erzeugen wie:

<?php echo md5_file("/path/to/file") ?>

  • Hm, kann ich nicht genau sagen, aber wenn die Datei eine Byte-Order-Marke und die Zeichenfolge nicht, dann sind die Hashes nicht gleich.

    – vcsjones

    24. Mai 2012 um 13:57 Uhr

  • [in response to deleted comment] Ich könnte es selbst ausprobieren. Ich mache mir nur Sorgen, dass, wenn ich eine Übereinstimmung bekomme und ich anfange, md5() mit md5_file() zu vergleichen, es auf der ganzen Linie Probleme geben könnte, die unterschiedliche Hashes erzeugen – vielleicht mit php_ini-Direktiven oder so etwas, das mir weit über den Kopf wächst ein Alptraum zum Debuggen/Identifizieren sein.

    – Tom

    24. Mai 2012 um 14:02 Uhr


Benutzer-Avatar
prehfeldt

Ja, sie geben dasselbe zurück:

var_dump(md5(file_get_contents(__FILE__)));
var_dump(md5_file(__FILE__));

was in meinem Fall dies zurückgibt:

string(32) "4d2aec3ae83694513cb9bde0617deeea"
string(32) "4d2aec3ae83694513cb9bde0617deeea"

Bearbeiten: Schauen Sie sich den Quellcode beider Funktionen an: https://github.com/php/php-src/blob/master/ext/standard/md5.c (Zeile 47 & 76). Sie verwenden beide die gleichen Funktionen, um den Hash zu generieren, außer dass die md5_file() Funktion öffnet zuerst die Datei.

2. Edit: Grundsätzlich die md5_file() Die Funktion generiert den Hash basierend auf dem Dateiinhalt, nicht auf den Dateimetadaten wie dem Dateinamen. Dies ist der gleiche Weg md5sum auf Linux-Systemen funktionieren. Siehe dieses Beispiel:

[email protected]:~# echo foobar > foo.txt
[email protected]:~# md5sum foo.txt
14758f1afd44c09b7992073ccf00b43d  foo.txt
[email protected]:~# mv foo.txt bar.txt
[email protected]:~# md5sum bar.txt
14758f1afd44c09b7992073ccf00b43d  bar.txt

Benutzer-Avatar
Pier-Alexandre Bouchard

md5_file Befehl hasht nur die Inhalt einer Datei mit md5.

Wenn Sie sich auf die alte md5_file-PHP-Implementierung beziehen (aber das Prinzip ist immer noch dasselbe) Quelle :

function php_compat_md5_file($filename, $raw_output = false)
{
// ...
// removed protections

 if ($fsize = @filesize($filename)) {
        $data = fread($fh, $fsize);
    } else {
        $data="";
        while (!feof($fh)) {
            $data .= fread($fh, 8192);
        }
    }

    fclose($fh);

    // Return
    $data = md5($data);
    if ($raw_output === true) {
        $data = pack('H*', $data);
    }

    return $data;
}

Also wenn du mit hashst md5 jede Zeichenfolge oder Inhalt, erhalten Sie immer das gleiche Ergebnis wie md5_file (für die gleiche Kodierung und den gleichen Dateiinhalt).

In diesem Fall hashst du per md5 den Inhalt einer Datei mit file_get_content() oder wenn Sie verwenden md5_file oder auch wenn Sie verwenden md5 Befehl mit dem gleichen Inhalt wie Ihr Dateiinhalt, erhalten Sie immer das gleiche Ergebnis.

Beispielsweise könnten Sie den Dateinamen einer Datei ändern, und für zwei verschiedene Dateien mit demselben Inhalt erzeugen sie denselben md5-Hash.

Als Beispiel: Betrachten Sie zwei Dateien mit “Stackoverflow” (ohne Anführungszeichen) mit den Namen 1.txt und 2.txt

md5_file("1.txt");
md5_file("2.txt");

ausgeben würde

73868cb1848a216984dca1b6b0ee37bc

Sie werden genau das gleiche Ergebnis haben, wenn Sie md5("stackoverflow") oder wenn du md5(file_get_contents("1.txt")) oder md5(file_get_contents("1.txt")).

  • Die Quelle, auf die Sie sich beziehen, ist eine alte PHP-Implementierung der Funktion. Aber die Erklärung ist gut.

    – prehfeldt

    24. Mai 2012 um 14:26 Uhr

  • Hast du den neuen Link? Ich habe keinen kostenlosen Internetzugang und so viele Webseiten sind hier gesperrt. Wenn Sie die neue Quelle haben, werde ich meinen Beitrag aktualisieren.

    – Pier-Alexandre Bouchard

    24. Mai 2012 um 14:31 Uhr

  • @pier-alexandre-bouchard er hat in seiner eigenen Antwort einen Link zum fraglichen PHP-Quellcode gepostet. 🙂

    – damianb

    24. Mai 2012 um 14:34 Uhr

  • @damianb Ich habe über die Implementierung von PHP md5_file aus der PHP-Quelle gesprochen.

    – Pier-Alexandre Bouchard

    24. Mai 2012 um 14:38 Uhr

  • Es gibt keine neuere Implementierung davon in PHP, da es Teil der PHP-Distribution wurde und vor einigen Jahren in C umgeschrieben wurde.

    – prehfeldt

    24. Mai 2012 um 14:41 Uhr

basierend auf dem Dateiinhalt, nicht auf den Dateimetadaten wie der BOM oder dem Dateinamen

Das mit der Stückliste ist nicht richtig. BOM ist ein Teil des Dateiinhalts, Sie können seine drei Bytes in jedem Nicht-Unicode-Dateieditor sehen.

  • Dies sollte ein Kommentar zu der Antwort sein, aus der Ihr Zitat stammt, und keine eigenständige Antwort.

    – BHSPitMonkey

    25. Mai 2016 um 0:05 Uhr

Ja, ich habe es mehrmals versucht. In meinem Fall Ergebnis für:

<?php echo md5(file_get_contents("1.php")) ?>
<br/>
<?php echo md5_file("1.php") ?>

Ausgabe produzieren als:

660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2 

Was auf beiden Linien gleichwertig erscheint.

1185860cookie-checkIst md5(file_contents_as_string) gleich md5_file(/path/to/file)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy