Sto usando Blowfish con PHP crypt () per l'hashing delle password ma ho notato qualcosa di strano. Citando la documentazione PHP:
CRYPT_BLOWFISH - Blowfish hashing with a salt as follows: "$2a$", "$2x$" or "$2y$", a two digit cost parameter, "$", and 22 digits from the alphabet "./0-9A-Za-z".
Ho notato che il sale che viene incluso nell'hash finale è di 1 carattere breve (l'ultimo è tagliato) come se il sale fosse troppo lungo, ma non è così.
Esempio di output di script:
Salt: 97504ebb48c4619f820f83 with length 22
Blowfish: $2a$13$97504ebb48c4619f820f8u4QTtlV5MoqHt9l7hmK4jEohUXrI.0PK
Hash match.
Come puoi vedere, il sale casuale ha esattamente 22 cifre, ma il '3' manca nell'hash finale. Se faccio il sal solo 21 caratteri ottengo un hash corrotto e non funziona. Quindi, perché taglia l'ultimo carattere?
Gli esempi sul manuale PHP aggiungono anche un $ finale al sale casuale. È $ lì per una ragione o lo hanno semplicemente aggiunto in modo casuale a Blowfish, SHA-256 e SHA-512 per confondere tutti?
E infine, questo è il mio codice:
if (CRYPT_BLOWFISH == 1) {
$salt = md5(uniqid(rand(), TRUE));
$salt = substr($salt, 0, 22);
echo "Salt: " . $salt . " with length " . strlen($salt) . "<br />";
$pass = "rasmuslerdorf";
$bsalt = "$2a$13$".$salt;
$blowfish=crypt($pass, $bsalt);
echo 'Blowfish: ' . $blowfish . "<br />";
if (crypt($pass, $blowfish) == $blowfish) {
echo "Hash match.<br />";
}
else echo "no<br />";
}
else {
exit("You need php 5.3 or newer");
}