Sicherer Hash

ZodiacXP

Erfahrenes Mitglied
Hallo.

Wieder mal eine Diskussion über eine Funktion von mir.

Arbeite langsam auf einen eigenen Hash-Algo hin und hatte zwischendurch die Idee, die aktuellen "sicherer" zu machen. Seht euch bitte den Code an, meine kläglichen Kommentare ;) und übt ein bisschen Kritik dran. Würd mich freuen.

Es ist eine Methode aus einer Klasse - sie ist der Algo für einen sicheren Hash:
PHP:
// $this->sSalt :
$sSalt = "Irgendeine_Zeichenkette";

// $s : Der Text aus dem der Hash werden soll
// $iLevel : als Sicherheitslevel gedacht
public function Hash($s, $iLevel = 3)
{
  $iLevel += 1;
  // Abwechselnd einen Hash-Algo verwenden
  while (--$iLevel)
  {
    if ($iLevel & 1) $s = md5($s);
    else $s = sha1($s);
  }
  // bei der While-Schleife wird zuletzt IMMER md5 angewandt

  // Basis des Zahlensystems bestimmen
  $base = strlen($this->sSalt);

  // Anzahl der "Ziffern" im neuen Zahlensystem zum darstellen von Dezimal(256)
  $cipher = ceil(log(256, $base));

  // MD5-Hexwert in 8bit Stücken (2 Hex-Ziffern) durchlaufen von hinten nach vorn
  for ($i = 30; $i != -2; $i -= 2)
  {
    // Aktuelle Hex-Zahl als Dezimale
    $k = hexdec(substr($s, $i, 2));
    // Temporärer String für aktuelle Zahl
    $tmp = "";
    // Umwandlung in eigenes Zahlensystem nach üblichen Schema
    while ($k != 0)
    {
      $rest = $k % $base; // restdivision
      $tmp = substr($this->sSalt, $rest, 1) . $tmp; // rest vorne dran
      $k = floor($k/$base); // mit ganzzahligem ergebnis weitermachen
    }
    // Umwandlung zuende - fehlende Stellen auffüllen
    $r = str_repeat($this->sSalt[0], $cipher - strlen($tmp)) . $tmp . $r;
  }

  return $r;
}

Wenn man den "Salt" groß genug wählt und sich kein Zeichen wiederholt ist es sehr schwer Rainbowtables oder ähnliches für dieses Hash-Verfahren zu erstellen.
Man muss aber diesen "Salt" gut schützen und nicht folgendes Wählen:
"0123456789ABCDEF", weil man damit den üblichen md5-wert erhält.
Zudem müsste jemand der den Salt kennt und z.B. wirklich irgendwie an eine Passworttabelle drangekommen ist eine Rainbow-Tabelle komplett neu erstellen.

Bin mal auf ein paar Meinungen gespannt.
 
Zuletzt bearbeitet:
Ich sehe bei deinem Hash-Algorithmus keinen wirklichen Nutzen. Denn einerseits wird ein Salt und die Angabe einer „Sicherheitsstufe“ benötigt. Andererseits sind genau diese die Schwachstelle deines Hash-Algorithmus.
 
Deswegen sollte man diese Angaben ja so gut wie möglich schützen.
Solange jemand nur die Datenbank hat sind die Daten absolut nutzlos, da er Jahre braucht um den richtigen Salt zu finden und dann noch mal so lang um die Passwörter zu knacken. Bis dahin ist er ein alter Mann.
Das Script noch in einem include-Pfad anlegen an den man über FTP oder ähnliches nicht dran kommt.
 
Ich sehe in der Funktion auch keine notwendige und überaus durchdrigende Innovation.
Natürlich erhöht es die Sicherheit alles nochmal 5 mal durch div. math. Funktionen zu jagen damit Passwörter sicher sind wenn jemand nur Zugriff auf die Datenbank hat.

Aber warum reicht da nicht zum Beispiel:
PHP:
$pass = "mein_passwort";
$salt = "ich_tipp_mal_wild_auf_der_tastatur___skbf239()§)'(fhPÜ*nb9oefb9§(§($/asaHAI";

$saltPass = md5($salt . $pass . $salt);
Wäre deutlich weniger Aufwand, ist ein Einzeiler und benötigt nur 2 Stringverkettungen und 1x die MD5 Funktion.
Ich weiss zwar nicht, wie lange man dafür brauch bis man es geknackt hat, aber bis dahin sollten andere Mechanismen greifen, die das User PW absichern. Zum Beispiel das der User alle X Monate sein Passwort ändern muss.
 
Zurück