I'm using crypt()
to hash passwords in PHP, and am trying to work out the safest way of testing equality of the resulting hash when performing password checks.
There are three options that I can see:
Option 1 - Double Equals
function checkPassword($hash, $password)
{
return crypt($password, $hash) == $hash;
}
Option 2 - Triple Equals
function checkPassword($hash, $password)
{
return crypt($password, $hash) === $hash;
}
Option 3 - strcmp()
function checkPassword($hash, $password)
{
return strcmp(crypt($password, $hash), $hash) === 0;
}
My intuition tells me that option 1 is a bad idea, due to the lack of type checking, and that options 2 or 3 are likely to be better. However, I can't work out if there's a specific case that ===
or strcmp
would fail under. Which is safest for this purpose?
$2a$10$...$
when cast as numbers... – Heartland===
. If you really care about security and potential timing attacks (even despite of network jitter), you should take a look at this or this discussion or use thehash_equals()
function (PHP 5.6+). – Senior