Warum erzeugt crypt () unterschiedliche Ergebnisse?

Crypt generiert verschiedene Hashes mit denselben Eingabedaten und der [folgende] zuvor funktionierende Hash-Generator / Check funktioniert nicht mehr für die Authentifizierung von Benutzern:

public static function blowfish($password, $storedpass = false) {
    //if encrypted data is passed, check it against input ($info) 
      if ($storedpass) { 
            if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
                return true; 
            }  else { 
                return false; 
            } 
      }  else { 
          //make a salt and hash it with input, and add salt to end 
          $salt = ""; 
          for ($i = 0; $i < 22; $i++) { 
            $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          } 
          //return 82 char string (60 char hash & 22 char salt) 
          return crypt($password, "$2y$08$".$salt).$salt; 
     }
}

Ich stoße meinen Kopf gegen die Wand und habe keine Antwort auf die Unterschiede zwischen den internen Algorithmen von Zend und den Algorithmen von PHP und Betriebssystem gefunden. oder Variationen zwischen PHP 5.3.8 und früheren ...

EDIT: Meine Frage ist technisch beantwortet und es ist meine Schuld, dass ich nicht richtig gefragt habe. Ich habe implementiert:

$salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
          //for ($i = 0; $i < 22; $i++) { 
            //$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          //} 

Meine eigentliche Frage ist: Warum kehren die folgenden Funktionen anders zurück?

print(substr($storedpass, 0, 60)."<br />");

Rückgabe: $ 2y $ 08 $ 43f053b1538df81054d4cOJyrO5 / j7NtZBCw6LrFof29cLBs7giK6

print(crypt($password, "$2a$08$".substr($storedpass, 60)));

Rückgabe: $ 2a $ 08 $ 43f053b1538df81054d4cOPSGh / LMc0PZx6RC6PlXOSc61BKq / F6.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage