Sto usando crypt()
in password hash in PHP e sto cercando di elaborare il modo più sicuro di testare l'uguaglianza dell'hash risultante durante l'esecuzione di controlli password .strcmp vs. == vs. === in PHP per il controllo dell'uguaglianza hash
ci sono tre opzioni che posso vedere:
Opzione 1 - Doppia Equals
function checkPassword($hash, $password)
{
return crypt($password, $hash) == $hash;
}
Opzione 2 - Triple Equals
function checkPassword($hash, $password)
{
return crypt($password, $hash) === $hash;
}
Opzione 3-strcmp()
function checkPassword($hash, $password)
{
return strcmp(crypt($password, $hash), $hash) === 0;
}
Il mio intuito mi dice che l'opzione 1 è una cattiva idea, a causa della mancanza di controllo del tipo, e che le opzioni 2 o 3 sono probabilmente migliori. Tuttavia, non riesco a capire se c'è un caso specifico che ===
o strcmp
non riuscirebbe. Quale è più sicuro per questo scopo?
Leggilo: http://raz0r.name/vulnerabilities/simple-machines-forum/ – user956584
@Userpassword Bug interessante! Mi chiedo come PHP gestisca stringhe come '$ 2a $ 10 $ ... $' quando le cast come numeri ... – Polynomial
Se vuoi semplicemente confrontare gli hash in modo affidabile, usa semplicemente '==='. Se ti preoccupi veramente della sicurezza e dei potenziali attacchi temporali (anche a dispetto del jitter di rete), dovresti dare un'occhiata a [questo] (https://github.com/delight-im/Faceless/issues/4) o [this] (https://github.com/delight-im/Faceless/pull/5) discussione o utilizzare la funzione 'hash_equals()' (PHP 5.6+). – caw