Henry: Gibt es einen Unterschied? md5_file vs. hash_file('md5')

Hallo,

Wollte nur aus Neugierde mal wissen ob es intern in den PHPprozeduren einen Unterschied zwischen hash_file('md5',...) und md5_file(..) gibt, denn weder im Ergebnis noch in der Ausführungszeit unterscheiden sich beide.

Gruss
Henry

  1. Tach!

    Wollte nur aus Neugierde mal wissen ob es intern in den PHPprozeduren einen Unterschied zwischen hash_file('md5',...) und md5_file(..) gibt, denn weder im Ergebnis noch in der Ausführungszeit unterscheiden sich beide.

    Da darf es keinen Unterschied geben. Wenn du etwas durch ein bestimmtes Hash-Verfahren schickst, muss immer dasselbe Ergebnis rauskommen, egal wie es implementiert ist, und egal in welcher Form es daherkommt.

    MD5 sollte aber nicht mehr verwendet werden für Dinge, die wichtig sind. Da gibt es mittlerweile ein Verfahren, um Kollisionen zu erzeugen, also etwas anderes mit demselben Hash zu produzieren.

    dedlfix.

    Folgende Beiträge verweisen auf diesen Beitrag:

    • hash_file() gibt es seit PHP 5.1.2
    • md5_file() gibt es seit PHP 4.2.0

    Ich würde jetzt vermuten, dass md5_file( $file, false ) lediglich ein Aufruf von hash_file('md5', $file, false) ist und letztendlich dann hash('md5', file_get_contents( $file), false ) aufgerufen wird.

    Tipp:

    hash_file() ist flexibler:

    in einem Skript könnte das so aussehen: ( Die Datei $file wird nur neu geschrieben, wenn sich $_POST['text'] von bisherigen Inhalt unterscheidet )

    
    define ('HashMethod', setHashMethod() );
    
    if ( 
          ( ! is_file( $file ) )  
          or hash_file( HashMethod, $file ) != hash( HashMethod, $_POST['text']
       ) {
        file_put_contents( $file, $_POST['text'], LOCK_EX );
    }
    
    
    function setHashMethod ()
        $prefered_hash_methods = array( 'sha256', 'md5' );
        foreach ( $prefered_hash_methods as $method ) {
            if ( in_array $method ) {
               return $method;
            }
        }
        trigger_error ( 'Fatal: Keine der Hashmethoden (Vorgabe: ' . implode(', ', $prefered_hash_methods) . ' ) wählbar!', E_USER_ERROR);
    

    Ergänzung zu dedlfix:

    Möglicherweise gibt irgendein extern durchgeführtes Hash-Programm für den gleichen Inhalt nicht etwas wie

    '2a0973908ffa44eb4a01ad5729298cdd'
    

    also die hexadezimale Repräsentierung des eigentlich binären Hashes zurück, sondern etwas wie

    'CYkezTbdXcqKGFinQxI0ww=='
    

    (die Base-64-codierte Repräsentierung). Dann ist

    $hash = base64encode( hash( $method, $blob, true ) );
    

    bzw.

    $hash = base64encode( hash_file( $method, $file, true ) );
    

    für den Vergleich verwendbar.

    Ein binärer Hash sieht in einer Konsole etwa so aus: ?h��뻳u�a��iK=� Ein solcher kann das Terminal aber "zerstören" (nicht immer mit reset behebbar); ebenso kann es dazu kommen, dass andere, nicht binär-sichere Programme "in nicht beabsichtigter Weise" reagieren weshalb regelmäßig die Darstellung und Ausgabe als hexadezimale Repräsentierung bzw. Base-64-kodierter Blob verwendet werden.