I have read the information provided on the PHP Manual Entry for crypt()
, but I find myself still unsure of the format for a salt to trigger the Blowfish algorithm.
According manual entry, I should use '$2$' or '$2a$' as the start of a 16 character string. However, in the example given later, they use a much longer string: '$2a$07$usesomesillystringforsalt$
', which indicates to me that whatever string I provide will be sliced and diced to fit the model.
The problem I am encountering is actually triggering the Blowfish algo vs STD_DES
. Example:
$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt);
// $hash = $26HdMTpoODt6
That hash is obviously not whirlpool, and is in fact STD_DES
with only the first two characters of the salt being used for the salt. However, in the PHP Manual's example, their salt starts with '$2a$07$
', so if I add those three characters to the same code I get the following:
$foo = 'foo';
$salt = '$2a$' . hash('whirlpool', $foo); // 128 characters, will be truncated
$hash = crypt($foo, $salt);
// $hash = $2a$07$b1b2ee48991281a439da2OHi1vZF8Z2zIA.8njYZKR.9iBehxLoIC
I've noticed I can provide some variance in the characters which are here shown as '07$
', for example 04$
and 15$
both work, but 01$
through 03$
don't work (generates a blank string), and values such as 99$
and 85$
cause it to revert to STD_DES
again.
The Question:
What is the significance of those three characters following the '$2a$
' string which, as I am lead to believe by the manual, instruct the crypt function to use the blowfish method.
According to the manual, '$2a$
' should be enough to instruct crypt()
to use the blowfish method; what, then, is the significance of the following three characters? What then, is the correct format for a salt, if these three characters are so significant?
See Question&Answers more detail:
os