Skip to content

Salted Hash-Generator

Gerade in neueren Internet-Applikationen begegnet man immer wieder sogenannten "gesalzenen Passwörtern". Doch was ist das? Salted Hashes sind im Prinzip zwei gehashte Werte, die zusammengekettet werden und anschließend noch einmal gehasht werden.

Der erste Wert ist meistens das Passwort, der zweite Wert ein zufällig genertierter.
Wie solch ein Generator funktioniert, wird mit diesem Tutorial demonstriert.

function generatePasswd ($length = 8, $salt = 12)
  {
    $pwd = '';
    $md5 = array ();
    $sha1 = array ();

    // Alle ASCII-Zeichen
    $chars = array ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
            'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

    // Zufällig ein Zeichen gross schreiben
    for ($i = 0, $size = count ($chars) -1; $i< $size; ++$i)
    {
      $rand = mt_rand (0, 1);

      if ($rand == 1)
      {
        $chars[$i] = strtoupper ($chars[$i]);
      }
    }

    $numbers = array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

    // Sonderzeichen einbinden
    $specialChrs = array ('!', '§', '$', '%', '&', '-', '_', ',', ';', ':', '.',
                          '@', '#', '*', '+', '~');

    // ASCII-Zeichenarray mit dem der Sonderzeichen zusammenfuehren
    $pwdChrs = array_merge ($chars, $numbers, $specialChrs);

    // Passwort mit Laenge $length zusammensetzen
    for ($i = 0; $i< $length; ++$i)
    {
      $rndChr = mt_rand (0, count ($pwdChrs) -1);
      $pwd .= $pwdChrs[$rndChr];

      // Entferne gesetztes Zeichen um doppelte Vorkommen zu vermeiden
      unset ($pwdChrs[$rndChr]);
    }

    $saltIndex = uniqid ('', time () );

    // Salted MD5-Hash
    $md5['hash'] = md5 ($pwd);
    $md5['salt'] = substr (md5 ($saltIndex), 0, $salt);
    $md5['salted'] = md5 ($md5['hash'].$md5['salt']);

    // Salted SHA1-Hash
    $sha1['hash'] = sha1 ($pwd);
    $sha1['salt'] = substr (sha1 ($saltIndex), 0, $salt);
    $sha1['salted'] = sha1 ($sha1['hash'].$sha1['salt']);

    return array ($pwd, $md5, $sha1);
  }

  $passwd = generatePasswd ();


Klartext:<?php echo $passwd[0] ?><hr />
MD5:<?php echo $passwd[1]['hash'] ?><br />
Salt:<?php echo $passwd[1]['salt'] ?><br />
Salted MD5:<?php echo $passwd[1]['salted'] ?><hr />
SHA1:<?php echo $passwd[2]['hash'] ?><br />
Salt:<?php echo $passwd[2]['salt'] ?><br />
Salted SHA1:<?php echo $passwd[2]['salted'] ?><hr />
 


Die Funktion "generatePasswd" besitzt zwei Parameter, welche jedoch optional sind: $length bestimmt die Länge des Passworts, $salt bestimmt die Länge des Salt-Wertes.
Das Array $chars beinhaltet das Standardalphabet, das in jedem ASCII-Zeichensatz auftaucht, $numbers beinhaltet alle Zahlen von 0 bis 9 und $specialChrs enthält einige Sonderzeichen, die für ein Passwort geeignet sind.

In der ersten for ()-Schleife wird das $chars-Array durchlaufen und zufällig werden einige Zeichen in Großbuchstaben konvertiert.
Nun werden die drei Zeichen-Arrays zu einem gemeinsamen Array zusammengesetzt.
In der zweiten for ()-Schleife wird das Passwort aus dem gemeinsamen Array zufällig zusammengesetzt. Beispielsweiße könnte nun der Wert "fT53%-:" herauskommen.

Nun beginnt der eigentliche Hash-Vorgang: Ein zufälliger Wert wird mit der Funktion uniqid () und time () erstellt und in der Variable $saltIndex gespeichert.
Im Array $md5 wird der Schlüssel "hash" mit den normalen MD5-Hash des Passworts gespeichert. Im Schlüssel "salt" befindet sich der gehashte Salt, welcher aus die Länge getrimmt wird, die im Funktionskopf im Parameter $salt gesetzt wurde.
Der eigentliche gesalzene Hash befindet sich im Schlüssel "salted". Dort werden die Schlüssel "hash" und "salt" (die ja bereits gehasht sind) verkettet und anschließend noch einmal gehasht.
Analog funktoniert das mit dem SHA1-Teil.
So ergibt sich selbst bei zwei identischen Passwörtern immer ein anderer End-Hash. Jedoch sollte, damit der End-Hash zu einem Login funktioniert, der reine gehashte Salt, also der Schlüssel "salt" irgendwo gespeichert werden, z.B. in einer Datenbank, da dieser schließlich zum Berechnen des korrekten Hash-Wertes benötigt wird.


----

Quelle: Scripting-Base
Die Quelle beinhaltet nur noch ein Portfolio, die ursprünglichen Tutorials sind dort nicht mehr zu finden.

MD5-Hashwerte von Dateien errechnen

Es gibt mehrere Möglichkeiten dies mit PHP zu bewerkstelligen.

Die gängigste Methode ist der MD5-Hashwert ermitteln, dies ist ein 32 Zeichen langer String mit alphnumerischen Zeichen.
Dabei ist es egal, wie lange der eingegebene Wert ist, die Ausgabe sind immer 32 Zeichen,
außerdem ist eine Rückwandlung nicht möglich, d.h. wird der Wert einmal umgewandelt kann der Ursprungswert nicht
wiederhergestellt werden, die einzige Möglichkeit wäre die Bruteforce-Methode (ausprobieren :-D ).

Also um den Hashwert einer Datei zu ermitteln gibt es in PHP eine Funktion:

echo md5_file ( 'datei.php' );


Dies ist die MD5-Summe der Datei datei.php aus.

Zum besseren Verständnis, wie die Funktion funktioniert hier eine alternativ Funktion (dient nur zum Verständnis):

function md5summe ( $datei )
{
  $fp = fopen ( $datei , 'r' );
  $dateiinhalt = fread ( $fp , filesize ( $datei ) );
  fclose ( $fp );

  $md5summe = md5 ( $dateiinhalt );
  return $md5summe;
}

echo md5summe ( 'datei.php' );


Diese Funktion liefert das gleiche Ergebnis, wie die obere Funktion, wie bereits erwähnt, sollte diese Funktion nicht verwendet werden,
da es ja bereits eine eingebettet Funktion gibt, die schneller läuft.