Comparer les mots de passe avec crypt () en PHP

J'ai besoin d'obtenir les notions de base de cette fonction. L'php.net états de documentation, pour l'algorithme blowfish, que:

Blowfish hachage avec un sel comme suit: "$2a$", deux chiffres coût de paramètre, "$", et 22 de la base de 64 chiffres de l'alphabet "./0-9A-Za-z". En utilisant des caractères en dehors de cette plage dans le sel sera la cause de crypt() pour renvoyer une chaîne de longueur nulle

Donc, par définition, ne devraient pas travailler:

echo crypt('rasmuslerdorf', '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringforsalt$');

Cependant, il crache:

$2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e

Où il semble que crypt() a réduit le sel lui-même à une longueur de 22. Quelqu'un pourrait m'expliquer pourquoi?

Un autre aspect de cette fonction, je ne peux pas obtenir ma tête autour de est lorsqu'ils utilisent crypt() pour comparer les mots de passe. http://php.net/manual/en/function.crypt.php (voir ex. #1). Est-ce à dire que si j'utilise le même sel pour tout le cryptage de tous mes mots de passe, j'ai de la crypte il en premier? c'est à dire:

$salt = "usesomadasdsadsadsadae";
$salt_crypt = crypt($salt);

if (crypt($user_input, $salt) == $password) {
   //FAIL WONT WORK
}

if (crypt($user_input, $salt_crypt) == $password) {
   //I HAVE TO DO THIS?
}    

Merci pour votre temps

source d'informationauteur soren.qvist