El código que expones no puede devolver true, te falla algo o no incluyes todos los detalles.
$pdb = '$2a$07$yMoJrJpwEPrmVnZx4KIyNuOAiOMQksjkV1EW0YRgVe33eYe/yT60y';
$pdg = crypt('micontraseña',$pdb);
echo $pdb,PHP_EOL,$pdg,PHP_EOL;
Resultado$2a$07$yMoJrJpwEPrmVnZx4KIyNuOAiOMQksjkV1EW0YRgVe33eYe/yT60y
$2a$07$yMoJrJpwEPrmVnZx4KIyNu0VIclLyka7I/M.Wee2RHTZS2YZUlEpy
bool(false)
Sin embargo,
si, se hace un mal uso... y dependiendo de la versión de PHP, igual puede llegar a coincidir. En este caso se hace mal uso porque suministras como
salt el código generado previamente y usas ese mismo código para hacer la comprobación..
Siempre haz de dar un uso correcto de crypt(). Ademas, debes asegurarte de que el salt es seguro y aleatorio.
http://php.net/manual/en/function.crypt.phpEjemplo de blowfish.$password = 'micontraseña';
$hash = crypt($password,'$2y$07$'.$salt.'$'); //$2a$07$b5abbc0b1842efadeec68uyB3irC.LfyTkWhkJwbMmD0SymXmsfrO
Pero en otro lugar han afirmado que es muy inseguro y que lo mejor es usar bcrypt
El uso de algoritmos tipo bcrypt se considera "mas seguro", porque a diferencia de algoritmos como md5,sha1,sha512 etc.. blowfish esta hecho para tardar. Tiene lo que se llama factor de dificultad.
Para que veas la diferencia BLOWFISH 2Y vs SHA512 (los dos con el mismo salt)
$hash1 = crypt($password,'$2y$12$'.$salt.'$'); echo 'Blowfish: ',(microtime(true)-$time),PHP_EOL
;
$hash2 = crypt($password,'$6$'.$salt); echo 'SHA512: ',(microtime(true)-$time),PHP_EOL
;
ResultadoBlowfish: 0.32424879074097
SHA512: 0.0095410346984863
La idea es que el algoritmo tarda mas en generar la llave y por tanto aumenta significativamente el tiempo que tomaría realizar un ataque de fuerza bruta. No importa cual grande es SHA512 o SHA256.. si están hechos para velocidad (fueron pensados para comprobar la consistencia de archivos, no para hashear contraseñas xD), no se les considera aptos para este trabajo.
Como nota, dejare que
crypt() para SHA256 y SHA512 soporta el parámetro rounds dentro del salt. El valor por defecto es de 5000 (con el que fue hecho el ejemplo).. haría falta ponerlo en mas de 100.000 para que alcance el factor de dificultad 12 de BLOWFISH xD.
crypt($password,'$6$rounds=150000$'.$salt);
PD: Temas sobre PHP van al subforo de
PHP.
PD2: Siempre usa
=== para comparar strings.
Saludos