PHP Determina se un hash della password esistente può essere aggiornato ad un algoritmo più forte


Esempio

Se stai utilizzando il metodo PASSWORD_DEFAULT per consentire al sistema di scegliere l'algoritmo migliore per l'hash delle tue password, poiché l'impostazione predefinita aumenta di intensità, potresti voler ripetere le vecchie password quando gli utenti accedono

<?php
// first determine if a supplied password is valid
if (password_verify($plaintextPassword, $hashedPassword)) {

    // now determine if the existing hash was created with an algorithm that is
    // no longer the default
    if (password_needs_rehash($hashedPassword, PASSWORD_DEFAULT)) {

        // create a new hash with the new default
        $newHashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT);

        // and then save it to your data store
        //$db->update(...);
    }
}
?>

Se le funzioni password_ * non sono disponibili sul sistema (e non è possibile utilizzare il pacchetto di compatibilità collegato nelle osservazioni seguenti), è possibile determinare l'algoritmo e utilizzare per creare l'hash originale in un metodo simile al seguente:

<?php
if (substr($hashedPassword, 0, 4) == '$2y$' && strlen($hashedPassword) == 60) {
    echo 'Algorithm is Bcrypt';
    // the "cost" determines how strong this version of Bcrypt is
    preg_match('/\$2y\$(\d+)\$/', $hashedPassword, $matches);
    $cost = $matches[1];
    echo 'Bcrypt cost is '.$cost;
}
?>